@hed-hog/core 0.0.387 → 0.0.390
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 +12 -11
- package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
- package/dist/access-log/access-log.interceptor.js +4 -2
- package/dist/access-log/access-log.interceptor.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 +7 -16
- package/dist/ai/ai.controller.d.ts.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 +63 -12
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +215 -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/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-instruction/ai-instruction.controller.d.ts +61 -7
- 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 +24 -9
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.controller.js +49 -21
- package/dist/auth/auth.controller.js.map +1 -1
- package/dist/auth/auth.service.d.ts +33 -8
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +78 -29
- package/dist/auth/auth.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 +16 -7
- package/dist/challenge/challenge.service.d.ts.map +1 -1
- package/dist/challenge/challenge.service.js +64 -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 +29 -2
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +15 -15
- package/dist/dashboard/dashboard/dashboard.service.d.ts +15 -15
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +6 -6
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +6 -6
- 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 +1 -1
- package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +1 -1
- 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.service.d.ts +6 -0
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +44 -4
- package/dist/file/file.service.js.map +1 -1
- 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 +26 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -0
- package/dist/index.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 +9 -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 +13 -1
- package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +20 -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 +128 -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 +4 -2
- package/dist/language/pt.json +4 -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 +7 -0
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js +10 -0
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.controller.d.ts +4 -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.service.d.ts +23 -2
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +102 -13
- package/dist/mail/mail.service.js.map +1 -1
- 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/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/menu/menu.controller.d.ts +3 -3
- package/dist/menu/menu.service.d.ts +3 -3
- 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/pdf/pdf.service.d.ts +8 -0
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +52 -0
- 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 +21 -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 +30 -18
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +113 -37
- 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 +140 -0
- package/dist/redis/redis-pubsub.js.map +1 -0
- package/dist/role/role.controller.d.ts +3 -3
- package/dist/role/role.service.d.ts +3 -3
- 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.service.d.ts +8 -5
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +25 -1
- package/dist/setting/setting.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 +17 -5
- 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 +28 -6
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +204 -13
- package/dist/user/user.service.js.map +1 -1
- 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/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 +16 -0
- package/hedhog/data/mail.yaml +88 -61
- package/hedhog/data/mail_layout.yaml +188 -0
- package/hedhog/data/menu.yaml +67 -3
- package/hedhog/data/route.yaml +135 -0
- package/hedhog/data/setting_group.yaml +139 -1
- package/hedhog/frontend/app/account/components/mfa-setup-dialog.tsx.ejs +36 -0
- package/hedhog/frontend/app/account/components/two-factor-auth.tsx.ejs +2 -0
- package/hedhog/frontend/app/account/hooks/use-mfa-setup.ts.ejs +10 -7
- 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.tsx.ejs +51 -4
- 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/template/page.tsx.ejs +155 -121
- 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/page.tsx.ejs +119 -13
- package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +231 -0
- package/hedhog/frontend/app/users/user-mails.tsx.ejs +399 -0
- package/hedhog/frontend/app/users/user-sheet.tsx.ejs +60 -75
- package/hedhog/frontend/messages/en.json +499 -3
- package/hedhog/frontend/messages/pt.json +499 -3
- package/hedhog/table/ai_agent.yaml +1 -0
- package/hedhog/table/ai_instruction.yaml +15 -0
- package/hedhog/table/leaked_password.yaml +18 -0
- package/hedhog/table/mail_layout.yaml +35 -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_presence.yaml +36 -0
- package/package.json +8 -4
- package/src/access-log/access-log.interceptor.ts +4 -2
- package/src/ai/ai-attachment.fragments.spec.ts +319 -0
- package/src/ai/ai-attachment.fragments.ts +35 -0
- package/src/ai/ai.prompts.ts +38 -0
- package/src/ai/ai.service.spec.ts +280 -0
- package/src/ai/ai.service.ts +338 -82
- package/src/ai/dto/chat.dto.ts +33 -3
- package/src/ai/dto/create-agent.dto.ts +2 -2
- package/src/ai/dto/update-agent.dto.ts +2 -2
- 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 +31 -5
- package/src/auth/auth.service.spec.ts +3 -1
- package/src/auth/auth.service.ts +101 -36
- 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 +39 -4
- package/src/challenge/challenge.service.ts +72 -17
- package/src/core.module.ts +27 -1
- package/src/file/file.service.spec.ts +105 -0
- package/src/file/file.service.ts +60 -3
- 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 +37 -0
- 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 +9 -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 +40 -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 +161 -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 +4 -2
- package/src/language/pt.json +4 -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 +14 -1
- package/src/mail/mail-template.spec.ts +197 -0
- package/src/mail/mail.controller.ts +9 -2
- package/src/mail/mail.service.spec.ts +116 -1
- package/src/mail/mail.service.ts +118 -12
- 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/mcp-chat/mcp-chat.service.spec.ts +236 -0
- package/src/mcp-chat/mcp-chat.service.ts +122 -26
- 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/pdf/pdf.service.ts +75 -0
- 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 +138 -38
- 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 +179 -0
- package/src/setting/dto/create.dto.ts +13 -2
- package/src/setting/setting.service.spec.ts +56 -0
- package/src/setting/setting.service.ts +29 -1
- 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 +153 -0
- package/src/user/user.service.ts +255 -12
- package/src/validators/is-strong-password-with-settings.validator.ts +12 -0
- package/src/validators/service-locator.ts +15 -0
- package/src/whatsapp-sender/whatsapp-sender.module.ts +10 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +313 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import * as jwt from 'jsonwebtoken';
|
|
2
|
+
import {
|
|
3
|
+
describeHttpError,
|
|
4
|
+
fail,
|
|
5
|
+
pass,
|
|
6
|
+
probeJson,
|
|
7
|
+
requireFields,
|
|
8
|
+
str,
|
|
9
|
+
} from './http-probe';
|
|
10
|
+
import { IntegrationTester } from './integration-tester.types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Testadores dos providers de OAuth.
|
|
14
|
+
*
|
|
15
|
+
* Um login OAuth completo exige um usuário real no navegador, então não dá para
|
|
16
|
+
* reproduzi-lo aqui. O que dá para provar — e é o que erra na prática — são as
|
|
17
|
+
* credenciais do aplicativo: mandamos ao endpoint de token um código propositalmente
|
|
18
|
+
* inválido e lemos QUAL erro volta.
|
|
19
|
+
*
|
|
20
|
+
* invalid_client → client_id/client_secret errados → REPROVA
|
|
21
|
+
* invalid_grant → credenciais aceitas, só o código é falso (era o esperado) → APROVA
|
|
22
|
+
*
|
|
23
|
+
* Onde o provider suporta `client_credentials` (Facebook, Microsoft), usamos isso:
|
|
24
|
+
* é uma prova direta, sem inferência.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/** Código propositalmente inválido usado nas trocas de token. */
|
|
28
|
+
const PROBE_CODE = 'hedhog-connection-test';
|
|
29
|
+
|
|
30
|
+
const googleOAuthTester: IntegrationTester = {
|
|
31
|
+
providerSlug: 'google-oauth',
|
|
32
|
+
test: async (config, ctx) => {
|
|
33
|
+
const missing = requireFields(config, [
|
|
34
|
+
['client_id', 'Client ID'],
|
|
35
|
+
['client_secret', 'Client secret'],
|
|
36
|
+
]);
|
|
37
|
+
if (missing) return missing;
|
|
38
|
+
|
|
39
|
+
const result = await probeJson(
|
|
40
|
+
'https://oauth2.googleapis.com/token',
|
|
41
|
+
{
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
44
|
+
body: new URLSearchParams({
|
|
45
|
+
client_id: str(config, 'client_id'),
|
|
46
|
+
client_secret: String(config.client_secret ?? ''),
|
|
47
|
+
code: PROBE_CODE,
|
|
48
|
+
grant_type: 'authorization_code',
|
|
49
|
+
redirect_uri: 'https://localhost/hedhog-connection-test',
|
|
50
|
+
}).toString(),
|
|
51
|
+
},
|
|
52
|
+
ctx.signal,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const code = String(result.body?.error ?? '');
|
|
56
|
+
if (code === 'invalid_client') return fail('Invalid Client ID or Client secret.');
|
|
57
|
+
if (code === 'invalid_grant' || result.ok) {
|
|
58
|
+
return pass('Google accepted the app credentials');
|
|
59
|
+
}
|
|
60
|
+
return fail(describeHttpError(result, 'Google rejected the credentials.'));
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const facebookOAuthTester: IntegrationTester = {
|
|
65
|
+
providerSlug: 'facebook-oauth',
|
|
66
|
+
test: async (config, ctx) => {
|
|
67
|
+
const missing = requireFields(config, [
|
|
68
|
+
['client_id', 'Client ID'],
|
|
69
|
+
['client_secret', 'Client secret'],
|
|
70
|
+
]);
|
|
71
|
+
if (missing) return missing;
|
|
72
|
+
|
|
73
|
+
// O Facebook emite um app token com client_credentials: prova direta.
|
|
74
|
+
const url = `https://graph.facebook.com/oauth/access_token?${new URLSearchParams({
|
|
75
|
+
client_id: str(config, 'client_id'),
|
|
76
|
+
client_secret: String(config.client_secret ?? ''),
|
|
77
|
+
grant_type: 'client_credentials',
|
|
78
|
+
})}`;
|
|
79
|
+
|
|
80
|
+
const result = await probeJson(url, {}, ctx.signal);
|
|
81
|
+
|
|
82
|
+
if (result.ok && result.body?.access_token) {
|
|
83
|
+
return pass(`Facebook app ${str(config, 'client_id')}`);
|
|
84
|
+
}
|
|
85
|
+
return fail(
|
|
86
|
+
describeHttpError(result, 'Invalid Facebook App ID or App Secret.'),
|
|
87
|
+
);
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const githubOAuthTester: IntegrationTester = {
|
|
92
|
+
providerSlug: 'github-oauth',
|
|
93
|
+
test: async (config, ctx) => {
|
|
94
|
+
const missing = requireFields(config, [
|
|
95
|
+
['client_id', 'Client ID'],
|
|
96
|
+
['client_secret', 'Client secret'],
|
|
97
|
+
]);
|
|
98
|
+
if (missing) return missing;
|
|
99
|
+
|
|
100
|
+
const result = await probeJson(
|
|
101
|
+
'https://github.com/login/oauth/access_token',
|
|
102
|
+
{
|
|
103
|
+
method: 'POST',
|
|
104
|
+
headers: {
|
|
105
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
106
|
+
// Sem isso o GitHub responde form-urlencoded.
|
|
107
|
+
Accept: 'application/json',
|
|
108
|
+
},
|
|
109
|
+
body: new URLSearchParams({
|
|
110
|
+
client_id: str(config, 'client_id'),
|
|
111
|
+
client_secret: String(config.client_secret ?? ''),
|
|
112
|
+
code: PROBE_CODE,
|
|
113
|
+
}).toString(),
|
|
114
|
+
},
|
|
115
|
+
ctx.signal,
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const code = String(result.body?.error ?? '');
|
|
119
|
+
if (code === 'incorrect_client_credentials') {
|
|
120
|
+
return fail('Invalid Client ID or Client secret.');
|
|
121
|
+
}
|
|
122
|
+
if (code === 'bad_verification_code' || result.body?.access_token) {
|
|
123
|
+
return pass('GitHub accepted the app credentials');
|
|
124
|
+
}
|
|
125
|
+
return fail(describeHttpError(result, 'GitHub rejected the credentials.'));
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/** Microsoft: `client_credentials` no tenant prova as três credenciais de uma vez. */
|
|
130
|
+
function buildMicrosoftTester(providerSlug: string): IntegrationTester {
|
|
131
|
+
return {
|
|
132
|
+
providerSlug,
|
|
133
|
+
test: async (config, ctx) => {
|
|
134
|
+
const missing = requireFields(config, [
|
|
135
|
+
['client_id', 'Client ID'],
|
|
136
|
+
['client_secret', 'Client secret'],
|
|
137
|
+
]);
|
|
138
|
+
if (missing) return missing;
|
|
139
|
+
|
|
140
|
+
const tenant = str(config, 'tenant_id') || 'common';
|
|
141
|
+
const result = await probeJson(
|
|
142
|
+
`https://login.microsoftonline.com/${encodeURIComponent(tenant)}/oauth2/v2.0/token`,
|
|
143
|
+
{
|
|
144
|
+
method: 'POST',
|
|
145
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
146
|
+
body: new URLSearchParams({
|
|
147
|
+
client_id: str(config, 'client_id'),
|
|
148
|
+
client_secret: String(config.client_secret ?? ''),
|
|
149
|
+
grant_type: 'client_credentials',
|
|
150
|
+
scope: 'https://graph.microsoft.com/.default',
|
|
151
|
+
}).toString(),
|
|
152
|
+
},
|
|
153
|
+
ctx.signal,
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
if (result.ok && result.body?.access_token) {
|
|
157
|
+
return pass(`Microsoft tenant ${tenant}`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Os códigos AADSTS dizem exatamente o que está errado; a mensagem crua da
|
|
161
|
+
// Microsoft vem com correlation id e URL de ajuda, ruído puro para a UI.
|
|
162
|
+
//
|
|
163
|
+
// Casar com fronteira de dígito é obrigatório: um `includes('AADSTS90002')`
|
|
164
|
+
// simples engoliria AADSTS900023, que significa outra coisa.
|
|
165
|
+
const description = String(result.body?.error_description ?? '');
|
|
166
|
+
const hasCode = (code: string) =>
|
|
167
|
+
new RegExp(`${code}(?!\\d)`).test(description);
|
|
168
|
+
|
|
169
|
+
if (hasCode('AADSTS7000215')) {
|
|
170
|
+
return fail('Invalid client secret.');
|
|
171
|
+
}
|
|
172
|
+
if (hasCode('AADSTS7000222')) {
|
|
173
|
+
return fail('The client secret has expired.');
|
|
174
|
+
}
|
|
175
|
+
if (hasCode('AADSTS700016')) {
|
|
176
|
+
return fail(`Application not found in tenant "${tenant}".`);
|
|
177
|
+
}
|
|
178
|
+
// `common` não aceita client_credentials: isso não reprova o app.
|
|
179
|
+
if (tenant === 'common' && hasCode('AADSTS900023')) {
|
|
180
|
+
return pass(
|
|
181
|
+
'Microsoft accepted the app credentials',
|
|
182
|
+
'Fill in the Tenant ID for a full validation.',
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
if (hasCode('AADSTS90002')) {
|
|
186
|
+
return fail(`Tenant "${tenant}" does not exist.`);
|
|
187
|
+
}
|
|
188
|
+
return fail(
|
|
189
|
+
describeHttpError(result, 'Microsoft rejected the credentials.').slice(0, 200),
|
|
190
|
+
);
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const appleOAuthTester: IntegrationTester = {
|
|
196
|
+
providerSlug: 'apple-oauth',
|
|
197
|
+
test: async (config, ctx) => {
|
|
198
|
+
const missing = requireFields(config, [
|
|
199
|
+
['client_id', 'Service ID'],
|
|
200
|
+
['team_id', 'Team ID'],
|
|
201
|
+
['key_id', 'Key ID'],
|
|
202
|
+
['private_key', 'Private key (.p8)'],
|
|
203
|
+
]);
|
|
204
|
+
if (missing) return missing;
|
|
205
|
+
|
|
206
|
+
// A Apple não tem client_secret estático: ele é um JWT ES256 assinado com a .p8.
|
|
207
|
+
// Se a chave não assina, o problema é local e nem precisamos ir à rede.
|
|
208
|
+
let clientSecret: string;
|
|
209
|
+
try {
|
|
210
|
+
const now = Math.floor(Date.now() / 1000);
|
|
211
|
+
clientSecret = jwt.sign(
|
|
212
|
+
{
|
|
213
|
+
iss: str(config, 'team_id'),
|
|
214
|
+
iat: now,
|
|
215
|
+
exp: now + 300,
|
|
216
|
+
aud: 'https://appleid.apple.com',
|
|
217
|
+
sub: str(config, 'client_id'),
|
|
218
|
+
},
|
|
219
|
+
String(config.private_key ?? ''),
|
|
220
|
+
{ algorithm: 'ES256', keyid: str(config, 'key_id') },
|
|
221
|
+
);
|
|
222
|
+
} catch {
|
|
223
|
+
return fail(
|
|
224
|
+
'Could not sign with the private key. Check the .p8 contents, the Key ID and the Team ID.',
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const result = await probeJson(
|
|
229
|
+
'https://appleid.apple.com/auth/token',
|
|
230
|
+
{
|
|
231
|
+
method: 'POST',
|
|
232
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
233
|
+
body: new URLSearchParams({
|
|
234
|
+
client_id: str(config, 'client_id'),
|
|
235
|
+
client_secret: clientSecret,
|
|
236
|
+
code: PROBE_CODE,
|
|
237
|
+
grant_type: 'authorization_code',
|
|
238
|
+
}).toString(),
|
|
239
|
+
},
|
|
240
|
+
ctx.signal,
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
const code = String(result.body?.error ?? '');
|
|
244
|
+
if (code === 'invalid_client') {
|
|
245
|
+
return fail(
|
|
246
|
+
'Apple rejected the credentials. Check the Service ID, Team ID, Key ID and the .p8 key.',
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
if (code === 'invalid_grant' || result.ok) {
|
|
250
|
+
return pass('Apple accepted the signed client secret');
|
|
251
|
+
}
|
|
252
|
+
return fail(describeHttpError(result, 'Apple rejected the credentials.'));
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
const linkedinOAuthTester: IntegrationTester = {
|
|
257
|
+
providerSlug: 'linkedin-oauth',
|
|
258
|
+
test: async (config, ctx) => {
|
|
259
|
+
const missing = requireFields(config, [
|
|
260
|
+
['client_id', 'Client ID'],
|
|
261
|
+
['client_secret', 'Client secret'],
|
|
262
|
+
]);
|
|
263
|
+
if (missing) return missing;
|
|
264
|
+
|
|
265
|
+
const result = await probeJson(
|
|
266
|
+
'https://www.linkedin.com/oauth/v2/accessToken',
|
|
267
|
+
{
|
|
268
|
+
method: 'POST',
|
|
269
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
270
|
+
body: new URLSearchParams({
|
|
271
|
+
client_id: str(config, 'client_id'),
|
|
272
|
+
client_secret: String(config.client_secret ?? ''),
|
|
273
|
+
code: PROBE_CODE,
|
|
274
|
+
grant_type: 'authorization_code',
|
|
275
|
+
redirect_uri: 'https://localhost/hedhog-connection-test',
|
|
276
|
+
}).toString(),
|
|
277
|
+
},
|
|
278
|
+
ctx.signal,
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
const code = String(result.body?.error ?? '');
|
|
282
|
+
const description = String(result.body?.error_description ?? '');
|
|
283
|
+
if (code === 'invalid_client' || /client.*(id|secret)/i.test(description)) {
|
|
284
|
+
return fail('Invalid Client ID or Client secret.');
|
|
285
|
+
}
|
|
286
|
+
if (
|
|
287
|
+
result.ok ||
|
|
288
|
+
/authorization code/i.test(description) ||
|
|
289
|
+
code === 'invalid_request'
|
|
290
|
+
) {
|
|
291
|
+
return pass('LinkedIn accepted the app credentials');
|
|
292
|
+
}
|
|
293
|
+
return fail(describeHttpError(result, 'LinkedIn rejected the credentials.'));
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
export const OAUTH_TESTERS: IntegrationTester[] = [
|
|
298
|
+
googleOAuthTester,
|
|
299
|
+
facebookOAuthTester,
|
|
300
|
+
githubOAuthTester,
|
|
301
|
+
buildMicrosoftTester('microsoft-oauth'),
|
|
302
|
+
buildMicrosoftTester('microsoft-entra-id-oauth'),
|
|
303
|
+
appleOAuthTester,
|
|
304
|
+
linkedinOAuthTester,
|
|
305
|
+
];
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as jwt from 'jsonwebtoken';
|
|
2
|
+
import {
|
|
3
|
+
describeHttpError,
|
|
4
|
+
fail,
|
|
5
|
+
pass,
|
|
6
|
+
probeJson,
|
|
7
|
+
requireFields,
|
|
8
|
+
str,
|
|
9
|
+
} from './http-probe';
|
|
10
|
+
import { IntegrationTester } from './integration-tester.types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Testadores dos gateways de pagamento.
|
|
14
|
+
*
|
|
15
|
+
* Todos usam leitura da conta — nunca criam cobrança, assinatura ou qualquer coisa
|
|
16
|
+
* que apareça no extrato do cliente.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const stripeTester: IntegrationTester = {
|
|
20
|
+
providerSlug: 'stripe',
|
|
21
|
+
test: async (config, ctx) => {
|
|
22
|
+
const missing = requireFields(config, [['secret_key', 'Secret key']]);
|
|
23
|
+
if (missing) return missing;
|
|
24
|
+
|
|
25
|
+
const secretKey = String(config.secret_key ?? '');
|
|
26
|
+
const result = await probeJson(
|
|
27
|
+
'https://api.stripe.com/v1/balance',
|
|
28
|
+
{
|
|
29
|
+
headers: {
|
|
30
|
+
// Stripe usa Basic com a chave como usuário e senha vazia.
|
|
31
|
+
Authorization: `Basic ${Buffer.from(`${secretKey}:`).toString('base64')}`,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
ctx.signal,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
if (result.status === 401) return fail('Invalid Stripe secret key.');
|
|
38
|
+
if (!result.ok) {
|
|
39
|
+
return fail(describeHttpError(result, 'Stripe rejected the credentials.'));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Chave de teste num perfil de produção é o erro clássico — e só aparece quando
|
|
43
|
+
// a primeira cobrança real não acontece.
|
|
44
|
+
const livemode = Boolean(result.body?.livemode);
|
|
45
|
+
const mode = str(config, 'mode').toLowerCase();
|
|
46
|
+
const label = `Stripe — ${livemode ? 'live' : 'test'} mode`;
|
|
47
|
+
|
|
48
|
+
if (mode === 'production' && !livemode) {
|
|
49
|
+
return pass(label, 'This profile is set to production but the key is a test key.');
|
|
50
|
+
}
|
|
51
|
+
if (mode === 'sandbox' && livemode) {
|
|
52
|
+
return pass(label, 'This profile is set to sandbox but the key is a live key.');
|
|
53
|
+
}
|
|
54
|
+
return pass(label);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const mercadoPagoTester: IntegrationTester = {
|
|
59
|
+
providerSlug: 'mercado_pago',
|
|
60
|
+
test: async (config, ctx) => {
|
|
61
|
+
const missing = requireFields(config, [['access_token', 'Access token']]);
|
|
62
|
+
if (missing) return missing;
|
|
63
|
+
|
|
64
|
+
const result = await probeJson(
|
|
65
|
+
'https://api.mercadopago.com/users/me',
|
|
66
|
+
{ headers: { Authorization: `Bearer ${String(config.access_token ?? '')}` } },
|
|
67
|
+
ctx.signal,
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
if (result.status === 401 || result.status === 403) {
|
|
71
|
+
return fail('Invalid Mercado Pago access token.');
|
|
72
|
+
}
|
|
73
|
+
if (!result.ok) {
|
|
74
|
+
return fail(describeHttpError(result, 'Mercado Pago rejected the credentials.'));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const nickname = String(result.body?.nickname ?? '').trim();
|
|
78
|
+
const siteId = String(result.body?.site_id ?? '').trim();
|
|
79
|
+
return pass(
|
|
80
|
+
[nickname, siteId].filter(Boolean).join(' — ') || 'Mercado Pago account',
|
|
81
|
+
);
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const googlePlayTester: IntegrationTester = {
|
|
86
|
+
providerSlug: 'google_play',
|
|
87
|
+
test: async (config, ctx) => {
|
|
88
|
+
const missing = requireFields(config, [['package_name', 'Package name']]);
|
|
89
|
+
if (missing) return missing;
|
|
90
|
+
|
|
91
|
+
// O serviço aceita o JSON completo OU client_email + private_key avulsos.
|
|
92
|
+
let clientEmail = str(config, 'client_email');
|
|
93
|
+
let privateKey = String(config.private_key ?? '');
|
|
94
|
+
|
|
95
|
+
const serviceAccountJson = String(config.service_account_json ?? '').trim();
|
|
96
|
+
if (serviceAccountJson) {
|
|
97
|
+
try {
|
|
98
|
+
const parsed = JSON.parse(serviceAccountJson);
|
|
99
|
+
clientEmail = String(parsed.client_email ?? clientEmail);
|
|
100
|
+
privateKey = String(parsed.private_key ?? privateKey);
|
|
101
|
+
} catch {
|
|
102
|
+
return fail('The service account JSON is not valid JSON.');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (!clientEmail || !privateKey) {
|
|
107
|
+
return fail(
|
|
108
|
+
'Provide the service account JSON, or the client email and private key.',
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// JWT bearer flow: a troca por access token já prova a chave da service account.
|
|
113
|
+
let assertion: string;
|
|
114
|
+
try {
|
|
115
|
+
const now = Math.floor(Date.now() / 1000);
|
|
116
|
+
assertion = jwt.sign(
|
|
117
|
+
{
|
|
118
|
+
iss: clientEmail,
|
|
119
|
+
scope: 'https://www.googleapis.com/auth/androidpublisher',
|
|
120
|
+
aud: 'https://oauth2.googleapis.com/token',
|
|
121
|
+
iat: now,
|
|
122
|
+
exp: now + 300,
|
|
123
|
+
},
|
|
124
|
+
privateKey.replace(/\\n/g, '\n'),
|
|
125
|
+
{ algorithm: 'RS256' },
|
|
126
|
+
);
|
|
127
|
+
} catch {
|
|
128
|
+
return fail('Could not sign with the service account private key.');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const token = await probeJson(
|
|
132
|
+
'https://oauth2.googleapis.com/token',
|
|
133
|
+
{
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
136
|
+
body: new URLSearchParams({
|
|
137
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
|
138
|
+
assertion,
|
|
139
|
+
}).toString(),
|
|
140
|
+
},
|
|
141
|
+
ctx.signal,
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
if (!token.ok || !token.body?.access_token) {
|
|
145
|
+
const description = String(token.body?.error_description ?? '');
|
|
146
|
+
if (/invalid_grant|Invalid JWT/i.test(description)) {
|
|
147
|
+
return fail(
|
|
148
|
+
'Google rejected the service account. Check the client email and the private key.',
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
return fail(describeHttpError(token, 'Google rejected the service account.'));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const packageName = str(config, 'package_name');
|
|
155
|
+
const app = await probeJson(
|
|
156
|
+
`https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${encodeURIComponent(
|
|
157
|
+
packageName,
|
|
158
|
+
)}/inappproducts?maxResults=1`,
|
|
159
|
+
{ headers: { Authorization: `Bearer ${token.body.access_token}` } },
|
|
160
|
+
ctx.signal,
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
// Credencial válida; o vínculo com o app no Play Console é outra configuração,
|
|
164
|
+
// feita no console e não aqui.
|
|
165
|
+
if (app.status === 401 || app.status === 403) {
|
|
166
|
+
return pass(
|
|
167
|
+
`Service account ${clientEmail}`,
|
|
168
|
+
`The service account has no access to "${packageName}" in the Play Console yet.`,
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
if (app.status === 404) {
|
|
172
|
+
return pass(
|
|
173
|
+
`Service account ${clientEmail}`,
|
|
174
|
+
`The app "${packageName}" was not found in this account.`,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
return pass(`${packageName} — ${clientEmail}`);
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export const PAYMENT_TESTERS: IntegrationTester[] = [
|
|
182
|
+
stripeTester,
|
|
183
|
+
mercadoPagoTester,
|
|
184
|
+
googlePlayTester,
|
|
185
|
+
];
|