@hed-hog/core 0.0.399 → 0.0.400
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/dist/ai/ai-agent.sort.d.ts +6 -0
- package/dist/ai/ai-agent.sort.d.ts.map +1 -0
- package/dist/ai/ai-agent.sort.js +21 -0
- package/dist/ai/ai-agent.sort.js.map +1 -0
- package/dist/ai/ai.controller.d.ts +4 -4
- package/dist/ai/ai.service.d.ts +35 -4
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +51 -137
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.js +26 -23
- package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
- package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
- package/dist/ai-instruction/ai-instruction.sort.js +32 -0
- package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
- package/dist/auth/auth.controller.d.ts +24 -8
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +8 -1
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +72 -25
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +41 -4
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/guards/auth.guard.d.ts +3 -1
- package/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +12 -3
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/authorize/authorize.controller.d.ts +29 -5
- package/dist/authorize/authorize.controller.d.ts.map +1 -1
- package/dist/authorize/authorize.controller.js +120 -13
- package/dist/authorize/authorize.controller.js.map +1 -1
- package/dist/authorize/authorize.errors.d.ts +34 -0
- package/dist/authorize/authorize.errors.d.ts.map +1 -0
- package/dist/authorize/authorize.errors.js +37 -0
- package/dist/authorize/authorize.errors.js.map +1 -0
- package/dist/authorize/authorize.module.d.ts.map +1 -1
- package/dist/authorize/authorize.module.js +6 -1
- package/dist/authorize/authorize.module.js.map +1 -1
- package/dist/authorize/authorize.service.d.ts +77 -3
- package/dist/authorize/authorize.service.d.ts.map +1 -1
- package/dist/authorize/authorize.service.js +212 -21
- package/dist/authorize/authorize.service.js.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.js +16 -1
- package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
- package/dist/authorize/dto/consent.dto.d.ts +10 -1
- package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
- package/dist/authorize/dto/consent.dto.js +16 -1
- package/dist/authorize/dto/consent.dto.js.map +1 -1
- package/dist/authorize/dto/token.dto.d.ts +12 -0
- package/dist/authorize/dto/token.dto.d.ts.map +1 -1
- package/dist/authorize/dto/token.dto.js +21 -1
- package/dist/authorize/dto/token.dto.js.map +1 -1
- package/dist/authorize/oauth-exception.filter.d.ts +17 -0
- package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
- package/dist/authorize/oauth-exception.filter.js +54 -0
- package/dist/authorize/oauth-exception.filter.js.map +1 -0
- package/dist/authorize/oauth-metadata.service.d.ts +39 -0
- package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
- package/dist/authorize/oauth-metadata.service.js +81 -0
- package/dist/authorize/oauth-metadata.service.js.map +1 -0
- package/dist/authorize/well-known.controller.d.ts +67 -0
- package/dist/authorize/well-known.controller.d.ts.map +1 -0
- package/dist/authorize/well-known.controller.js +126 -0
- package/dist/authorize/well-known.controller.js.map +1 -0
- package/dist/captcha/captcha.service.d.ts +32 -2
- package/dist/captcha/captcha.service.d.ts.map +1 -1
- package/dist/captcha/captcha.service.js +85 -12
- package/dist/captcha/captcha.service.js.map +1 -1
- package/dist/challenge/challenge.service.d.ts +2 -2
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +6 -0
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
- package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
- package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
- package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
- package/dist/file/file-upload-ticket.service.d.ts +160 -0
- package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
- package/dist/file/file-upload-ticket.service.js +382 -0
- package/dist/file/file-upload-ticket.service.js.map +1 -0
- package/dist/file/file.controller.d.ts +24 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +63 -2
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.module.d.ts.map +1 -1
- package/dist/file/file.module.js +14 -2
- package/dist/file/file.module.js.map +1 -1
- package/dist/file/file.service.d.ts +182 -6
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +386 -54
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/filename-encoding.util.d.ts +24 -0
- package/dist/file/filename-encoding.util.d.ts.map +1 -0
- package/dist/file/filename-encoding.util.js +63 -0
- package/dist/file/filename-encoding.util.js.map +1 -0
- package/dist/file/image-optimization.service.d.ts +27 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +63 -14
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts +33 -0
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
- package/dist/file/mcp-file-source.schema.js +75 -0
- package/dist/file/mcp-file-source.schema.js.map +1 -0
- package/dist/file/mcp-file-source.service.d.ts +124 -0
- package/dist/file/mcp-file-source.service.d.ts.map +1 -0
- package/dist/file/mcp-file-source.service.js +262 -0
- package/dist/file/mcp-file-source.service.js.map +1 -0
- package/dist/file/mimetype-sniff.util.d.ts +62 -0
- package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
- package/dist/file/mimetype-sniff.util.js +226 -0
- package/dist/file/mimetype-sniff.util.js.map +1 -0
- package/dist/file/remote-fetch.util.d.ts +35 -0
- package/dist/file/remote-fetch.util.d.ts.map +1 -0
- package/dist/file/remote-fetch.util.js +236 -0
- package/dist/file/remote-fetch.util.js.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
- package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
- package/dist/impersonation/impersonation.service.d.ts +8 -3
- package/dist/impersonation/impersonation.service.d.ts.map +1 -1
- package/dist/impersonation/impersonation.service.js +14 -4
- package/dist/impersonation/impersonation.service.js.map +1 -1
- package/dist/incident/incident.controller.d.ts +2 -1
- package/dist/incident/incident.controller.d.ts.map +1 -1
- package/dist/incident/incident.controller.js +10 -6
- package/dist/incident/incident.controller.js.map +1 -1
- package/dist/incident/incident.service.d.ts +2 -0
- package/dist/incident/incident.service.d.ts.map +1 -1
- package/dist/incident/incident.service.js +4 -0
- package/dist/incident/incident.service.js.map +1 -1
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +7 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +0 -13
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +5 -40
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +5 -5
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/integration-profile/testers/index.d.ts.map +1 -1
- package/dist/integration-profile/testers/index.js +2 -0
- package/dist/integration-profile/testers/index.js.map +1 -1
- package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
- package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/shipping.testers.js +71 -0
- package/dist/integration-profile/testers/shipping.testers.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/send.dto.d.ts +6 -1
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.service.d.ts +9 -0
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +34 -14
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.js +2 -1
- package/dist/mail-sent/mail-sent.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
- package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
- package/dist/mail-sent/mail-sent.sort.js +19 -0
- package/dist/mail-sent/mail-sent.sort.js.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
- package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
- package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
- package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-auth.guard.js +19 -5
- package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
- package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.js +46 -26
- package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
- package/dist/mcp/mcp-audit.service.d.ts +17 -0
- package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
- package/dist/mcp/mcp-audit.service.js +32 -3
- package/dist/mcp/mcp-audit.service.js.map +1 -1
- package/dist/mcp/mcp-permission.service.d.ts +64 -0
- package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
- package/dist/mcp/mcp-permission.service.js +178 -0
- package/dist/mcp/mcp-permission.service.js.map +1 -0
- package/dist/mcp/mcp-server.service.d.ts +3 -1
- package/dist/mcp/mcp-server.service.d.ts.map +1 -1
- package/dist/mcp/mcp-server.service.js +36 -15
- package/dist/mcp/mcp-server.service.js.map +1 -1
- package/dist/mcp/mcp.controller.d.ts.map +1 -1
- package/dist/mcp/mcp.controller.js +10 -2
- package/dist/mcp/mcp.controller.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +5 -1
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
- package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
- package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
- package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/types/mcp-context.type.d.ts +9 -0
- package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +8 -0
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +115 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/meeting/meeting.constants.d.ts +70 -0
- package/dist/meeting/meeting.constants.d.ts.map +1 -1
- package/dist/meeting/meeting.constants.js +9 -1
- package/dist/meeting/meeting.constants.js.map +1 -1
- package/dist/menu/menu.service.d.ts.map +1 -1
- package/dist/menu/menu.service.js +29 -9
- package/dist/menu/menu.service.js.map +1 -1
- package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
- package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
- package/dist/message-template/dto/update-message-template.dto.js +38 -0
- package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
- package/dist/message-template/message-template-admin.service.d.ts +70 -0
- package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
- package/dist/message-template/message-template-admin.service.js +226 -0
- package/dist/message-template/message-template-admin.service.js.map +1 -0
- package/dist/message-template/message-template.controller.d.ts +29 -0
- package/dist/message-template/message-template.controller.d.ts.map +1 -0
- package/dist/message-template/message-template.controller.js +101 -0
- package/dist/message-template/message-template.controller.js.map +1 -0
- package/dist/message-template/message-template.module.d.ts +10 -0
- package/dist/message-template/message-template.module.d.ts.map +1 -0
- package/dist/message-template/message-template.module.js +33 -0
- package/dist/message-template/message-template.module.js.map +1 -0
- package/dist/message-template/message-template.registry.d.ts +55 -0
- package/dist/message-template/message-template.registry.d.ts.map +1 -0
- package/dist/message-template/message-template.registry.js +64 -0
- package/dist/message-template/message-template.registry.js.map +1 -0
- package/dist/message-template/message-template.service.d.ts +59 -0
- package/dist/message-template/message-template.service.d.ts.map +1 -0
- package/dist/message-template/message-template.service.js +166 -0
- package/dist/message-template/message-template.service.js.map +1 -0
- package/dist/notification/notification.constants.d.ts +11 -0
- package/dist/notification/notification.constants.d.ts.map +1 -0
- package/dist/notification/notification.constants.js +14 -0
- package/dist/notification/notification.constants.js.map +1 -0
- package/dist/notification/notification.controller.d.ts +20 -20
- package/dist/notification/notification.module.d.ts.map +1 -1
- package/dist/notification/notification.module.js +3 -0
- package/dist/notification/notification.module.js.map +1 -1
- package/dist/notification/notification.service.d.ts +33 -21
- package/dist/notification/notification.service.d.ts.map +1 -1
- package/dist/notification/notification.service.js +36 -2
- package/dist/notification/notification.service.js.map +1 -1
- package/dist/oauth/oauth.controller.d.ts +4 -6
- package/dist/oauth/oauth.controller.d.ts.map +1 -1
- package/dist/oauth/oauth.controller.js +0 -1
- package/dist/oauth/oauth.controller.js.map +1 -1
- package/dist/oauth/oauth.errors.d.ts +15 -1
- package/dist/oauth/oauth.errors.d.ts.map +1 -1
- package/dist/oauth/oauth.errors.js +9 -1
- package/dist/oauth/oauth.errors.js.map +1 -1
- package/dist/oauth/oauth.module.d.ts.map +1 -1
- package/dist/oauth/oauth.module.js +6 -1
- package/dist/oauth/oauth.module.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +25 -5
- package/dist/oauth/oauth.service.d.ts.map +1 -1
- package/dist/oauth/oauth.service.js +63 -27
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/providers/abstract.provider.d.ts +10 -0
- package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
- package/dist/oauth/providers/abstract.provider.js +39 -12
- package/dist/oauth/providers/abstract.provider.js.map +1 -1
- package/dist/oauth/providers/github.provider.d.ts +1 -1
- package/dist/oauth/providers/github.provider.d.ts.map +1 -1
- package/dist/oauth/providers/github.provider.js +48 -22
- package/dist/oauth/providers/github.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/observability/monitored-cron.d.ts +29 -12
- package/dist/observability/monitored-cron.d.ts.map +1 -1
- package/dist/observability/monitored-cron.js +131 -46
- package/dist/observability/monitored-cron.js.map +1 -1
- package/dist/pairing/pairing.service.d.ts +6 -2
- package/dist/pairing/pairing.service.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.js +4 -6
- package/dist/profile/dto/change-password.dto.js.map +1 -1
- package/dist/profile/profile.controller.d.ts +1 -1
- package/dist/profile/profile.service.d.ts +1 -1
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +9 -3
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
- package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
- package/dist/realtime/realtime-tick.coalescer.js +60 -0
- package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
- package/dist/realtime/realtime.service.d.ts +2 -0
- package/dist/realtime/realtime.service.d.ts.map +1 -1
- package/dist/realtime/realtime.service.js +22 -2
- package/dist/realtime/realtime.service.js.map +1 -1
- package/dist/redis/redis-kv.service.d.ts +90 -0
- package/dist/redis/redis-kv.service.d.ts.map +1 -0
- package/dist/redis/redis-kv.service.js +247 -0
- package/dist/redis/redis-kv.service.js.map +1 -0
- package/dist/redis/redis-master.d.ts +29 -0
- package/dist/redis/redis-master.d.ts.map +1 -0
- package/dist/redis/redis-master.js +81 -0
- package/dist/redis/redis-master.js.map +1 -0
- package/dist/redis/redis-pubsub.d.ts +12 -0
- package/dist/redis/redis-pubsub.d.ts.map +1 -1
- package/dist/redis/redis-pubsub.js +25 -2
- package/dist/redis/redis-pubsub.js.map +1 -1
- package/dist/redis/redis.module.d.ts +11 -0
- package/dist/redis/redis.module.d.ts.map +1 -0
- package/dist/redis/redis.module.js +30 -0
- package/dist/redis/redis.module.js.map +1 -0
- package/dist/session/session.controller.d.ts +6 -2
- package/dist/session/session.controller.d.ts.map +1 -1
- package/dist/session/session.service.d.ts +118 -15
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +251 -77
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/setting.controller.d.ts +5 -0
- package/dist/setting/setting.controller.d.ts.map +1 -1
- package/dist/setting/setting.service.d.ts +7 -0
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +38 -3
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/task/task.service.d.ts +17 -0
- package/dist/task/task.service.d.ts.map +1 -1
- package/dist/task/task.service.js +48 -13
- package/dist/task/task.service.js.map +1 -1
- package/dist/token/token.service.d.ts +19 -1
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +39 -2
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/user-credential.util.d.ts +10 -0
- package/dist/user/user-credential.util.d.ts.map +1 -1
- package/dist/user/user-credential.util.js +14 -1
- package/dist/user/user-credential.util.js.map +1 -1
- package/dist/user/user.service.d.ts +12 -4
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +2 -11
- package/dist/user/user.service.js.map +1 -1
- package/dist/user/user.sort.d.ts +16 -0
- package/dist/user/user.sort.d.ts.map +1 -0
- package/dist/user/user.sort.js +25 -0
- package/dist/user/user.sort.js.map +1 -0
- package/dist/utils/abbreviate-name.d.ts +13 -0
- package/dist/utils/abbreviate-name.d.ts.map +1 -0
- package/dist/utils/abbreviate-name.js +42 -0
- package/dist/utils/abbreviate-name.js.map +1 -0
- package/dist/utils/date-range-query.dto.d.ts +11 -0
- package/dist/utils/date-range-query.dto.d.ts.map +1 -0
- package/dist/utils/date-range-query.dto.js +63 -0
- package/dist/utils/date-range-query.dto.js.map +1 -0
- package/dist/utils/date-range.d.ts +96 -0
- package/dist/utils/date-range.d.ts.map +1 -0
- package/dist/utils/date-range.js +172 -0
- package/dist/utils/date-range.js.map +1 -0
- package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-utils.js +24 -0
- package/dist/webhook-integration/webhook-utils.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +46 -5
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_provider.yaml +9 -0
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/locale.yaml +0 -1
- package/hedhog/data/mail.yaml +2 -2
- package/hedhog/data/mail_layout.yaml +6 -3
- package/hedhog/data/menu.yaml +25 -5
- package/hedhog/data/route.yaml +140 -0
- package/hedhog/data/setting_group.yaml +137 -3
- package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
- package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
- package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
- package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
- package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
- package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
- package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
- package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
- package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
- package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
- package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
- package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
- package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
- package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
- package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
- package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
- package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
- package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
- package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
- package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
- package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
- package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
- package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
- package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
- package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
- package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
- package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
- package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
- package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
- package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
- package/hedhog/frontend/messages/en.json +183 -36
- package/hedhog/frontend/messages/pt.json +183 -36
- package/hedhog/table/cron_lock.yaml +17 -0
- package/hedhog/table/file.yaml +13 -1
- package/hedhog/table/file_upload_chunk.yaml +23 -0
- package/hedhog/table/file_upload_ticket.yaml +67 -0
- package/hedhog/table/mcp_tool_call_log.yaml +30 -22
- package/hedhog/table/message_template.yaml +33 -0
- package/hedhog/table/setting.yaml +8 -0
- package/hedhog/table/user_session.yaml +36 -1
- package/package.json +7 -5
- package/src/ai/ai-agent.sort.ts +21 -0
- package/src/ai/ai.service.spec.ts +173 -1
- package/src/ai/ai.service.ts +64 -193
- package/src/ai-instruction/ai-instruction.service.ts +32 -28
- package/src/ai-instruction/ai-instruction.sort.ts +32 -0
- package/src/auth/auth.module.ts +8 -1
- package/src/auth/auth.service.spec.ts +108 -1
- package/src/auth/auth.service.ts +59 -5
- package/src/auth/guards/auth.guard.ts +9 -1
- package/src/authorize/authorize.controller.ts +126 -11
- package/src/authorize/authorize.errors.ts +55 -0
- package/src/authorize/authorize.module.ts +6 -1
- package/src/authorize/authorize.service.spec.ts +379 -7
- package/src/authorize/authorize.service.ts +309 -23
- package/src/authorize/dto/authorize-info.dto.ts +21 -3
- package/src/authorize/dto/consent.dto.ts +21 -3
- package/src/authorize/dto/token.dto.ts +24 -2
- package/src/authorize/oauth-exception.filter.ts +58 -0
- package/src/authorize/oauth-metadata.service.ts +67 -0
- package/src/authorize/well-known.controller.spec.ts +84 -0
- package/src/authorize/well-known.controller.ts +96 -0
- package/src/captcha/captcha.service.spec.ts +211 -4
- package/src/captcha/captcha.service.ts +127 -10
- package/src/core.module.ts +6 -0
- package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
- package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
- package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
- package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
- package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
- package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
- package/src/file/file-upload-ticket.service.spec.ts +422 -0
- package/src/file/file-upload-ticket.service.ts +513 -0
- package/src/file/file.controller.ts +65 -0
- package/src/file/file.module.ts +14 -2
- package/src/file/file.service.spec.ts +94 -0
- package/src/file/file.service.ts +433 -53
- package/src/file/filename-encoding.util.spec.ts +54 -0
- package/src/file/filename-encoding.util.ts +67 -0
- package/src/file/image-optimization.service.spec.ts +156 -19
- package/src/file/image-optimization.service.ts +106 -21
- package/src/file/mcp-file-source.schema.ts +83 -0
- package/src/file/mcp-file-source.service.spec.ts +473 -0
- package/src/file/mcp-file-source.service.ts +445 -0
- package/src/file/mimetype-sniff.util.spec.ts +126 -0
- package/src/file/mimetype-sniff.util.ts +265 -0
- package/src/file/remote-fetch.util.spec.ts +117 -0
- package/src/file/remote-fetch.util.ts +330 -0
- package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
- package/src/impersonation/impersonation.service.spec.ts +24 -1
- package/src/impersonation/impersonation.service.ts +14 -4
- package/src/incident/incident.controller.ts +9 -1
- package/src/incident/incident.service.ts +7 -0
- package/src/index.ts +17 -0
- package/src/integration-profile/integration-profile.secrets.ts +7 -0
- package/src/integration-profile/integration-profile.service.ts +7 -64
- package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
- package/src/integration-profile/integration-profile.utils.ts +5 -5
- package/src/integration-profile/testers/index.ts +2 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +79 -0
- package/src/integration-profile/testers/shipping.testers.ts +94 -0
- package/src/mail/dto/send.dto.ts +6 -1
- package/src/mail/mail-template.spec.ts +58 -1
- package/src/mail/mail.service.spec.ts +112 -0
- package/src/mail/mail.service.ts +42 -4
- package/src/mail-sent/mail-sent.service.ts +3 -0
- package/src/mail-sent/mail-sent.sort.ts +19 -0
- package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
- package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
- package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
- package/src/mcp/guards/mcp-auth.guard.ts +24 -1
- package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
- package/src/mcp/guards/mcp-permission.guard.ts +76 -51
- package/src/mcp/mcp-audit.service.spec.ts +107 -0
- package/src/mcp/mcp-audit.service.ts +37 -1
- package/src/mcp/mcp-permission.service.spec.ts +197 -0
- package/src/mcp/mcp-permission.service.ts +184 -0
- package/src/mcp/mcp-server.service.spec.ts +84 -2
- package/src/mcp/mcp-server.service.ts +111 -87
- package/src/mcp/mcp.controller.ts +8 -1
- package/src/mcp/mcp.module.ts +5 -1
- package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
- package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
- package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
- package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
- package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/types/mcp-context.type.ts +15 -6
- package/src/mcp-chat/mcp-chat.service.ts +8 -0
- package/src/meeting/meeting-provider.registry.ts +121 -0
- package/src/meeting/meeting.constants.ts +74 -0
- package/src/menu/menu.service.spec.ts +89 -0
- package/src/menu/menu.service.ts +29 -11
- package/src/message-template/dto/update-message-template.dto.ts +22 -0
- package/src/message-template/message-template-admin.service.spec.ts +163 -0
- package/src/message-template/message-template-admin.service.ts +239 -0
- package/src/message-template/message-template.controller.ts +52 -0
- package/src/message-template/message-template.module.ts +21 -0
- package/src/message-template/message-template.registry.spec.ts +62 -0
- package/src/message-template/message-template.registry.ts +125 -0
- package/src/message-template/message-template.service.spec.ts +149 -0
- package/src/message-template/message-template.service.ts +149 -0
- package/src/notification/notification.constants.ts +10 -0
- package/src/notification/notification.module.ts +3 -0
- package/src/notification/notification.service.spec.ts +75 -1
- package/src/notification/notification.service.ts +39 -1
- package/src/oauth/oauth.controller.ts +0 -1
- package/src/oauth/oauth.errors.ts +7 -0
- package/src/oauth/oauth.module.ts +6 -1
- package/src/oauth/oauth.service.spec.ts +58 -7
- package/src/oauth/oauth.service.ts +71 -32
- package/src/oauth/providers/abstract.provider.spec.ts +192 -0
- package/src/oauth/providers/abstract.provider.ts +46 -14
- package/src/oauth/providers/github.provider.ts +57 -34
- package/src/oauth/providers/microsoft-entra-id.provider.ts +8 -1
- package/src/observability/monitored-cron.spec.ts +164 -31
- package/src/observability/monitored-cron.ts +154 -62
- package/src/profile/dto/change-password.dto.ts +25 -7
- package/src/profile/profile.service.spec.ts +97 -0
- package/src/profile/profile.service.ts +9 -3
- package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
- package/src/realtime/realtime-tick.coalescer.ts +60 -0
- package/src/realtime/realtime.service.spec.ts +33 -0
- package/src/realtime/realtime.service.ts +28 -2
- package/src/redis/redis-kv.service.ts +261 -0
- package/src/redis/redis-master.spec.ts +111 -0
- package/src/redis/redis-master.ts +86 -0
- package/src/redis/redis-pubsub.ts +27 -3
- package/src/redis/redis.module.ts +17 -0
- package/src/session/session.service.spec.ts +121 -42
- package/src/session/session.service.ts +279 -82
- package/src/setting/setting.service.ts +44 -3
- package/src/task/task.service.spec.ts +41 -0
- package/src/task/task.service.ts +53 -13
- package/src/token/token.service.spec.ts +90 -0
- package/src/token/token.service.ts +48 -2
- package/src/user/user-credential.util.ts +14 -5
- package/src/user/user.service.ts +2 -12
- package/src/user/user.sort.ts +25 -0
- package/src/utils/abbreviate-name.spec.ts +50 -0
- package/src/utils/abbreviate-name.ts +44 -0
- package/src/utils/date-range-query.dto.ts +56 -0
- package/src/utils/date-range.spec.ts +175 -0
- package/src/utils/date-range.ts +246 -0
- package/src/webhook-integration/webhook-utils.spec.ts +67 -0
- package/src/webhook-integration/webhook-utils.ts +26 -0
- package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
- package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +112 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +58 -5
- package/hedhog/query/device_pairing_request.sql +0 -46
- package/hedhog/query/impersonation_grant.sql +0 -71
- package/hedhog/query/oauth_authorize_pkce.sql +0 -58
- package/hedhog/query/oauth_mobile_state_token.sql +0 -30
- package/hedhog/query/oauth_web_ref_token.sql +0 -25
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.OAuthExceptionFilter = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const authorize_errors_1 = require("./authorize.errors");
|
|
12
|
+
/**
|
|
13
|
+
* Traduz o que sai dos endpoints OAuth para o formato do RFC 6749 §5.2:
|
|
14
|
+
* `{ error, error_description }`, sempre `no-store`.
|
|
15
|
+
*
|
|
16
|
+
* Existe porque o `HttpExceptionFilter` global quase serve, mas não nos dois
|
|
17
|
+
* casos que importam: ele acrescenta `statusCode`/`timestamp`/`path` ao corpo, e
|
|
18
|
+
* uma falha do `ValidationPipe` sai como `{ message: { campo: [...] } }`, que não
|
|
19
|
+
* é um erro OAuth e nenhum cliente sabe ler.
|
|
20
|
+
*
|
|
21
|
+
* O campo `message` é preservado de propósito — os cinco clientes já registrados
|
|
22
|
+
* leem ele nas respostas de erro de hoje.
|
|
23
|
+
*/
|
|
24
|
+
let OAuthExceptionFilter = class OAuthExceptionFilter {
|
|
25
|
+
catch(exception, host) {
|
|
26
|
+
var _a, _b;
|
|
27
|
+
const response = host.switchToHttp().getResponse();
|
|
28
|
+
const status = exception.getStatus();
|
|
29
|
+
const body = exception.getResponse();
|
|
30
|
+
response.setHeader('Cache-Control', 'no-store');
|
|
31
|
+
response.setHeader('Pragma', 'no-cache');
|
|
32
|
+
if (exception instanceof authorize_errors_1.OAuthError) {
|
|
33
|
+
response.status(status).json(Object.assign(Object.assign(Object.assign({ error: body.error, error_description: body.error_description }, (body.redirectable ? { redirectable: true } : {})), (body.issuer ? { issuer: body.issuer } : {})), { message: body.message }));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Falha de validação de DTO: vira invalid_request, com a mensagem original
|
|
37
|
+
// preservada para quem estiver depurando.
|
|
38
|
+
const description = typeof body === 'string'
|
|
39
|
+
? body
|
|
40
|
+
: typeof (body === null || body === void 0 ? void 0 : body.message) === 'string'
|
|
41
|
+
? body.message
|
|
42
|
+
: JSON.stringify((_a = body === null || body === void 0 ? void 0 : body.message) !== null && _a !== void 0 ? _a : 'Invalid request.');
|
|
43
|
+
response.status(status).json({
|
|
44
|
+
error: status === 400 ? 'invalid_request' : 'server_error',
|
|
45
|
+
error_description: description,
|
|
46
|
+
message: (_b = body === null || body === void 0 ? void 0 : body.message) !== null && _b !== void 0 ? _b : description,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
exports.OAuthExceptionFilter = OAuthExceptionFilter;
|
|
51
|
+
exports.OAuthExceptionFilter = OAuthExceptionFilter = __decorate([
|
|
52
|
+
(0, common_1.Catch)(common_1.HttpException)
|
|
53
|
+
], OAuthExceptionFilter);
|
|
54
|
+
//# sourceMappingURL=oauth-exception.filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-exception.filter.js","sourceRoot":"","sources":["../../src/authorize/oauth-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAKwB;AAExB,yDAAgD;AAEhD;;;;;;;;;;;GAWG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,KAAK,CAAC,SAAwB,EAAE,IAAmB;;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAY,CAAC;QAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAS,CAAC;QAE5C,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAChD,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEzC,IAAI,SAAS,YAAY,6BAAU,EAAE,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,6CAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IACtC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACjD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC/C,OAAO,EAAE,IAAI,CAAC,OAAO,IACrB,CAAC;YACH,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,0CAA0C;QAC1C,MAAM,WAAW,GACf,OAAO,IAAI,KAAK,QAAQ;YACtB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAA,KAAK,QAAQ;gBACjC,CAAC,CAAC,IAAI,CAAC,OAAO;gBACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,mCAAI,kBAAkB,CAAC,CAAC;QAE5D,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YAC3B,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc;YAC1D,iBAAiB,EAAE,WAAW;YAC9B,OAAO,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,mCAAI,WAAW;SACtC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAnCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,cAAK,EAAC,sBAAa,CAAC;GACR,oBAAoB,CAmChC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { SettingService } from '../setting/setting.service';
|
|
2
|
+
/**
|
|
3
|
+
* Escopo que confina um token ao /mcp.
|
|
4
|
+
*
|
|
5
|
+
* Mora aqui, e nao no modulo mcp, porque quem decide se uma concessao e de
|
|
6
|
+
* recurso e o fluxo de autorizacao — o guard do MCP so verifica o resultado.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MCP_SCOPE = "mcp";
|
|
9
|
+
/**
|
|
10
|
+
* Os identificadores canônicos do HedHog como OAuth provider.
|
|
11
|
+
*
|
|
12
|
+
* Existe como service, e não como constante, porque nada aqui é fixo: o mesmo
|
|
13
|
+
* código roda em produção, em dev e atrás de um túnel, e o `issuer` precisa
|
|
14
|
+
* casar exatamente com a origem de onde o cliente buscou os metadados (RFC 8414
|
|
15
|
+
* §3.3). Um valor compilado serviria a uma instalação só.
|
|
16
|
+
*
|
|
17
|
+
* `OAUTH_ISSUER` existe para o caso em que a API responde por um host diferente
|
|
18
|
+
* do que está na setting — um túnel de teste, tipicamente. Fora disso, a setting
|
|
19
|
+
* `api-url` é a fonte.
|
|
20
|
+
*/
|
|
21
|
+
export declare class OAuthMetadataService {
|
|
22
|
+
private readonly setting;
|
|
23
|
+
constructor(setting: SettingService);
|
|
24
|
+
/**
|
|
25
|
+
* Sem barra final, sempre. `https://host/` e `https://host` são URIs válidas e
|
|
26
|
+
* diferentes, e a comparação de `issuer` e de `resource` é feita por igualdade
|
|
27
|
+
* de string — normalizar aqui, uma vez, evita que os dois formatos circulem.
|
|
28
|
+
*/
|
|
29
|
+
getIssuer(): Promise<string>;
|
|
30
|
+
/** O recurso protegido: o valor que o `aud` de um token de conector carrega. */
|
|
31
|
+
getMcpResource(): Promise<string>;
|
|
32
|
+
/** Onde a API recebe o authorization request e redireciona para o consent. */
|
|
33
|
+
getAuthorizationEndpoint(): Promise<string>;
|
|
34
|
+
getTokenEndpoint(): Promise<string>;
|
|
35
|
+
/** Base da tela de consent (o admin), que é onde o usuário aprova de fato. */
|
|
36
|
+
getConsentUiBase(): Promise<string>;
|
|
37
|
+
private stripTrailingSlash;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=oauth-metadata.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-metadata.service.d.ts","sourceRoot":"","sources":["../../src/authorize/oauth-metadata.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;;;GAKG;AACH,eAAO,MAAM,SAAS,QAAQ,CAAC;AAE/B;;;;;;;;;;;GAWG;AACH,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAG1C;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAQlC,gFAAgF;IAC1E,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIvC,8EAA8E;IACxE,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI3C,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,8EAA8E;IACxE,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKzC,OAAO,CAAC,kBAAkB;CAG3B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.OAuthMetadataService = exports.MCP_SCOPE = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const setting_service_1 = require("../setting/setting.service");
|
|
18
|
+
/**
|
|
19
|
+
* Escopo que confina um token ao /mcp.
|
|
20
|
+
*
|
|
21
|
+
* Mora aqui, e nao no modulo mcp, porque quem decide se uma concessao e de
|
|
22
|
+
* recurso e o fluxo de autorizacao — o guard do MCP so verifica o resultado.
|
|
23
|
+
*/
|
|
24
|
+
exports.MCP_SCOPE = 'mcp';
|
|
25
|
+
/**
|
|
26
|
+
* Os identificadores canônicos do HedHog como OAuth provider.
|
|
27
|
+
*
|
|
28
|
+
* Existe como service, e não como constante, porque nada aqui é fixo: o mesmo
|
|
29
|
+
* código roda em produção, em dev e atrás de um túnel, e o `issuer` precisa
|
|
30
|
+
* casar exatamente com a origem de onde o cliente buscou os metadados (RFC 8414
|
|
31
|
+
* §3.3). Um valor compilado serviria a uma instalação só.
|
|
32
|
+
*
|
|
33
|
+
* `OAUTH_ISSUER` existe para o caso em que a API responde por um host diferente
|
|
34
|
+
* do que está na setting — um túnel de teste, tipicamente. Fora disso, a setting
|
|
35
|
+
* `api-url` é a fonte.
|
|
36
|
+
*/
|
|
37
|
+
let OAuthMetadataService = class OAuthMetadataService {
|
|
38
|
+
constructor(setting) {
|
|
39
|
+
this.setting = setting;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sem barra final, sempre. `https://host/` e `https://host` são URIs válidas e
|
|
43
|
+
* diferentes, e a comparação de `issuer` e de `resource` é feita por igualdade
|
|
44
|
+
* de string — normalizar aqui, uma vez, evita que os dois formatos circulem.
|
|
45
|
+
*/
|
|
46
|
+
async getIssuer() {
|
|
47
|
+
var _a, _b;
|
|
48
|
+
const fromEnv = (_a = process.env.OAUTH_ISSUER) === null || _a === void 0 ? void 0 : _a.trim();
|
|
49
|
+
if (fromEnv)
|
|
50
|
+
return this.stripTrailingSlash(fromEnv);
|
|
51
|
+
const settings = await this.setting.getSettingValues(['api-url']);
|
|
52
|
+
return this.stripTrailingSlash(String((_b = settings['api-url']) !== null && _b !== void 0 ? _b : ''));
|
|
53
|
+
}
|
|
54
|
+
/** O recurso protegido: o valor que o `aud` de um token de conector carrega. */
|
|
55
|
+
async getMcpResource() {
|
|
56
|
+
return `${await this.getIssuer()}/mcp`;
|
|
57
|
+
}
|
|
58
|
+
/** Onde a API recebe o authorization request e redireciona para o consent. */
|
|
59
|
+
async getAuthorizationEndpoint() {
|
|
60
|
+
return `${await this.getIssuer()}/auth/authorize`;
|
|
61
|
+
}
|
|
62
|
+
async getTokenEndpoint() {
|
|
63
|
+
return `${await this.getIssuer()}/auth/token`;
|
|
64
|
+
}
|
|
65
|
+
/** Base da tela de consent (o admin), que é onde o usuário aprova de fato. */
|
|
66
|
+
async getConsentUiBase() {
|
|
67
|
+
var _a;
|
|
68
|
+
const settings = await this.setting.getSettingValues(['url']);
|
|
69
|
+
return this.stripTrailingSlash(String((_a = settings['url']) !== null && _a !== void 0 ? _a : ''));
|
|
70
|
+
}
|
|
71
|
+
stripTrailingSlash(value) {
|
|
72
|
+
return value.trim().replace(/\/+$/, '');
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
exports.OAuthMetadataService = OAuthMetadataService;
|
|
76
|
+
exports.OAuthMetadataService = OAuthMetadataService = __decorate([
|
|
77
|
+
(0, common_1.Injectable)(),
|
|
78
|
+
__param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => setting_service_1.SettingService))),
|
|
79
|
+
__metadata("design:paramtypes", [setting_service_1.SettingService])
|
|
80
|
+
], OAuthMetadataService);
|
|
81
|
+
//# sourceMappingURL=oauth-metadata.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-metadata.service.js","sourceRoot":"","sources":["../../src/authorize/oauth-metadata.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAgE;AAChE,gEAA4D;AAE5D;;;;;GAKG;AACU,QAAA,SAAS,GAAG,KAAK,CAAC;AAE/B;;;;;;;;;;;GAWG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,YAEmB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IACvC,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,SAAS;;QACb,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,YAAY,0CAAE,IAAI,EAAE,CAAC;QACjD,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAA,QAAQ,CAAC,SAAS,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,cAAc;QAClB,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;IACzC,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,wBAAwB;QAC5B,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;IAChD,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,gBAAgB;;QACpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAA,QAAQ,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,kBAAkB,CAAC,KAAa;QACtC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF,CAAA;AA1CY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,gCAAc,CAAC,CAAC,CAAA;qCACf,gCAAc;GAH/B,oBAAoB,CA0ChC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { OAuthMetadataService } from './oauth-metadata.service';
|
|
2
|
+
/**
|
|
3
|
+
* Descoberta OAuth: como um cliente que só conhece a URL do recurso chega até o
|
|
4
|
+
* authorization server.
|
|
5
|
+
*
|
|
6
|
+
* Servido na raiz do host da API. Não há `setGlobalPrefix` no `main.ts`, e o
|
|
7
|
+
* middleware de compatibilidade de lá só remove um `/api` *inicial* — então
|
|
8
|
+
* `/.well-known/...` chega aqui intacto.
|
|
9
|
+
*
|
|
10
|
+
* Os paths são todos literais de propósito: com Express 5 (path-to-regexp v8) uma
|
|
11
|
+
* rota curinga derruba o boot da aplicação.
|
|
12
|
+
*
|
|
13
|
+
* Não servimos `/.well-known/openid-configuration`: não somos OIDC. Não há
|
|
14
|
+
* `id_token` nem JWKS (a assinatura é HS256, com segredo simétrico), e anunciar
|
|
15
|
+
* OIDC faria clientes procurarem endpoints que não existem.
|
|
16
|
+
*/
|
|
17
|
+
export declare class WellKnownController {
|
|
18
|
+
private readonly metadata;
|
|
19
|
+
constructor(metadata: OAuthMetadataService);
|
|
20
|
+
/**
|
|
21
|
+
* RFC 9728. O par sem sufixo e o com `/mcp` devolvem o mesmo documento: a RFC
|
|
22
|
+
* manda inserir o path do recurso depois do `.well-known`, mas clientes
|
|
23
|
+
* divergem, e responder aos dois custa uma linha.
|
|
24
|
+
*/
|
|
25
|
+
protectedResource(): Promise<{
|
|
26
|
+
resource: string;
|
|
27
|
+
authorization_servers: string[];
|
|
28
|
+
scopes_supported: string[];
|
|
29
|
+
bearer_methods_supported: string[];
|
|
30
|
+
resource_name: string;
|
|
31
|
+
}>;
|
|
32
|
+
protectedResourceMcp(): Promise<{
|
|
33
|
+
resource: string;
|
|
34
|
+
authorization_servers: string[];
|
|
35
|
+
scopes_supported: string[];
|
|
36
|
+
bearer_methods_supported: string[];
|
|
37
|
+
resource_name: string;
|
|
38
|
+
}>;
|
|
39
|
+
/** RFC 8414. */
|
|
40
|
+
authorizationServer(): Promise<{
|
|
41
|
+
issuer: string;
|
|
42
|
+
authorization_endpoint: string;
|
|
43
|
+
token_endpoint: string;
|
|
44
|
+
scopes_supported: string[];
|
|
45
|
+
response_types_supported: string[];
|
|
46
|
+
response_modes_supported: string[];
|
|
47
|
+
grant_types_supported: string[];
|
|
48
|
+
token_endpoint_auth_methods_supported: string[];
|
|
49
|
+
code_challenge_methods_supported: string[];
|
|
50
|
+
authorization_response_iss_parameter_supported: boolean;
|
|
51
|
+
}>;
|
|
52
|
+
authorizationServerMcp(): Promise<{
|
|
53
|
+
issuer: string;
|
|
54
|
+
authorization_endpoint: string;
|
|
55
|
+
token_endpoint: string;
|
|
56
|
+
scopes_supported: string[];
|
|
57
|
+
response_types_supported: string[];
|
|
58
|
+
response_modes_supported: string[];
|
|
59
|
+
grant_types_supported: string[];
|
|
60
|
+
token_endpoint_auth_methods_supported: string[];
|
|
61
|
+
code_challenge_methods_supported: string[];
|
|
62
|
+
authorization_response_iss_parameter_supported: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
private buildProtectedResource;
|
|
65
|
+
private buildAuthorizationServer;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=well-known.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"well-known.controller.d.ts","sourceRoot":"","sources":["../../src/authorize/well-known.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,qBAEa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,oBAAoB;IAE3D;;;;OAIG;IAGG,iBAAiB;;;;;;;IAMjB,oBAAoB;;;;;;;IAI1B,gBAAgB;IAGV,mBAAmB;;;;;;;;;;;;IAMnB,sBAAsB;;;;;;;;;;;;YAId,sBAAsB;YAetB,wBAAwB;CA0BvC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.WellKnownController = void 0;
|
|
13
|
+
const api_1 = require("@hed-hog/api");
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const oauth_metadata_service_1 = require("./oauth-metadata.service");
|
|
16
|
+
/**
|
|
17
|
+
* Descoberta OAuth: como um cliente que só conhece a URL do recurso chega até o
|
|
18
|
+
* authorization server.
|
|
19
|
+
*
|
|
20
|
+
* Servido na raiz do host da API. Não há `setGlobalPrefix` no `main.ts`, e o
|
|
21
|
+
* middleware de compatibilidade de lá só remove um `/api` *inicial* — então
|
|
22
|
+
* `/.well-known/...` chega aqui intacto.
|
|
23
|
+
*
|
|
24
|
+
* Os paths são todos literais de propósito: com Express 5 (path-to-regexp v8) uma
|
|
25
|
+
* rota curinga derruba o boot da aplicação.
|
|
26
|
+
*
|
|
27
|
+
* Não servimos `/.well-known/openid-configuration`: não somos OIDC. Não há
|
|
28
|
+
* `id_token` nem JWKS (a assinatura é HS256, com segredo simétrico), e anunciar
|
|
29
|
+
* OIDC faria clientes procurarem endpoints que não existem.
|
|
30
|
+
*/
|
|
31
|
+
let WellKnownController = class WellKnownController {
|
|
32
|
+
constructor(metadata) {
|
|
33
|
+
this.metadata = metadata;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* RFC 9728. O par sem sufixo e o com `/mcp` devolvem o mesmo documento: a RFC
|
|
37
|
+
* manda inserir o path do recurso depois do `.well-known`, mas clientes
|
|
38
|
+
* divergem, e responder aos dois custa uma linha.
|
|
39
|
+
*/
|
|
40
|
+
async protectedResource() {
|
|
41
|
+
return this.buildProtectedResource();
|
|
42
|
+
}
|
|
43
|
+
async protectedResourceMcp() {
|
|
44
|
+
return this.buildProtectedResource();
|
|
45
|
+
}
|
|
46
|
+
/** RFC 8414. */
|
|
47
|
+
async authorizationServer() {
|
|
48
|
+
return this.buildAuthorizationServer();
|
|
49
|
+
}
|
|
50
|
+
async authorizationServerMcp() {
|
|
51
|
+
return this.buildAuthorizationServer();
|
|
52
|
+
}
|
|
53
|
+
async buildProtectedResource() {
|
|
54
|
+
const [issuer, resource] = await Promise.all([
|
|
55
|
+
this.metadata.getIssuer(),
|
|
56
|
+
this.metadata.getMcpResource(),
|
|
57
|
+
]);
|
|
58
|
+
return {
|
|
59
|
+
resource,
|
|
60
|
+
authorization_servers: [issuer],
|
|
61
|
+
scopes_supported: ['mcp'],
|
|
62
|
+
bearer_methods_supported: ['header'],
|
|
63
|
+
resource_name: 'HedHog Hub MCP',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async buildAuthorizationServer() {
|
|
67
|
+
const [issuer, authorizationEndpoint, tokenEndpoint] = await Promise.all([
|
|
68
|
+
this.metadata.getIssuer(),
|
|
69
|
+
this.metadata.getAuthorizationEndpoint(),
|
|
70
|
+
this.metadata.getTokenEndpoint(),
|
|
71
|
+
]);
|
|
72
|
+
return {
|
|
73
|
+
// RFC 8414 §3.3: o cliente compara este valor com a origem de onde buscou o
|
|
74
|
+
// documento. Uma barra final a mais reprova a validação inteira — por isso
|
|
75
|
+
// o OAuthMetadataService normaliza na entrada, e não aqui.
|
|
76
|
+
issuer,
|
|
77
|
+
authorization_endpoint: authorizationEndpoint,
|
|
78
|
+
token_endpoint: tokenEndpoint,
|
|
79
|
+
scopes_supported: ['mcp', 'profile', 'vaults'],
|
|
80
|
+
response_types_supported: ['code'],
|
|
81
|
+
response_modes_supported: ['query'],
|
|
82
|
+
grant_types_supported: ['authorization_code', 'refresh_token'],
|
|
83
|
+
// Só clientes públicos: `AuthorizeService.exchangeCode` recusa qualquer
|
|
84
|
+
// `client_type` diferente de 'public', e não existe client_secret no modelo.
|
|
85
|
+
token_endpoint_auth_methods_supported: ['none'],
|
|
86
|
+
// `plain` é rejeitado pelo serviço, então não anunciamos.
|
|
87
|
+
code_challenge_methods_supported: ['S256'],
|
|
88
|
+
authorization_response_iss_parameter_supported: true,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
exports.WellKnownController = WellKnownController;
|
|
93
|
+
__decorate([
|
|
94
|
+
(0, common_1.Get)('oauth-protected-resource'),
|
|
95
|
+
(0, common_1.Header)('Cache-Control', 'public, max-age=3600'),
|
|
96
|
+
__metadata("design:type", Function),
|
|
97
|
+
__metadata("design:paramtypes", []),
|
|
98
|
+
__metadata("design:returntype", Promise)
|
|
99
|
+
], WellKnownController.prototype, "protectedResource", null);
|
|
100
|
+
__decorate([
|
|
101
|
+
(0, common_1.Get)('oauth-protected-resource/mcp'),
|
|
102
|
+
(0, common_1.Header)('Cache-Control', 'public, max-age=3600'),
|
|
103
|
+
__metadata("design:type", Function),
|
|
104
|
+
__metadata("design:paramtypes", []),
|
|
105
|
+
__metadata("design:returntype", Promise)
|
|
106
|
+
], WellKnownController.prototype, "protectedResourceMcp", null);
|
|
107
|
+
__decorate([
|
|
108
|
+
(0, common_1.Get)('oauth-authorization-server'),
|
|
109
|
+
(0, common_1.Header)('Cache-Control', 'public, max-age=3600'),
|
|
110
|
+
__metadata("design:type", Function),
|
|
111
|
+
__metadata("design:paramtypes", []),
|
|
112
|
+
__metadata("design:returntype", Promise)
|
|
113
|
+
], WellKnownController.prototype, "authorizationServer", null);
|
|
114
|
+
__decorate([
|
|
115
|
+
(0, common_1.Get)('oauth-authorization-server/mcp'),
|
|
116
|
+
(0, common_1.Header)('Cache-Control', 'public, max-age=3600'),
|
|
117
|
+
__metadata("design:type", Function),
|
|
118
|
+
__metadata("design:paramtypes", []),
|
|
119
|
+
__metadata("design:returntype", Promise)
|
|
120
|
+
], WellKnownController.prototype, "authorizationServerMcp", null);
|
|
121
|
+
exports.WellKnownController = WellKnownController = __decorate([
|
|
122
|
+
(0, api_1.Public)(),
|
|
123
|
+
(0, common_1.Controller)('.well-known'),
|
|
124
|
+
__metadata("design:paramtypes", [oauth_metadata_service_1.OAuthMetadataService])
|
|
125
|
+
], WellKnownController);
|
|
126
|
+
//# sourceMappingURL=well-known.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"well-known.controller.js","sourceRoot":"","sources":["../../src/authorize/well-known.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAsC;AACtC,2CAAyD;AACzD,qEAAgE;AAEhE;;;;;;;;;;;;;;GAcG;AAGI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YAA6B,QAA8B;QAA9B,aAAQ,GAAR,QAAQ,CAAsB;IAAG,CAAC;IAE/D;;;;OAIG;IAGG,AAAN,KAAK,CAAC,iBAAiB;QACrB,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC;IACvC,CAAC;IAIK,AAAN,KAAK,CAAC,oBAAoB;QACxB,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC;IACvC,CAAC;IAED,gBAAgB;IAGV,AAAN,KAAK,CAAC,mBAAmB;QACvB,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACzC,CAAC;IAIK,AAAN,KAAK,CAAC,sBAAsB;QAC1B,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,sBAAsB;QAClC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YACzB,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;SAC/B,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ;YACR,qBAAqB,EAAE,CAAC,MAAM,CAAC;YAC/B,gBAAgB,EAAE,CAAC,KAAK,CAAC;YACzB,wBAAwB,EAAE,CAAC,QAAQ,CAAC;YACpC,aAAa,EAAE,gBAAgB;SAChC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACpC,MAAM,CAAC,MAAM,EAAE,qBAAqB,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YACzB,IAAI,CAAC,QAAQ,CAAC,wBAAwB,EAAE;YACxC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE;SACjC,CAAC,CAAC;QAEH,OAAO;YACL,4EAA4E;YAC5E,2EAA2E;YAC3E,2DAA2D;YAC3D,MAAM;YACN,sBAAsB,EAAE,qBAAqB;YAC7C,cAAc,EAAE,aAAa;YAC7B,gBAAgB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;YAC9C,wBAAwB,EAAE,CAAC,MAAM,CAAC;YAClC,wBAAwB,EAAE,CAAC,OAAO,CAAC;YACnC,qBAAqB,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;YAC9D,wEAAwE;YACxE,6EAA6E;YAC7E,qCAAqC,EAAE,CAAC,MAAM,CAAC;YAC/C,0DAA0D;YAC1D,gCAAgC,EAAE,CAAC,MAAM,CAAC;YAC1C,8CAA8C,EAAE,IAAI;SACrD,CAAC;IACJ,CAAC;CACF,CAAA;AA1EY,kDAAmB;AAUxB;IAFL,IAAA,YAAG,EAAC,0BAA0B,CAAC;IAC/B,IAAA,eAAM,EAAC,eAAe,EAAE,sBAAsB,CAAC;;;;4DAG/C;AAIK;IAFL,IAAA,YAAG,EAAC,8BAA8B,CAAC;IACnC,IAAA,eAAM,EAAC,eAAe,EAAE,sBAAsB,CAAC;;;;+DAG/C;AAKK;IAFL,IAAA,YAAG,EAAC,4BAA4B,CAAC;IACjC,IAAA,eAAM,EAAC,eAAe,EAAE,sBAAsB,CAAC;;;;8DAG/C;AAIK;IAFL,IAAA,YAAG,EAAC,gCAAgC,CAAC;IACrC,IAAA,eAAM,EAAC,eAAe,EAAE,sBAAsB,CAAC;;;;iEAG/C;8BA/BU,mBAAmB;IAF/B,IAAA,YAAM,GAAE;IACR,IAAA,mBAAU,EAAC,aAAa,CAAC;qCAEe,6CAAoB;GADhD,mBAAmB,CA0E/B"}
|
|
@@ -6,6 +6,17 @@ export interface CaptchaPublicConfig {
|
|
|
6
6
|
provider_slug: string | null;
|
|
7
7
|
site_key: string | null;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Contexto da submissao que esta sendo verificada. Tudo opcional: uma superficie
|
|
11
|
+
* que ainda nao manda `action` continua passando, o que permite subir o backend
|
|
12
|
+
* antes do front sem derrubar quem esta com bundle antigo em cache.
|
|
13
|
+
*/
|
|
14
|
+
export interface CaptchaVerifyContext {
|
|
15
|
+
/** IP do visitante (X-Forwarded-For repassado pelo BFF), nao o IP do pod. */
|
|
16
|
+
remoteIp?: string | null;
|
|
17
|
+
/** `data-action` que a superficie manda no widget. */
|
|
18
|
+
expectedAction?: string | null;
|
|
19
|
+
}
|
|
9
20
|
/**
|
|
10
21
|
* Server-side CAPTCHA verification shared by every public form in the platform.
|
|
11
22
|
*
|
|
@@ -18,16 +29,35 @@ export declare class CaptchaService {
|
|
|
18
29
|
/**
|
|
19
30
|
* Verifies a token against the provider configured in an integration profile.
|
|
20
31
|
* Throws `BadRequestException` when the challenge does not check out.
|
|
32
|
+
*
|
|
33
|
+
* The profile can be addressed by numeric id or by slug. Forms and channels
|
|
34
|
+
* hold a real FK (`captcha_integration_profile_id`), but a setting picked
|
|
35
|
+
* through the admin's entity-picker stores the profile *slug* — as
|
|
36
|
+
* `commerce-back-in-stock-captcha-profile-id` does. Accepting both keeps a
|
|
37
|
+
* profile chosen on screen from silently failing the challenge shut.
|
|
21
38
|
*/
|
|
22
|
-
verifyForProfile(
|
|
39
|
+
verifyForProfile(integrationProfileRef: number | string | null | undefined, token: string | null | undefined, context?: CaptchaVerifyContext): Promise<void>;
|
|
23
40
|
/** Verifies a token against an explicit provider and its credentials. */
|
|
24
|
-
verify(token: string, providerSlug: string, config: Record<string, string
|
|
41
|
+
verify(token: string, providerSlug: string, config: Record<string, string>, context?: CaptchaVerifyContext): Promise<void>;
|
|
25
42
|
/**
|
|
26
43
|
* Public settings a front end needs to mount the widget. Only the site key is
|
|
27
44
|
* returned - the secret never leaves the server.
|
|
28
45
|
*/
|
|
29
46
|
getPublicConfig(integrationProfileId: number | null | undefined, enabled?: boolean): Promise<CaptchaPublicConfig>;
|
|
30
47
|
static extractSiteKey(config: Record<string, unknown> | null): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Hostnames que o perfil aceita, em `config.hostnames` (separados por virgula).
|
|
50
|
+
* Vazio significa "nao confira" - todo perfil ja existente continua valendo.
|
|
51
|
+
*/
|
|
52
|
+
static parseHostnames(config: Record<string, unknown> | null): Set<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Chamada canonica de siteverify: manda o IP do visitante, tem timeout, e
|
|
55
|
+
* confere `action` e `hostname` alem do `success`.
|
|
56
|
+
*
|
|
57
|
+
* Toda falha - rede, HTTP nao-2xx, corpo que nao e JSON - vira falha de
|
|
58
|
+
* CAPTCHA. Deixar a excecao subir crua transformaria um solavanco do provedor em
|
|
59
|
+
* 500, e o visitante veria "erro do servidor" no lugar de "tente de novo".
|
|
60
|
+
*/
|
|
31
61
|
private verifyRemote;
|
|
32
62
|
/**
|
|
33
63
|
* Altcha is verified locally: the client solves a proof-of-work, and the HMAC
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captcha.service.d.ts","sourceRoot":"","sources":["../../src/captcha/captcha.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD,eAAO,MAAM,iBAAiB,0DAIpB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"captcha.service.d.ts","sourceRoot":"","sources":["../../src/captcha/captcha.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD,eAAO,MAAM,iBAAiB,0DAIpB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAwBD;;;;;GAKG;AACH,qBACa,cAAc;IAGvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAGxC;;;;;;;;;OASG;IACG,gBAAgB,CACpB,qBAAqB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzD,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC;IAqChB,yEAAyE;IACnE,MAAM,CACV,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC;IAuChB;;;OAGG;IACG,eAAe,CACnB,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/C,OAAO,UAAO,GACb,OAAO,CAAC,mBAAmB,CAAC;IAoB/B,MAAM,CAAC,cAAc,CACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACrC,MAAM,GAAG,IAAI;IAMhB;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;IAU1E;;;;;;;OAOG;YACW,YAAY;IA0D1B;;;OAGG;IACH,OAAO,CAAC,YAAY;CAsBrB"}
|
|
@@ -22,6 +22,10 @@ exports.CAPTCHA_PROVIDERS = [
|
|
|
22
22
|
'cloudflare-turnstile',
|
|
23
23
|
'altcha',
|
|
24
24
|
];
|
|
25
|
+
/** Teto do token aceito pelo siteverify; acima disso nem vale a viagem de rede. */
|
|
26
|
+
const MAX_TOKEN_LENGTH = 2048;
|
|
27
|
+
/** Timeout da chamada ao provedor: sem ele um provedor lento prende o request. */
|
|
28
|
+
const SITEVERIFY_TIMEOUT_MS = 10000;
|
|
25
29
|
/**
|
|
26
30
|
* Server-side CAPTCHA verification shared by every public form in the platform.
|
|
27
31
|
*
|
|
@@ -35,14 +39,26 @@ let CaptchaService = CaptchaService_1 = class CaptchaService {
|
|
|
35
39
|
/**
|
|
36
40
|
* Verifies a token against the provider configured in an integration profile.
|
|
37
41
|
* Throws `BadRequestException` when the challenge does not check out.
|
|
42
|
+
*
|
|
43
|
+
* The profile can be addressed by numeric id or by slug. Forms and channels
|
|
44
|
+
* hold a real FK (`captcha_integration_profile_id`), but a setting picked
|
|
45
|
+
* through the admin's entity-picker stores the profile *slug* — as
|
|
46
|
+
* `commerce-back-in-stock-captcha-profile-id` does. Accepting both keeps a
|
|
47
|
+
* profile chosen on screen from silently failing the challenge shut.
|
|
38
48
|
*/
|
|
39
|
-
async verifyForProfile(
|
|
49
|
+
async verifyForProfile(integrationProfileRef, token, context = {}) {
|
|
40
50
|
var _a, _b;
|
|
41
|
-
|
|
51
|
+
const ref = typeof integrationProfileRef === 'string'
|
|
52
|
+
? integrationProfileRef.trim()
|
|
53
|
+
: integrationProfileRef;
|
|
54
|
+
// `'0'` is the legacy default of the settings named `...-profile-id`: it is
|
|
55
|
+
// nobody's id and nobody's slug.
|
|
56
|
+
if (!ref || ref === '0') {
|
|
42
57
|
throw new common_1.BadRequestException('CAPTCHA is enabled but no integration profile is configured.');
|
|
43
58
|
}
|
|
59
|
+
const numericId = typeof ref === 'number' ? ref : /^\d+$/.test(ref) ? Number(ref) : null;
|
|
44
60
|
const profile = await this.prisma.integration_profile.findFirst({
|
|
45
|
-
where: { id:
|
|
61
|
+
where: numericId ? { id: numericId } : { slug: String(ref) },
|
|
46
62
|
select: {
|
|
47
63
|
config: true,
|
|
48
64
|
integration_provider: { select: { slug: true } },
|
|
@@ -51,19 +67,22 @@ let CaptchaService = CaptchaService_1 = class CaptchaService {
|
|
|
51
67
|
if (!profile) {
|
|
52
68
|
throw new common_1.BadRequestException('CAPTCHA integration profile not found.');
|
|
53
69
|
}
|
|
54
|
-
await this.verify(token !== null && token !== void 0 ? token : '', (_a = profile.integration_provider) === null || _a === void 0 ? void 0 : _a.slug, ((_b = profile.config) !== null && _b !== void 0 ? _b : {}));
|
|
70
|
+
await this.verify(token !== null && token !== void 0 ? token : '', (_a = profile.integration_provider) === null || _a === void 0 ? void 0 : _a.slug, ((_b = profile.config) !== null && _b !== void 0 ? _b : {}), context);
|
|
55
71
|
}
|
|
56
72
|
/** Verifies a token against an explicit provider and its credentials. */
|
|
57
|
-
async verify(token, providerSlug, config) {
|
|
73
|
+
async verify(token, providerSlug, config, context = {}) {
|
|
58
74
|
if (!token) {
|
|
59
75
|
throw new common_1.BadRequestException('CAPTCHA token is required.');
|
|
60
76
|
}
|
|
77
|
+
if (token.length > MAX_TOKEN_LENGTH) {
|
|
78
|
+
throw new common_1.BadRequestException('CAPTCHA token is malformed.');
|
|
79
|
+
}
|
|
61
80
|
switch (providerSlug) {
|
|
62
81
|
case 'recaptcha':
|
|
63
|
-
await this.verifyRemote('https://www.google.com/recaptcha/api/siteverify', config
|
|
82
|
+
await this.verifyRemote('https://www.google.com/recaptcha/api/siteverify', config, token, context);
|
|
64
83
|
break;
|
|
65
84
|
case 'cloudflare-turnstile':
|
|
66
|
-
await this.verifyRemote('https://challenges.cloudflare.com/turnstile/v0/siteverify', config
|
|
85
|
+
await this.verifyRemote('https://challenges.cloudflare.com/turnstile/v0/siteverify', config, token, context);
|
|
67
86
|
break;
|
|
68
87
|
case 'altcha':
|
|
69
88
|
this.verifyAltcha(token, config);
|
|
@@ -101,11 +120,65 @@ let CaptchaService = CaptchaService_1 = class CaptchaService {
|
|
|
101
120
|
const value = (_b = (_a = config.site_key) !== null && _a !== void 0 ? _a : config.sitekey) !== null && _b !== void 0 ? _b : config.public_key;
|
|
102
121
|
return value ? String(value) : null;
|
|
103
122
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
123
|
+
/**
|
|
124
|
+
* Hostnames que o perfil aceita, em `config.hostnames` (separados por virgula).
|
|
125
|
+
* Vazio significa "nao confira" - todo perfil ja existente continua valendo.
|
|
126
|
+
*/
|
|
127
|
+
static parseHostnames(config) {
|
|
128
|
+
var _a;
|
|
129
|
+
const raw = (_a = config === null || config === void 0 ? void 0 : config.hostnames) !== null && _a !== void 0 ? _a : config === null || config === void 0 ? void 0 : config.allowed_hostnames;
|
|
130
|
+
return new Set(String(raw !== null && raw !== void 0 ? raw : '')
|
|
131
|
+
.split(',')
|
|
132
|
+
.map((hostname) => hostname.trim().toLowerCase())
|
|
133
|
+
.filter(Boolean));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Chamada canonica de siteverify: manda o IP do visitante, tem timeout, e
|
|
137
|
+
* confere `action` e `hostname` alem do `success`.
|
|
138
|
+
*
|
|
139
|
+
* Toda falha - rede, HTTP nao-2xx, corpo que nao e JSON - vira falha de
|
|
140
|
+
* CAPTCHA. Deixar a excecao subir crua transformaria um solavanco do provedor em
|
|
141
|
+
* 500, e o visitante veria "erro do servidor" no lugar de "tente de novo".
|
|
142
|
+
*/
|
|
143
|
+
async verifyRemote(url, config, token, context) {
|
|
144
|
+
const body = new URLSearchParams({
|
|
145
|
+
secret: config.secret_key,
|
|
146
|
+
response: token,
|
|
147
|
+
});
|
|
148
|
+
if (context.remoteIp) {
|
|
149
|
+
body.set('remoteip', context.remoteIp);
|
|
150
|
+
}
|
|
151
|
+
let result;
|
|
152
|
+
try {
|
|
153
|
+
const response = await fetch(url, {
|
|
154
|
+
method: 'POST',
|
|
155
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
156
|
+
signal: AbortSignal.timeout(SITEVERIFY_TIMEOUT_MS),
|
|
157
|
+
body,
|
|
158
|
+
});
|
|
159
|
+
if (!response.ok) {
|
|
160
|
+
throw new Error(`siteverify ${response.status}`);
|
|
161
|
+
}
|
|
162
|
+
result = (await response.json());
|
|
163
|
+
}
|
|
164
|
+
catch (_a) {
|
|
165
|
+
throw new common_1.BadRequestException('CAPTCHA validation failed.');
|
|
166
|
+
}
|
|
167
|
+
if (!(result === null || result === void 0 ? void 0 : result.success)) {
|
|
168
|
+
throw new common_1.BadRequestException('CAPTCHA validation failed.');
|
|
169
|
+
}
|
|
170
|
+
// As duas checagens abaixo so valem quando os dois lados informaram o campo:
|
|
171
|
+
// o reCAPTCHA v2 nao devolve `action`, e um perfil sem `hostnames` nao pediu
|
|
172
|
+
// conferencia de origem.
|
|
173
|
+
if (context.expectedAction &&
|
|
174
|
+
result.action &&
|
|
175
|
+
result.action !== context.expectedAction) {
|
|
176
|
+
throw new common_1.BadRequestException('CAPTCHA validation failed.');
|
|
177
|
+
}
|
|
178
|
+
const hostnames = CaptchaService_1.parseHostnames(config);
|
|
179
|
+
if (hostnames.size > 0 &&
|
|
180
|
+
result.hostname &&
|
|
181
|
+
!hostnames.has(result.hostname.toLowerCase())) {
|
|
109
182
|
throw new common_1.BadRequestException('CAPTCHA validation failed.');
|
|
110
183
|
}
|
|
111
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captcha.service.js","sourceRoot":"","sources":["../../src/captcha/captcha.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAoD;AACpD,2CAKwB;AACxB,mCAAgD;AAEnC,QAAA,iBAAiB,GAAG;IAC/B,WAAW;IACX,sBAAsB;IACtB,QAAQ;CACA,CAAC;
|
|
1
|
+
{"version":3,"file":"captcha.service.js","sourceRoot":"","sources":["../../src/captcha/captcha.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAoD;AACpD,2CAKwB;AACxB,mCAAgD;AAEnC,QAAA,iBAAiB,GAAG;IAC/B,WAAW;IACX,sBAAsB;IACtB,QAAQ;CACA,CAAC;AAsCX,mFAAmF;AACnF,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,kFAAkF;AAClF,MAAM,qBAAqB,GAAG,KAAM,CAAC;AAErC;;;;;GAKG;AAEI,IAAM,cAAc,sBAApB,MAAM,cAAc;IACzB,YAEmB,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IACrC,CAAC;IAEJ;;;;;;;;;OASG;IACH,KAAK,CAAC,gBAAgB,CACpB,qBAAyD,EACzD,KAAgC,EAChC,UAAgC,EAAE;;QAElC,MAAM,GAAG,GACP,OAAO,qBAAqB,KAAK,QAAQ;YACvC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE;YAC9B,CAAC,CAAC,qBAAqB,CAAC;QAE5B,4EAA4E;QAC5E,iCAAiC;QACjC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,4BAAmB,CAC3B,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GACb,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEzE,MAAM,OAAO,GAAG,MAAO,IAAI,CAAC,MAAc,CAAC,mBAAmB,CAAC,SAAS,CAAC;YACvE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;YAC5D,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI;gBACZ,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;aACjD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,4BAAmB,CAAC,wCAAwC,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CACf,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,EACX,MAAA,OAAO,CAAC,oBAAoB,0CAAE,IAAc,EAC5C,CAAC,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAA2B,EAChD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,MAAM,CACV,KAAa,EACb,YAAoB,EACpB,MAA8B,EAC9B,UAAgC,EAAE;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;YACpC,MAAM,IAAI,4BAAmB,CAAC,6BAA6B,CAAC,CAAC;QAC/D,CAAC;QAED,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,WAAW;gBACd,MAAM,IAAI,CAAC,YAAY,CACrB,iDAAiD,EACjD,MAAM,EACN,KAAK,EACL,OAAO,CACR,CAAC;gBACF,MAAM;YAER,KAAK,sBAAsB;gBACzB,MAAM,IAAI,CAAC,YAAY,CACrB,2DAA2D,EAC3D,MAAM,EACN,KAAK,EACL,OAAO,CACR,CAAC;gBACF,MAAM;YAER,KAAK,QAAQ;gBACX,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACjC,MAAM;YAER;gBACE,MAAM,IAAI,4BAAmB,CAC3B,iCAAiC,YAAY,GAAG,CACjD,CAAC;QACN,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CACnB,oBAA+C,EAC/C,OAAO,GAAG,IAAI;;QAEd,IAAI,CAAC,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,OAAO,GAAG,MAAO,IAAI,CAAC,MAAc,CAAC,mBAAmB,CAAC,SAAS,CAAC;YACvE,KAAK,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE;YACnC,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI;gBACZ,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;aACjD;SACF,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,oBAAoB,0CAAE,IAAI,mCAAI,IAAI;YAC1D,QAAQ,EAAE,gBAAc,CAAC,cAAc,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,IAAI,CAAC;SACjE,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,cAAc,CACnB,MAAsC;;QAEtC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,KAAK,GAAG,MAAA,MAAA,MAAM,CAAC,QAAQ,mCAAI,MAAM,CAAC,OAAO,mCAAI,MAAM,CAAC,UAAU,CAAC;QACrE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,MAAsC;;QAC1D,MAAM,GAAG,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,mCAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,iBAAiB,CAAC;QAC3D,OAAO,IAAI,GAAG,CACZ,MAAM,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE,CAAC;aACd,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;aAChD,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,YAAY,CACxB,GAAW,EACX,MAA8B,EAC9B,KAAa,EACb,OAA6B;QAE7B,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,MAAM,EAAE,MAAM,CAAC,UAAU;YACzB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;gBAChE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC;gBAClD,IAAI;aACL,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;QACzD,CAAC;QAAC,WAAM,CAAC;YACP,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,EAAE,CAAC;YACrB,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;QAED,6EAA6E;QAC7E,6EAA6E;QAC7E,yBAAyB;QACzB,IACE,OAAO,CAAC,cAAc;YACtB,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,cAAc,EACxC,CAAC;YACD,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,SAAS,GAAG,gBAAc,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACxD,IACE,SAAS,CAAC,IAAI,GAAG,CAAC;YAClB,MAAM,CAAC,QAAQ;YACf,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAC7C,CAAC;YACD,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,YAAY,CAAC,KAAa,EAAE,MAA8B;QAChE,IAAI,OAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,CAAC;QAAC,WAAM,CAAC;YACP,MAAM,IAAI,4BAAmB,CAAC,+BAA+B,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC;aAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aAC7C,MAAM,CAAC,KAAK,CAAC,CAAC;QACjB,IAAI,IAAI,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;aAC/C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;aACzB,MAAM,CAAC,KAAK,CAAC,CAAC;QACjB,IAAI,IAAI,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF,CAAA;AAnPY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,0BAAa,CAAC,CAAC,CAAA;qCACf,0BAAa;GAH7B,cAAc,CAmP1B"}
|