@hed-hog/core 0.0.398 → 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 +30 -6
- 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 +78 -4
- 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 +385 -36
- 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.controller.d.ts +9 -9
- package/dist/pairing/pairing.service.d.ts +15 -11
- 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 +8 -6
- 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 +432 -30
- 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
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Identifica o tipo real de um arquivo pelos primeiros bytes, para que o mimetype
|
|
4
|
+
* declarado por quem envia não seja a única palavra sobre o que está sendo gravado.
|
|
5
|
+
*
|
|
6
|
+
* Hoje o `Content-Type` do multipart é a fonte de verdade sempre que vem concreto
|
|
7
|
+
* (`resolveEffectiveMimetype` no `FileService` só recorre ao conteúdo quando o caller
|
|
8
|
+
* manda vazio ou `application/octet-stream`), então um executável enviado como
|
|
9
|
+
* `image/png` passa direto pelo `storage-accept-mimetype`. Nas origens novas do MCP o
|
|
10
|
+
* cliente escolhe livremente o `mimeType`, o que tornaria essa brecha trivial de usar.
|
|
11
|
+
*
|
|
12
|
+
* Cobre o conjunto de opções do `storage-accept-mimetype` e nada além: a função não é
|
|
13
|
+
* um detector geral, é o contraditório do que foi declarado. Quando o formato não está
|
|
14
|
+
* nesta lista ela devolve `null`, e quem chama mantém o tipo declarado — recusar o que
|
|
15
|
+
* não se sabe reconhecer barraria CSV, OFX e afins, que são justamente o insumo do
|
|
16
|
+
* `statements.import`.
|
|
17
|
+
*
|
|
18
|
+
* Não usa `file-type`: da v19 em diante o pacote é ESM puro e quebraria o build CJS
|
|
19
|
+
* destas libraries. Os formatos aqui têm assinatura estável e curta.
|
|
20
|
+
*
|
|
21
|
+
* Existem dois primos, e a diferença entre eles e este é de política, não de descuido:
|
|
22
|
+
* `cms/src/form/cms-form-file-sniffer.ts` e
|
|
23
|
+
* `operations/src/task-intake/task-intake-file-sniffer.ts` usam allowlist **fechada** —
|
|
24
|
+
* o que não é reconhecido é recusado — porque servem endpoints anônimos, onde o mimetype
|
|
25
|
+
* declarado não vale nada e o conjunto aceito é estreito (print e vídeo do problema).
|
|
26
|
+
* Aqui a política é aberta: o caminho é autenticado e precisa continuar aceitando CSV e
|
|
27
|
+
* OFX, que não têm assinatura, para o `finance.statements.import`. Unificar os três
|
|
28
|
+
* significaria parametrizar essa política através de uma fronteira de segurança, e
|
|
29
|
+
* afrouxar por acidente o endpoint anônimo é o risco que isso carrega — é mudança
|
|
30
|
+
* própria, não carona nesta.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.MIMETYPE_SNIFF_BYTES = void 0;
|
|
34
|
+
exports.detectMimetypeFromBytes = detectMimetypeFromBytes;
|
|
35
|
+
exports.findMimetypeConflict = findMimetypeConflict;
|
|
36
|
+
/** Quanto do início do arquivo basta para todas as assinaturas abaixo. */
|
|
37
|
+
exports.MIMETYPE_SNIFF_BYTES = 4096;
|
|
38
|
+
const ascii = (buffer, offset, text) => buffer.length >= offset + text.length &&
|
|
39
|
+
buffer.toString('latin1', offset, offset + text.length) === text;
|
|
40
|
+
const bytes = (buffer, offset, ...expected) => {
|
|
41
|
+
if (buffer.length < offset + expected.length) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return expected.every((byte, index) => buffer[offset + index] === byte);
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* ZIP é o container de docx/xlsx/pptx: os três começam com `PK\x03\x04` e só se
|
|
48
|
+
* distinguem pelo nome das entradas. O `[Content_Types].xml` de um OOXML declara o tipo
|
|
49
|
+
* do documento, e a primeira entrada costuma ser `word/`, `xl/` ou `ppt/` — procuramos
|
|
50
|
+
* essas marcas no cabeçalho lido, sem descompactar.
|
|
51
|
+
*/
|
|
52
|
+
const sniffZipFlavor = (buffer) => {
|
|
53
|
+
const head = buffer.toString('latin1', 0, Math.min(buffer.length, exports.MIMETYPE_SNIFF_BYTES));
|
|
54
|
+
if (head.includes('word/')) {
|
|
55
|
+
return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
|
|
56
|
+
}
|
|
57
|
+
if (head.includes('xl/')) {
|
|
58
|
+
return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
|
|
59
|
+
}
|
|
60
|
+
if (head.includes('ppt/')) {
|
|
61
|
+
return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
|
|
62
|
+
}
|
|
63
|
+
return 'application/zip';
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* `ftyp` na posição 4 marca a família ISO-BMFF. A marca de quatro letras que segue diz
|
|
67
|
+
* se é vídeo ou áudio; `M4A ` é o único caso de áudio que interessa aqui.
|
|
68
|
+
*/
|
|
69
|
+
const sniffIsoBmff = (buffer) => {
|
|
70
|
+
const brand = buffer.toString('latin1', 8, 12);
|
|
71
|
+
return brand.startsWith('M4A') ? 'audio/mp4' : 'video/mp4';
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Tipo real do conteúdo, ou `null` quando a assinatura não é reconhecida.
|
|
75
|
+
*
|
|
76
|
+
* Só precisa dos primeiros bytes — passe o cabeçalho quando o arquivo for grande, e
|
|
77
|
+
* nunca o arquivo inteiro só para chamar esta função.
|
|
78
|
+
*/
|
|
79
|
+
function detectMimetypeFromBytes(buffer) {
|
|
80
|
+
if (!buffer || buffer.length < 4) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
if (ascii(buffer, 0, '%PDF-')) {
|
|
84
|
+
return 'application/pdf';
|
|
85
|
+
}
|
|
86
|
+
if (bytes(buffer, 0, 0xff, 0xd8, 0xff)) {
|
|
87
|
+
return 'image/jpeg';
|
|
88
|
+
}
|
|
89
|
+
if (bytes(buffer, 0, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a)) {
|
|
90
|
+
return 'image/png';
|
|
91
|
+
}
|
|
92
|
+
if (ascii(buffer, 0, 'GIF87a') || ascii(buffer, 0, 'GIF89a')) {
|
|
93
|
+
return 'image/gif';
|
|
94
|
+
}
|
|
95
|
+
// RIFF é container: os bytes 8..11 dizem o que ele carrega.
|
|
96
|
+
if (ascii(buffer, 0, 'RIFF')) {
|
|
97
|
+
if (ascii(buffer, 8, 'WEBP')) {
|
|
98
|
+
return 'image/webp';
|
|
99
|
+
}
|
|
100
|
+
if (ascii(buffer, 8, 'WAVE')) {
|
|
101
|
+
return 'audio/wav';
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
if (ascii(buffer, 0, 'fLaC')) {
|
|
106
|
+
return 'audio/flac';
|
|
107
|
+
}
|
|
108
|
+
if (ascii(buffer, 0, 'OggS')) {
|
|
109
|
+
return 'audio/ogg';
|
|
110
|
+
}
|
|
111
|
+
// ID3 é a tag de metadados que antecede o quadro MPEG; 0xFF 0xFB/0xF3/0xF2 é o quadro
|
|
112
|
+
// cru, sem tag. `audio/mp3` e `audio/mpeg` são o mesmo formato com dois nomes, e a
|
|
113
|
+
// allowlist aceita os dois — devolvemos o nome canônico e o cotejo trata o sinônimo.
|
|
114
|
+
if (ascii(buffer, 0, 'ID3') || bytes(buffer, 0, 0xff, 0xfb) || bytes(buffer, 0, 0xff, 0xf3) || bytes(buffer, 0, 0xff, 0xf2)) {
|
|
115
|
+
return 'audio/mpeg';
|
|
116
|
+
}
|
|
117
|
+
if (ascii(buffer, 4, 'ftyp')) {
|
|
118
|
+
return sniffIsoBmff(buffer);
|
|
119
|
+
}
|
|
120
|
+
// `PK\x03\x04` é o arquivo; `PK\x05\x06` e `PK\x07\x08` são ZIP vazio e spanned.
|
|
121
|
+
if (bytes(buffer, 0, 0x50, 0x4b, 0x03, 0x04) || bytes(buffer, 0, 0x50, 0x4b, 0x05, 0x06) || bytes(buffer, 0, 0x50, 0x4b, 0x07, 0x08)) {
|
|
122
|
+
return sniffZipFlavor(buffer);
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Sinônimos que nomeiam o mesmo formato. Recusar um upload porque o cliente escreveu
|
|
128
|
+
* `audio/mp3` onde os bytes dizem `audio/mpeg` seria falso positivo puro.
|
|
129
|
+
*/
|
|
130
|
+
const EQUIVALENT_MIMETYPES = [
|
|
131
|
+
['audio/mp3', 'audio/mpeg'],
|
|
132
|
+
['audio/wav', 'audio/x-wav', 'audio/wave'],
|
|
133
|
+
['image/jpeg', 'image/jpg'],
|
|
134
|
+
['video/mp4', 'audio/mp4'],
|
|
135
|
+
];
|
|
136
|
+
const isEquivalent = (a, b) => EQUIVALENT_MIMETYPES.some((group) => group.includes(a) && group.includes(b));
|
|
137
|
+
const ZIP_FAMILY = [
|
|
138
|
+
'application/zip',
|
|
139
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
140
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
141
|
+
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
142
|
+
];
|
|
143
|
+
/**
|
|
144
|
+
* Tipos que esta função sabe confirmar positivamente.
|
|
145
|
+
*
|
|
146
|
+
* Declarar um deles é assumir um formato com assinatura conhecida, então o conteúdo tem
|
|
147
|
+
* de exibi-la. Fora desta lista (CSV, OFX, texto solto) não há o que conferir, e a
|
|
148
|
+
* ausência de assinatura não é indício de nada.
|
|
149
|
+
*/
|
|
150
|
+
const VERIFIABLE_MIMETYPES = new Set([
|
|
151
|
+
'application/pdf',
|
|
152
|
+
'image/jpeg',
|
|
153
|
+
'image/jpg',
|
|
154
|
+
'image/png',
|
|
155
|
+
'image/gif',
|
|
156
|
+
'image/webp',
|
|
157
|
+
'audio/mp3',
|
|
158
|
+
'audio/mpeg',
|
|
159
|
+
'audio/wav',
|
|
160
|
+
'audio/x-wav',
|
|
161
|
+
'audio/wave',
|
|
162
|
+
'audio/flac',
|
|
163
|
+
'audio/ogg',
|
|
164
|
+
'audio/mp4',
|
|
165
|
+
'video/mp4',
|
|
166
|
+
...ZIP_FAMILY,
|
|
167
|
+
]);
|
|
168
|
+
/**
|
|
169
|
+
* Formatos que nunca estão na allowlist e que caracterizam conteúdo executável.
|
|
170
|
+
*
|
|
171
|
+
* Não são detectados para serem aceitos — são detectados para que a recusa diga o que o
|
|
172
|
+
* arquivo realmente é, em vez de um genérico "não confere".
|
|
173
|
+
*/
|
|
174
|
+
const EXECUTABLE_SIGNATURES = [
|
|
175
|
+
{ test: (b) => ascii(b, 0, 'MZ'), label: 'a Windows executable' },
|
|
176
|
+
{ test: (b) => bytes(b, 0, 0x7f, 0x45, 0x4c, 0x46), label: 'an ELF executable' },
|
|
177
|
+
{ test: (b) => bytes(b, 0, 0xcf, 0xfa, 0xed, 0xfe), label: 'a Mach-O executable' },
|
|
178
|
+
{ test: (b) => bytes(b, 0, 0xca, 0xfe, 0xba, 0xbe), label: 'a Java class or fat binary' },
|
|
179
|
+
{ test: (b) => ascii(b, 0, '#!'), label: 'a script with a shebang' },
|
|
180
|
+
];
|
|
181
|
+
const describeExecutable = (buffer) => { var _a, _b; return (_b = (_a = EXECUTABLE_SIGNATURES.find((entry) => entry.test(buffer))) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : null; };
|
|
182
|
+
/**
|
|
183
|
+
* Confronta o tipo declarado com o que os bytes dizem.
|
|
184
|
+
*
|
|
185
|
+
* Devolve `null` quando não há conflito, ou uma descrição do que o conteúdo realmente é —
|
|
186
|
+
* é ela que a mensagem de erro mostra, porque "declarado X, conteúdo Y" é o que permite
|
|
187
|
+
* corrigir a chamada.
|
|
188
|
+
*
|
|
189
|
+
* A regra tem dois lados, e o segundo é o que fecha o buraco:
|
|
190
|
+
*
|
|
191
|
+
* 1. assinatura reconhecida que contradiz o declarado → conflito;
|
|
192
|
+
* 2. assinatura NÃO reconhecida, mas o tipo declarado é um dos verificáveis → também
|
|
193
|
+
* conflito. Sem isso, bastaria declarar `application/pdf` num executável para
|
|
194
|
+
* passar: ele não tem assinatura de PDF, mas também não tem nenhuma das que o
|
|
195
|
+
* sniffer conhece, e "desconhecido" seria lido como "sem objeção".
|
|
196
|
+
*
|
|
197
|
+
* Conteúdo sem assinatura declarado como `text/csv` continua passando, que é o caso do
|
|
198
|
+
* `finance.statements.import`.
|
|
199
|
+
*
|
|
200
|
+
* ZIP merece nota: um `.docx` declarado como `application/zip` não é conflito, já que ele
|
|
201
|
+
* é literalmente um zip. O contrário também não, pelo mesmo motivo.
|
|
202
|
+
*/
|
|
203
|
+
function findMimetypeConflict(declared, buffer) {
|
|
204
|
+
if (!declared) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
const detected = detectMimetypeFromBytes(buffer);
|
|
208
|
+
if (detected) {
|
|
209
|
+
if (detected === declared || isEquivalent(detected, declared)) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
if (ZIP_FAMILY.includes(detected) && ZIP_FAMILY.includes(declared)) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
return detected;
|
|
216
|
+
}
|
|
217
|
+
const executable = describeExecutable(buffer);
|
|
218
|
+
if (executable) {
|
|
219
|
+
return executable;
|
|
220
|
+
}
|
|
221
|
+
if (VERIFIABLE_MIMETYPES.has(declared)) {
|
|
222
|
+
return `not recognizable as ${declared}`;
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=mimetype-sniff.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mimetype-sniff.util.js","sourceRoot":"","sources":["../../src/file/mimetype-sniff.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Motivo da recusa, ou `null` quando o endereço é público.
|
|
3
|
+
*
|
|
4
|
+
* IPv6 mapeado (`::ffff:169.254.169.254`) é desempacotado antes do cotejo: sem isso, o
|
|
5
|
+
* endpoint de metadados volta a ser alcançável pela notação de seis grupos.
|
|
6
|
+
*/
|
|
7
|
+
export declare function describeBlockedAddress(address: string): string | null;
|
|
8
|
+
export interface RemoteFetchOptions {
|
|
9
|
+
/** Teto de bytes; o download aborta assim que o passa, sem bufferizar o resto. */
|
|
10
|
+
maxBytes: number;
|
|
11
|
+
/** Hosts liberados. Vazio (o default) = qualquer host público. */
|
|
12
|
+
allowedHosts?: string[];
|
|
13
|
+
timeoutMs?: number;
|
|
14
|
+
maxRedirects?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface RemoteFetchResult {
|
|
17
|
+
buffer: Buffer;
|
|
18
|
+
/** `Content-Type` da resposta, sem parâmetros. Informativo: quem manda é o conteúdo. */
|
|
19
|
+
contentType: string | null;
|
|
20
|
+
/** Host de onde o conteúdo veio de fato, depois de seguidos os redirects. */
|
|
21
|
+
finalHost: string;
|
|
22
|
+
finalUrl: string;
|
|
23
|
+
}
|
|
24
|
+
/** Valida esquema, credenciais e allowlist. Separada para poder ser testada sozinha. */
|
|
25
|
+
export declare function assertFetchableUrl(raw: string, allowedHosts?: string[]): URL;
|
|
26
|
+
/**
|
|
27
|
+
* Baixa a URL para memória, recusando destino privado e conteúdo acima do teto.
|
|
28
|
+
*
|
|
29
|
+
* Os redirects são seguidos à mão (`maxRedirects: 0` no axios) porque cada salto é um
|
|
30
|
+
* destino novo que precisa passar pela mesma validação — deixar o axios seguir sozinho
|
|
31
|
+
* entregaria o segundo salto sem conferência, que é justamente como se contorna uma
|
|
32
|
+
* allowlist que só olha a URL inicial.
|
|
33
|
+
*/
|
|
34
|
+
export declare function fetchRemoteFile(rawUrl: string, options: RemoteFetchOptions): Promise<RemoteFetchResult>;
|
|
35
|
+
//# sourceMappingURL=remote-fetch.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-fetch.util.d.ts","sourceRoot":"","sources":["../../src/file/remote-fetch.util.ts"],"names":[],"mappings":"AAmDA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsCrE;AAsDD,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAqC5E;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CA0E5B"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.describeBlockedAddress = describeBlockedAddress;
|
|
7
|
+
exports.assertFetchableUrl = assertFetchableUrl;
|
|
8
|
+
exports.fetchRemoteFile = fetchRemoteFile;
|
|
9
|
+
const common_1 = require("@nestjs/common");
|
|
10
|
+
const http_1 = require("http");
|
|
11
|
+
const https_1 = require("https");
|
|
12
|
+
const net_1 = require("net");
|
|
13
|
+
const dns_1 = require("dns");
|
|
14
|
+
const axios_1 = __importDefault(require("axios"));
|
|
15
|
+
/**
|
|
16
|
+
* Download de URL informada por quem chama a tool (`fileUrl`).
|
|
17
|
+
*
|
|
18
|
+
* É a única superfície do sistema em que um endereço escolhido pelo usuário vira uma
|
|
19
|
+
* requisição saindo de dentro do cluster, então a guarda de SSRF mora aqui. O repositório
|
|
20
|
+
* não tinha nada equivalente: a única util de URL existente (`assertHttpUrl`, em
|
|
21
|
+
* `integration-profile/testers/http-probe.ts`) **libera faixas privadas de propósito**,
|
|
22
|
+
* porque serve para Evolution e k8s auto-hospedados — usá-la aqui seria o oposto do que
|
|
23
|
+
* se precisa.
|
|
24
|
+
*
|
|
25
|
+
* O ponto não óbvio é *quando* validar o IP. Resolver o nome, aprovar e só então deixar o
|
|
26
|
+
* axios conectar abre uma janela: entre a checagem e a conexão o DNS pode responder outra
|
|
27
|
+
* coisa (rebinding), e quem conecta é o agente, não nós. Por isso a validação é instalada
|
|
28
|
+
* como o `lookup` do agente — ela roda no momento em que o socket é aberto, sobre o mesmo
|
|
29
|
+
* endereço que será usado. Cada redirect repete tudo, porque o destino muda.
|
|
30
|
+
*/
|
|
31
|
+
const PRIVATE_IPV4_RULES = [
|
|
32
|
+
{ cidr: '0.0.0.0/8', reason: 'this-network' },
|
|
33
|
+
{ cidr: '10.0.0.0/8', reason: 'private' },
|
|
34
|
+
{ cidr: '100.64.0.0/10', reason: 'carrier-grade NAT' },
|
|
35
|
+
{ cidr: '127.0.0.0/8', reason: 'loopback' },
|
|
36
|
+
{ cidr: '169.254.0.0/16', reason: 'link-local / cloud metadata' },
|
|
37
|
+
{ cidr: '172.16.0.0/12', reason: 'private' },
|
|
38
|
+
{ cidr: '192.0.0.0/24', reason: 'IETF protocol assignments' },
|
|
39
|
+
{ cidr: '192.0.2.0/24', reason: 'documentation' },
|
|
40
|
+
{ cidr: '192.168.0.0/16', reason: 'private' },
|
|
41
|
+
{ cidr: '198.18.0.0/15', reason: 'benchmarking' },
|
|
42
|
+
{ cidr: '198.51.100.0/24', reason: 'documentation' },
|
|
43
|
+
{ cidr: '203.0.113.0/24', reason: 'documentation' },
|
|
44
|
+
{ cidr: '224.0.0.0/4', reason: 'multicast' },
|
|
45
|
+
{ cidr: '240.0.0.0/4', reason: 'reserved' },
|
|
46
|
+
];
|
|
47
|
+
const ipv4ToInt = (ip) => ip.split('.').reduce((acc, part) => (acc << 8) + Number(part), 0) >>> 0;
|
|
48
|
+
const matchesCidr = (ip, cidr) => {
|
|
49
|
+
const [range, bitsRaw] = cidr.split('/');
|
|
50
|
+
const bits = Number(bitsRaw);
|
|
51
|
+
const mask = bits === 0 ? 0 : (0xffffffff << (32 - bits)) >>> 0;
|
|
52
|
+
return (ipv4ToInt(ip) & mask) === (ipv4ToInt(range) & mask);
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Motivo da recusa, ou `null` quando o endereço é público.
|
|
56
|
+
*
|
|
57
|
+
* IPv6 mapeado (`::ffff:169.254.169.254`) é desempacotado antes do cotejo: sem isso, o
|
|
58
|
+
* endpoint de metadados volta a ser alcançável pela notação de seis grupos.
|
|
59
|
+
*/
|
|
60
|
+
function describeBlockedAddress(address) {
|
|
61
|
+
const value = String(address || '').trim().toLowerCase();
|
|
62
|
+
if (!value) {
|
|
63
|
+
return 'empty address';
|
|
64
|
+
}
|
|
65
|
+
const mapped = value.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/);
|
|
66
|
+
const candidate = mapped ? mapped[1] : value;
|
|
67
|
+
const version = (0, net_1.isIP)(candidate);
|
|
68
|
+
if (version === 4) {
|
|
69
|
+
const rule = PRIVATE_IPV4_RULES.find((entry) => matchesCidr(candidate, entry.cidr));
|
|
70
|
+
return rule ? `${rule.reason} address (${candidate})` : null;
|
|
71
|
+
}
|
|
72
|
+
if (version === 6) {
|
|
73
|
+
if (candidate === '::' || candidate === '::1') {
|
|
74
|
+
return `loopback address (${candidate})`;
|
|
75
|
+
}
|
|
76
|
+
// fc00::/7 (unique local) e fe80::/10 (link-local, onde vive fe80::a9fe:a9fe).
|
|
77
|
+
if (/^f[cd]/.test(candidate)) {
|
|
78
|
+
return `unique local address (${candidate})`;
|
|
79
|
+
}
|
|
80
|
+
if (/^fe[89ab]/.test(candidate)) {
|
|
81
|
+
return `link-local address (${candidate})`;
|
|
82
|
+
}
|
|
83
|
+
if (/^ff/.test(candidate)) {
|
|
84
|
+
return `multicast address (${candidate})`;
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return `unresolvable address (${address})`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `lookup` compatível com o do Node que recusa antes de devolver o endereço ao agente.
|
|
92
|
+
*
|
|
93
|
+
* O agente chama isto para cada conexão, então é aqui que a decisão vale — e não numa
|
|
94
|
+
* checagem prévia que o DNS poderia contradizer depois.
|
|
95
|
+
*/
|
|
96
|
+
const guardedLookup = (hostname, options, callback) => {
|
|
97
|
+
const done = typeof options === 'function' ? options : callback;
|
|
98
|
+
const opts = typeof options === 'function' ? {} : options;
|
|
99
|
+
(0, dns_1.lookup)(hostname, Object.assign(Object.assign({}, opts), { all: true }), (err, addresses) => {
|
|
100
|
+
if (err) {
|
|
101
|
+
done(err);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const list = Array.isArray(addresses) ? addresses : [addresses];
|
|
105
|
+
if (list.length === 0) {
|
|
106
|
+
done(Object.assign(new Error(`Host did not resolve: ${hostname}`), { code: 'ENOTFOUND' }));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Basta um endereço proibido para recusar o host inteiro: aceitar os "bons" deixaria
|
|
110
|
+
// o resultado na mão de qual entrada o resolvedor devolve primeiro.
|
|
111
|
+
for (const entry of list) {
|
|
112
|
+
const blocked = describeBlockedAddress(entry.address);
|
|
113
|
+
if (blocked) {
|
|
114
|
+
done(Object.assign(new Error(`Blocked ${blocked} for host ${hostname}`), {
|
|
115
|
+
code: 'EBLOCKED',
|
|
116
|
+
}));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const first = list[0];
|
|
121
|
+
if (opts === null || opts === void 0 ? void 0 : opts.all) {
|
|
122
|
+
done(null, list);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
done(null, first.address, first.family);
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const DEFAULT_TIMEOUT_MS = 15000;
|
|
129
|
+
const DEFAULT_MAX_REDIRECTS = 3;
|
|
130
|
+
/** Valida esquema, credenciais e allowlist. Separada para poder ser testada sozinha. */
|
|
131
|
+
function assertFetchableUrl(raw, allowedHosts) {
|
|
132
|
+
let url;
|
|
133
|
+
try {
|
|
134
|
+
url = new URL(String(raw || '').trim());
|
|
135
|
+
}
|
|
136
|
+
catch (_a) {
|
|
137
|
+
throw new common_1.BadRequestException(`fileUrl is not a valid URL`);
|
|
138
|
+
}
|
|
139
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
140
|
+
throw new common_1.BadRequestException(`fileUrl must use http or https, got ${url.protocol.replace(':', '') || 'none'}`);
|
|
141
|
+
}
|
|
142
|
+
// Credencial na URL viraria header de autenticação para um destino escolhido por quem
|
|
143
|
+
// chama — e apareceria no log de auditoria junto com o resto da entrada.
|
|
144
|
+
if (url.username || url.password) {
|
|
145
|
+
throw new common_1.BadRequestException(`fileUrl must not carry credentials`);
|
|
146
|
+
}
|
|
147
|
+
const allow = (allowedHosts || []).map((h) => h.trim().toLowerCase()).filter(Boolean);
|
|
148
|
+
if (allow.length > 0) {
|
|
149
|
+
const host = url.hostname.toLowerCase();
|
|
150
|
+
const permitted = allow.some((entry) => host === entry || host.endsWith(`.${entry}`));
|
|
151
|
+
if (!permitted) {
|
|
152
|
+
throw new common_1.BadRequestException(`fileUrl host is not allowed: ${host}. Allowed hosts come from the mcp-file-url-allowed-hosts setting.`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return url;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Baixa a URL para memória, recusando destino privado e conteúdo acima do teto.
|
|
159
|
+
*
|
|
160
|
+
* Os redirects são seguidos à mão (`maxRedirects: 0` no axios) porque cada salto é um
|
|
161
|
+
* destino novo que precisa passar pela mesma validação — deixar o axios seguir sozinho
|
|
162
|
+
* entregaria o segundo salto sem conferência, que é justamente como se contorna uma
|
|
163
|
+
* allowlist que só olha a URL inicial.
|
|
164
|
+
*/
|
|
165
|
+
async function fetchRemoteFile(rawUrl, options) {
|
|
166
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
167
|
+
const maxRedirects = (_a = options.maxRedirects) !== null && _a !== void 0 ? _a : DEFAULT_MAX_REDIRECTS;
|
|
168
|
+
const timeout = (_b = options.timeoutMs) !== null && _b !== void 0 ? _b : DEFAULT_TIMEOUT_MS;
|
|
169
|
+
let current = assertFetchableUrl(rawUrl, options.allowedHosts);
|
|
170
|
+
for (let hop = 0; hop <= maxRedirects; hop += 1) {
|
|
171
|
+
const isHttps = current.protocol === 'https:';
|
|
172
|
+
const AgentCtor = isHttps ? https_1.Agent : http_1.Agent;
|
|
173
|
+
const agent = new AgentCtor({ lookup: guardedLookup });
|
|
174
|
+
let response;
|
|
175
|
+
try {
|
|
176
|
+
response = await axios_1.default.get(current.toString(), Object.assign({ responseType: 'stream', timeout, maxRedirects: 0,
|
|
177
|
+
// Teto redundante com o contador abaixo, mas ele corta antes de o axios montar
|
|
178
|
+
// qualquer buffer quando o servidor declara o tamanho.
|
|
179
|
+
maxContentLength: options.maxBytes, maxBodyLength: options.maxBytes, decompress: true, validateStatus: (status) => status < 400 }, (isHttps ? { httpsAgent: agent } : { httpAgent: agent })));
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if ((error === null || error === void 0 ? void 0 : error.code) === 'EBLOCKED') {
|
|
183
|
+
throw new common_1.BadRequestException(`fileUrl rejected: ${error.message}`);
|
|
184
|
+
}
|
|
185
|
+
if ((_c = error === null || error === void 0 ? void 0 : error.response) === null || _c === void 0 ? void 0 : _c.status) {
|
|
186
|
+
throw new common_1.BadRequestException(`fileUrl responded with HTTP ${error.response.status}`);
|
|
187
|
+
}
|
|
188
|
+
throw new common_1.BadRequestException(`fileUrl download failed: ${(error === null || error === void 0 ? void 0 : error.message) || error}`);
|
|
189
|
+
}
|
|
190
|
+
const status = Number(response.status);
|
|
191
|
+
if (status >= 300 && status < 400) {
|
|
192
|
+
const location = (_d = response.headers) === null || _d === void 0 ? void 0 : _d.location;
|
|
193
|
+
(_f = (_e = response.data) === null || _e === void 0 ? void 0 : _e.destroy) === null || _f === void 0 ? void 0 : _f.call(_e);
|
|
194
|
+
if (!location) {
|
|
195
|
+
throw new common_1.BadRequestException(`fileUrl redirected without a location header`);
|
|
196
|
+
}
|
|
197
|
+
if (hop === maxRedirects) {
|
|
198
|
+
throw new common_1.BadRequestException(`fileUrl exceeded the redirect limit of ${maxRedirects}`);
|
|
199
|
+
}
|
|
200
|
+
current = assertFetchableUrl(new URL(location, current).toString(), options.allowedHosts);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const buffer = await readStreamWithLimit(response.data, options.maxBytes);
|
|
204
|
+
return {
|
|
205
|
+
buffer,
|
|
206
|
+
contentType: String(((_g = response.headers) === null || _g === void 0 ? void 0 : _g['content-type']) || '').split(';')[0] || null,
|
|
207
|
+
finalHost: current.hostname,
|
|
208
|
+
finalUrl: current.toString(),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
throw new common_1.BadRequestException(`fileUrl exceeded the redirect limit of ${maxRedirects}`);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Acumula o stream até o teto e aborta na primeira parte que o ultrapassa.
|
|
215
|
+
*
|
|
216
|
+
* `maxContentLength` do axios só vale quando o servidor declara `Content-Length`; sem o
|
|
217
|
+
* contador, uma resposta sem tamanho declarado encheria a memória do pod.
|
|
218
|
+
*/
|
|
219
|
+
function readStreamWithLimit(stream, maxBytes) {
|
|
220
|
+
return new Promise((resolve, reject) => {
|
|
221
|
+
const chunks = [];
|
|
222
|
+
let total = 0;
|
|
223
|
+
stream.on('data', (chunk) => {
|
|
224
|
+
total += chunk.length;
|
|
225
|
+
if (total > maxBytes) {
|
|
226
|
+
stream.destroy();
|
|
227
|
+
reject(new common_1.BadRequestException(`fileUrl content exceeds the maximum of ${maxBytes} bytes`));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
chunks.push(Buffer.from(chunk));
|
|
231
|
+
});
|
|
232
|
+
stream.on('end', () => resolve(Buffer.concat(chunks)));
|
|
233
|
+
stream.on('error', (error) => reject(new common_1.BadRequestException(`fileUrl download failed: ${(error === null || error === void 0 ? void 0 : error.message) || error}`)));
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=remote-fetch.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-fetch.util.js","sourceRoot":"","sources":["../../src/file/remote-fetch.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export declare class StartImpersonationDTO {
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Chave do app de destino em `app-urls`. Espelha
|
|
4
|
+
* `ImpersonationService.REDEEMABLE_APPS`: app novo entra nos dois lugares.
|
|
5
|
+
*/
|
|
3
6
|
app: string;
|
|
4
7
|
/** Justificativa livre do operador; vai para a trilha de auditoria. */
|
|
5
8
|
reason?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-impersonation.dto.d.ts","sourceRoot":"","sources":["../../../src/impersonation/dto/start-impersonation.dto.ts"],"names":[],"mappings":"AAEA,qBAAa,qBAAqB;IAChC
|
|
1
|
+
{"version":3,"file":"start-impersonation.dto.d.ts","sourceRoot":"","sources":["../../../src/impersonation/dto/start-impersonation.dto.ts"],"names":[],"mappings":"AAEA,qBAAa,qBAAqB;IAChC;;;OAGG;IAEH,GAAG,EAAE,MAAM,CAAC;IAEZ,uEAAuE;IAIvE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -15,7 +15,7 @@ class StartImpersonationDTO {
|
|
|
15
15
|
}
|
|
16
16
|
exports.StartImpersonationDTO = StartImpersonationDTO;
|
|
17
17
|
__decorate([
|
|
18
|
-
(0, class_validator_1.IsIn)(['admin', 'class', 'partners']),
|
|
18
|
+
(0, class_validator_1.IsIn)(['admin', 'class', 'partners', 'training']),
|
|
19
19
|
__metadata("design:type", String)
|
|
20
20
|
], StartImpersonationDTO.prototype, "app", void 0);
|
|
21
21
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-impersonation.dto.js","sourceRoot":"","sources":["../../../src/impersonation/dto/start-impersonation.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAwE;AAExE,MAAa,qBAAqB;
|
|
1
|
+
{"version":3,"file":"start-impersonation.dto.js","sourceRoot":"","sources":["../../../src/impersonation/dto/start-impersonation.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAwE;AAExE,MAAa,qBAAqB;CAajC;AAbD,sDAaC;AAPC;IADC,IAAA,sBAAI,EAAC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;;kDACrC;AAMZ;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;qDACC"}
|
|
@@ -47,7 +47,7 @@ export declare class ImpersonationService {
|
|
|
47
47
|
private readonly logger;
|
|
48
48
|
/** Curto: o codigo so precisa sobreviver ao carregamento da aba nova. */
|
|
49
49
|
private readonly codeTtlMs;
|
|
50
|
-
/** Caminho da tela de resgate, igual
|
|
50
|
+
/** Caminho da tela de resgate, igual em todos os apps. */
|
|
51
51
|
static readonly REDEEM_PATH = "/simulacao";
|
|
52
52
|
/**
|
|
53
53
|
* Simular quem ja e administrador nao ajuda em nada no suporte e transformaria
|
|
@@ -55,8 +55,13 @@ export declare class ImpersonationService {
|
|
|
55
55
|
*/
|
|
56
56
|
private static readonly BLOCKED_TARGET_ROLES;
|
|
57
57
|
/**
|
|
58
|
-
* Apps com tela de resgate
|
|
59
|
-
* @hed-hog/next-app-provider
|
|
58
|
+
* Apps com tela de resgate em `/simulacao`. `training` nao usa o
|
|
59
|
+
* @hed-hog/next-app-provider — tem AuthProvider proprio —, entao a tela de
|
|
60
|
+
* resgate, a faixa e a trava de refresh dele sao codigo do proprio app.
|
|
61
|
+
*
|
|
62
|
+
* Esta lista e a que alimenta o select do operador; quem valida a entrada do
|
|
63
|
+
* `start` e o `@IsIn` do StartImpersonationDTO. As duas precisam andar juntas:
|
|
64
|
+
* so aqui, o app aparece no select e o `start` responde 400.
|
|
60
65
|
*/
|
|
61
66
|
private static readonly REDEEMABLE_APPS;
|
|
62
67
|
constructor(prisma: PrismaService, security: SecurityService, setting: SettingService, token: TokenService, session: SessionService, user: UserService, pagination: PaginationService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impersonation.service.d.ts","sourceRoot":"","sources":["../../src/impersonation/impersonation.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAW3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAUF;;;;;;;;;;;;;;GAcG;AACH,qBACa,oBAAoB;
|
|
1
|
+
{"version":3,"file":"impersonation.service.d.ts","sourceRoot":"","sources":["../../src/impersonation/impersonation.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAW3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAUF;;;;;;;;;;;;;;GAcG;AACH,qBACa,oBAAoB;IAiC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,UAAU;IA5C7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAEhE,yEAAyE;IACzE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IAEpC,0DAA0D;IAC1D,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAE3C;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAoC;IAEhF;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;gBAIiB,MAAM,EAAE,aAAa,EAErB,QAAQ,EAAE,eAAe,EAEzB,OAAO,EAAE,cAAc,EAEvB,KAAK,EAAE,YAAY,EAEnB,OAAO,EAAE,cAAc,EAEvB,IAAI,EAAE,WAAW,EAEjB,UAAU,EAAE,iBAAiB;IAO1C,KAAK,CAAC,MAAM,EAAE,WAAW;;;;IAyEzB,MAAM,CAAC,MAAM,EAAE,YAAY;;;;;;;;;;;;;;IA4GjC;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;;;IAoDD;;;OAGG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;IAkC7C,sDAAsD;IAChD,kBAAkB;;;;IASlB,OAAO,CAAC,gBAAgB,EAAE,aAAa,EAAE,OAAO,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;IAwDjF;;;OAGG;IAEG,YAAY;YAiBJ,sBAAsB;YA2CtB,gBAAgB;IA2B9B;;;OAGG;IACH,OAAO,CAAC,YAAY;YAgBN,WAAW;CAY1B"}
|
|
@@ -370,7 +370,7 @@ let ImpersonationService = ImpersonationService_1 = class ImpersonationService {
|
|
|
370
370
|
}
|
|
371
371
|
};
|
|
372
372
|
exports.ImpersonationService = ImpersonationService;
|
|
373
|
-
/** Caminho da tela de resgate, igual
|
|
373
|
+
/** Caminho da tela de resgate, igual em todos os apps. */
|
|
374
374
|
ImpersonationService.REDEEM_PATH = '/simulacao';
|
|
375
375
|
/**
|
|
376
376
|
* Simular quem ja e administrador nao ajuda em nada no suporte e transformaria
|
|
@@ -378,10 +378,20 @@ ImpersonationService.REDEEM_PATH = '/simulacao';
|
|
|
378
378
|
*/
|
|
379
379
|
ImpersonationService.BLOCKED_TARGET_ROLES = ['admin', 'admin-impersonation'];
|
|
380
380
|
/**
|
|
381
|
-
* Apps com tela de resgate
|
|
382
|
-
* @hed-hog/next-app-provider
|
|
381
|
+
* Apps com tela de resgate em `/simulacao`. `training` nao usa o
|
|
382
|
+
* @hed-hog/next-app-provider — tem AuthProvider proprio —, entao a tela de
|
|
383
|
+
* resgate, a faixa e a trava de refresh dele sao codigo do proprio app.
|
|
384
|
+
*
|
|
385
|
+
* Esta lista e a que alimenta o select do operador; quem valida a entrada do
|
|
386
|
+
* `start` e o `@IsIn` do StartImpersonationDTO. As duas precisam andar juntas:
|
|
387
|
+
* so aqui, o app aparece no select e o `start` responde 400.
|
|
383
388
|
*/
|
|
384
|
-
ImpersonationService.REDEEMABLE_APPS = [
|
|
389
|
+
ImpersonationService.REDEEMABLE_APPS = [
|
|
390
|
+
'admin',
|
|
391
|
+
'class',
|
|
392
|
+
'partners',
|
|
393
|
+
'training',
|
|
394
|
+
];
|
|
385
395
|
__decorate([
|
|
386
396
|
(0, schedule_1.Cron)(schedule_1.CronExpression.EVERY_DAY_AT_4AM),
|
|
387
397
|
__metadata("design:type", Function),
|