@baruk/core 0.3.0 → 0.4.2
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/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +97 -0
- package/README.md +9 -2
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +170 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +414 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +147 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +161 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +483 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/repository.js +309 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/index.js +427 -48
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/company.js +36 -0
- package/dist/cjs/legal/company.js.map +1 -0
- package/dist/cjs/legal/documents.js +671 -0
- package/dist/cjs/legal/documents.js.map +1 -0
- package/dist/cjs/legal/index.js +15 -0
- package/dist/cjs/legal/index.js.map +1 -0
- package/dist/cjs/legal/types.js +34 -0
- package/dist/cjs/legal/types.js.map +1 -0
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +67 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +158 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +99 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/index.d.ts +113 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/company.d.ts +32 -0
- package/dist/legal/company.d.ts.map +1 -0
- package/dist/legal/company.js +33 -0
- package/dist/legal/company.js.map +1 -0
- package/dist/legal/documents.d.ts +30 -0
- package/dist/legal/documents.d.ts.map +1 -0
- package/dist/legal/documents.js +666 -0
- package/dist/legal/documents.js.map +1 -0
- package/dist/legal/index.d.ts +5 -0
- package/dist/legal/index.d.ts.map +1 -0
- package/dist/legal/index.js +4 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/legal/types.d.ts +145 -0
- package/dist/legal/types.d.ts.map +1 -0
- package/dist/legal/types.js +31 -0
- package/dist/legal/types.js.map +1 -0
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +67 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +19 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identidade e autorização de workload NÃO-HUMANO.
|
|
3
|
+
*
|
|
4
|
+
* O RBAC de `authorize.ts` responde "este USUÁRIO pode?". Nenhuma linha do
|
|
5
|
+
* repositório respondia "este PROCESSO pode?" — e a diferença não é
|
|
6
|
+
* acadêmica: o `TenantSecretStore` do lote C1A aceitava um `SecretAccessGrant`
|
|
7
|
+
* montado pelo próprio chamador. `principal`, `reason` e as datas eram strings
|
|
8
|
+
* e `Date`s sintaticamente válidas; qualquer módulo interno com acesso ao
|
|
9
|
+
* arquivo podia declará-las e pedir decifração. Isso é ATRIBUIÇÃO — serve para
|
|
10
|
+
* a trilha de auditoria e não serve como fronteira de segurança.
|
|
11
|
+
*
|
|
12
|
+
* Este módulo troca a declaração por três coisas que o chamador não consegue
|
|
13
|
+
* fabricar sozinho:
|
|
14
|
+
*
|
|
15
|
+
* 1. **Autenticação.** O workload apresenta um segredo próprio, verificado
|
|
16
|
+
* contra `service_principal.secret_hash` (scrypt, o mesmo `verifyPassword`
|
|
17
|
+
* da senha humana). Sem o segredo, não há identidade — e o segredo vive no
|
|
18
|
+
* ambiente do deploy que roda AQUELE workload, não no código.
|
|
19
|
+
*
|
|
20
|
+
* 2. **Autorização fora do controlado.** A permissão vem de linhas em
|
|
21
|
+
* `service_principal_grant`, e `baruk_app` tem apenas SELECT nessas tabelas
|
|
22
|
+
* (`db/migrate.ts` §3). O processo que consome a autorização não consegue
|
|
23
|
+
* escrevê-la: não é uma regra de tipo, é um privilégio do Postgres.
|
|
24
|
+
*
|
|
25
|
+
* 3. **Verificação por CHAMADA, dentro da transação.** A decisão não é
|
|
26
|
+
* memorizada na composição. Revogar um principal ou um grant passa a valer
|
|
27
|
+
* na próxima chamada, sem esperar o processo reiniciar.
|
|
28
|
+
*
|
|
29
|
+
* O objeto `WorkloadIdentity` é apenas o transporte da identidade JÁ
|
|
30
|
+
* autenticada. Ele é marcado com um símbolo privado deste módulo e registrado
|
|
31
|
+
* num `WeakSet` privado: um objeto estruturalmente idêntico, montado à mão em
|
|
32
|
+
* outro arquivo, é recusado. Mas a marca não é a fronteira — é a tranca da
|
|
33
|
+
* porta interna. A fronteira é o par (segredo, linha no banco).
|
|
34
|
+
*/
|
|
35
|
+
import { ForbiddenError, UnauthorizedError, ValidationError } from '@baruk/shared';
|
|
36
|
+
import { verifyPassword } from '../auth/password.js';
|
|
37
|
+
export const WORKLOAD_PURPOSES = [
|
|
38
|
+
'channel_dispatch',
|
|
39
|
+
'onboarding_seal',
|
|
40
|
+
'health_probe',
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* Marca privada. Não é exportada — logo, nenhum arquivo fora daqui consegue
|
|
44
|
+
* escrever esta propriedade de forma tipada, e `MINTED` recusa o objeto
|
|
45
|
+
* estruturalmente idêntico em tempo de execução.
|
|
46
|
+
*/
|
|
47
|
+
const WORKLOAD_BRAND = Symbol('baruk.workload-identity');
|
|
48
|
+
const MINTED = new WeakSet();
|
|
49
|
+
/** Sessão padrão: 1h. Um cron diário reautentica a cada execução; um worker, de hora em hora. */
|
|
50
|
+
const DEFAULT_TTL_MS = 60 * 60 * 1000;
|
|
51
|
+
/** Teto duro. Uma sessão de dias equivaleria a não ter janela nenhuma. */
|
|
52
|
+
const MAX_TTL_MS = 12 * 60 * 60 * 1000;
|
|
53
|
+
/**
|
|
54
|
+
* Hash descartável com o mesmo custo de um real. Existe para que "principal
|
|
55
|
+
* inexistente" e "segredo errado" levem o mesmo tempo — sem isso, a latência
|
|
56
|
+
* enumera quais principals existem.
|
|
57
|
+
*/
|
|
58
|
+
const DUMMY_HASH = `scrypt$16384$8$1$${'A'.repeat(22)}==$${'a'.repeat(86)}==`;
|
|
59
|
+
/**
|
|
60
|
+
* Autentica um workload e emite a identidade da sessão.
|
|
61
|
+
*
|
|
62
|
+
* **Chame na RAIZ DE COMPOSIÇÃO** — o `main()` do cron, o bootstrap do worker,
|
|
63
|
+
* a borda de request já autenticada — e propague a identidade. Nenhum módulo de
|
|
64
|
+
* domínio deve chamar isto: quem PRECISA do segredo nunca deve ser quem
|
|
65
|
+
* declara ter direito a ele.
|
|
66
|
+
*
|
|
67
|
+
* Falha FECHADA e ruidosa: `UnauthorizedError`. Um workload que não autentica
|
|
68
|
+
* deve parar no boot, com o erro visível, não seguir e falhar seis passos
|
|
69
|
+
* depois como "canal indisponível".
|
|
70
|
+
*
|
|
71
|
+
* Roda FORA de contexto de tenant: `service_principal` é global, como `"user"`.
|
|
72
|
+
* A amarração ao tenant é da autorização (`authorizeWorkload`), não da identidade.
|
|
73
|
+
*/
|
|
74
|
+
export async function authenticateWorkload(db, input) {
|
|
75
|
+
const key = input?.key?.trim() ?? '';
|
|
76
|
+
const secret = typeof input?.secret === 'string' ? input.secret : '';
|
|
77
|
+
if (!key)
|
|
78
|
+
throw new ValidationError('key do service principal é obrigatória.');
|
|
79
|
+
if (!secret)
|
|
80
|
+
throw new ValidationError('secret do service principal é obrigatório.');
|
|
81
|
+
const ttl = input.ttlMs ?? DEFAULT_TTL_MS;
|
|
82
|
+
if (!Number.isFinite(ttl) || ttl <= 0 || ttl > MAX_TTL_MS) {
|
|
83
|
+
throw new ValidationError(`ttlMs fora da janela permitida (1..${MAX_TTL_MS}).`);
|
|
84
|
+
}
|
|
85
|
+
const rows = await db `
|
|
86
|
+
SELECT id, key, status, secret_hash
|
|
87
|
+
FROM service_principal
|
|
88
|
+
WHERE lower(key) = lower(${key}) AND deleted_at IS NULL
|
|
89
|
+
`;
|
|
90
|
+
const row = rows[0];
|
|
91
|
+
// Verifica SEMPRE — inclusive contra o hash descartável quando não há linha.
|
|
92
|
+
const matches = verifyPassword(secret, row?.secret_hash ?? DUMMY_HASH);
|
|
93
|
+
if (!row || row.status !== 'active' || !matches) {
|
|
94
|
+
throw new UnauthorizedError('Workload não autenticado.');
|
|
95
|
+
}
|
|
96
|
+
const issuedAt = input.now ?? new Date();
|
|
97
|
+
const identity = {
|
|
98
|
+
principalId: row.id,
|
|
99
|
+
principalKey: row.key,
|
|
100
|
+
issuedAt,
|
|
101
|
+
expiresAt: new Date(issuedAt.getTime() + ttl),
|
|
102
|
+
[WORKLOAD_BRAND]: true,
|
|
103
|
+
};
|
|
104
|
+
MINTED.add(identity);
|
|
105
|
+
return identity;
|
|
106
|
+
}
|
|
107
|
+
/** O objeto veio de `authenticateWorkload`? Recusa qualquer imitação estrutural. */
|
|
108
|
+
export function isMintedWorkloadIdentity(value) {
|
|
109
|
+
return typeof value === 'object' && value !== null && MINTED.has(value);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Falha fechada quando a identidade não foi emitida aqui. Chamado por TODO
|
|
113
|
+
* consumidor antes de qualquer trabalho — um `ForbiddenError` no primeiro
|
|
114
|
+
* passo é a diferença entre uma tentativa recusada e um segredo entregue.
|
|
115
|
+
*/
|
|
116
|
+
export function assertMintedWorkloadIdentity(value) {
|
|
117
|
+
if (!isMintedWorkloadIdentity(value)) {
|
|
118
|
+
throw new ForbiddenError('WorkloadIdentity não emitida por authenticateWorkload — identidade forjada recusada.');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Decide se ESTE principal pode exercer ESTA permissão, NESTE tenant, para
|
|
123
|
+
* ESTE propósito, sobre ESTE recurso. Quatro dimensões conjuntivas.
|
|
124
|
+
*
|
|
125
|
+
* A quarta é o que fecha confused deputy: um workload legitimamente autorizado
|
|
126
|
+
* no tenant A a despachar canal não decifra a chave do gateway de pagamento do
|
|
127
|
+
* tenant A só porque um `credentialRef` vindo de input pediu. A autorização do
|
|
128
|
+
* workload nunca vira autorização para qualquer recurso que o input nomear.
|
|
129
|
+
*
|
|
130
|
+
* **DEVE rodar dentro de `withContext(db, { tenantId })`** — a RLS FORCE de
|
|
131
|
+
* `service_principal_grant` é a segunda camada; o predicado explícito de
|
|
132
|
+
* `tenant_id` é a primeira. As duas dizem a mesma coisa de propósito: nenhuma
|
|
133
|
+
* das duas sozinha é o desenho.
|
|
134
|
+
*/
|
|
135
|
+
export async function authorizeWorkload(tx, identity, req) {
|
|
136
|
+
assertMintedWorkloadIdentity(identity);
|
|
137
|
+
const tenantId = req?.tenantId?.trim() ?? '';
|
|
138
|
+
const permission = req?.permission?.trim() ?? '';
|
|
139
|
+
const resource = req?.resource?.trim() ?? '';
|
|
140
|
+
const purpose = req?.purpose;
|
|
141
|
+
if (!tenantId || !permission || !resource || !WORKLOAD_PURPOSES.includes(purpose)) {
|
|
142
|
+
return { allowed: false, denyReason: 'invalid_request' };
|
|
143
|
+
}
|
|
144
|
+
const now = req.now ?? new Date();
|
|
145
|
+
if (now.getTime() >= identity.expiresAt.getTime() ||
|
|
146
|
+
now.getTime() < identity.issuedAt.getTime()) {
|
|
147
|
+
return { allowed: false, denyReason: 'identity_expired' };
|
|
148
|
+
}
|
|
149
|
+
// Revogação vale AGORA, não no próximo boot: relê o principal a cada chamada.
|
|
150
|
+
const principal = await tx `
|
|
151
|
+
SELECT id FROM service_principal
|
|
152
|
+
WHERE id = ${identity.principalId} AND status = 'active' AND deleted_at IS NULL
|
|
153
|
+
`;
|
|
154
|
+
if (!principal[0]) {
|
|
155
|
+
return { allowed: false, denyReason: 'principal_unknown_or_disabled' };
|
|
156
|
+
}
|
|
157
|
+
// `left(...)` em vez de LIKE: o valor do prefixo é literal, e `_`/`%` são
|
|
158
|
+
// caracteres comuns em nome de credencial (`RESEND_API_KEY`). Um LIKE aqui
|
|
159
|
+
// transformaria um nome legítimo em curinga.
|
|
160
|
+
const grants = await tx `
|
|
161
|
+
SELECT id FROM service_principal_grant
|
|
162
|
+
WHERE tenant_id = ${tenantId}
|
|
163
|
+
AND principal_id = ${identity.principalId}
|
|
164
|
+
AND permission_key = ${permission}
|
|
165
|
+
AND purpose = ${purpose}
|
|
166
|
+
AND revoked_at IS NULL
|
|
167
|
+
AND deleted_at IS NULL
|
|
168
|
+
AND (expires_at IS NULL OR expires_at > ${now})
|
|
169
|
+
AND (
|
|
170
|
+
(resource_kind = 'exact' AND lower(resource_value) = lower(${resource}))
|
|
171
|
+
OR (
|
|
172
|
+
resource_kind = 'prefix'
|
|
173
|
+
AND left(lower(${resource}), length(lower(resource_value))) = lower(resource_value)
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
LIMIT 1
|
|
177
|
+
`;
|
|
178
|
+
const grant = grants[0];
|
|
179
|
+
if (!grant) {
|
|
180
|
+
return { allowed: false, denyReason: 'no_matching_grant' };
|
|
181
|
+
}
|
|
182
|
+
return { allowed: true, grantId: grant.id };
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=workload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workload.js","sourceRoot":"","sources":["../../src/rbac/workload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAUrD,MAAM,CAAC,MAAM,iBAAiB,GAA+B;IAC3D,kBAAkB;IAClB,iBAAiB;IACjB,cAAc;CACf,CAAC;AAEF;;;;GAIG;AACH,MAAM,cAAc,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AACzD,MAAM,MAAM,GAAG,IAAI,OAAO,EAAU,CAAC;AAYrC,iGAAiG;AACjG,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC,0EAA0E;AAC1E,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,GAAG,oBAAoB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;AAmB9E;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAM,EACN,KAAgC;IAEhC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,eAAe,CAAC,yCAAyC,CAAC,CAAC;IAC/E,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,eAAe,CAAC,4CAA4C,CAAC,CAAC;IAErF,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,cAAc,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,UAAU,EAAE,CAAC;QAC1D,MAAM,IAAI,eAAe,CAAC,sCAAsC,UAAU,IAAI,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAgB;;;+BAGR,GAAG;GAC/B,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,6EAA6E;IAC7E,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,IAAI,UAAU,CAAC,CAAC;IACvE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG;QACf,WAAW,EAAE,GAAG,CAAC,EAAE;QACnB,YAAY,EAAE,GAAG,CAAC,GAAG;QACrB,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC;QAC7C,CAAC,cAAc,CAAC,EAAE,IAAa;KAChC,CAAC;IACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,KAAe,CAAC,CAAC;AACpF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,cAAc,CACtB,sFAAsF,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAkBD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAM,EACN,QAA0B,EAC1B,GAAiC;IAEjC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,CAAC;IAC7B,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAClC,IACE,GAAG,CAAC,OAAO,EAAE,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE;QAC7C,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,EAC3C,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;IAC5D,CAAC;IAED,8EAA8E;IAC9E,MAAM,SAAS,GAAG,MAAM,EAAE,CAAkB;;iBAE7B,QAAQ,CAAC,WAAW;GAClC,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,+BAA+B,EAAE,CAAC;IACzE,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,6CAA6C;IAC7C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAkB;;wBAEnB,QAAQ;2BACL,QAAQ,CAAC,WAAW;6BAClB,UAAU;sBACjB,OAAO;;;gDAGmB,GAAG;;qEAEkB,QAAQ;;;2BAGlD,QAAQ;;;;GAIhC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SHA-256 em hex minúsculo — a forma exigida pelo CHECK de `blob.checksum_sha256`.
|
|
3
|
+
*
|
|
4
|
+
* É o identificador de conteúdo que sustenta duas coisas na ADR 0007: a
|
|
5
|
+
* deduplicação por tenant e a prova de que a versão baixada é byte-idêntica à
|
|
6
|
+
* que foi enviada.
|
|
7
|
+
*/
|
|
8
|
+
export declare function sha256Hex(data: Uint8Array): string;
|
|
9
|
+
//# sourceMappingURL=checksum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/storage/checksum.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* SHA-256 em hex minúsculo — a forma exigida pelo CHECK de `blob.checksum_sha256`.
|
|
4
|
+
*
|
|
5
|
+
* É o identificador de conteúdo que sustenta duas coisas na ADR 0007: a
|
|
6
|
+
* deduplicação por tenant e a prova de que a versão baixada é byte-idêntica à
|
|
7
|
+
* que foi enviada.
|
|
8
|
+
*/
|
|
9
|
+
export function sha256Hex(data) {
|
|
10
|
+
return createHash('sha256').update(data).digest('hex');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=checksum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../src/storage/checksum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Construção da chave de objeto (ADR 0007 D7).
|
|
3
|
+
*
|
|
4
|
+
* Formato:
|
|
5
|
+
* {tenant_id}/{client_id}/{yyyy}/{mm}/{category}/{document_id}/{version}-{rand}
|
|
6
|
+
*
|
|
7
|
+
* Três propriedades que a forma garante:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Tenant no primeiro segmento** — a fronteira fica legível no próprio
|
|
10
|
+
* bucket e permite política de acesso por prefixo no provedor.
|
|
11
|
+
* 2. **Não previsível** — o sufixo aleatório impede que alguém que conheça os
|
|
12
|
+
* ids enumere objetos. A URL assinada já expira, mas defesa em profundidade
|
|
13
|
+
* custa 8 bytes.
|
|
14
|
+
* 3. **Sem nome de arquivo do cliente** — o `original_filename` vive na tabela
|
|
15
|
+
* `document_version`, nunca na chave. Nome vindo do cliente não é identidade
|
|
16
|
+
* de objeto e é o vetor clássico de path traversal.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildStorageKey(input: {
|
|
19
|
+
tenantId: string;
|
|
20
|
+
clientId: string;
|
|
21
|
+
documentId: string;
|
|
22
|
+
versionNo: number;
|
|
23
|
+
categoryKey?: string | null;
|
|
24
|
+
competenceLabel?: string | null;
|
|
25
|
+
}): string;
|
|
26
|
+
/**
|
|
27
|
+
* Reduz um segmento a `[a-z0-9_-]`. Qualquer outra coisa — inclusive `.` e `/` —
|
|
28
|
+
* é descartada, o que torna `../` impossível de construir por aqui.
|
|
29
|
+
*/
|
|
30
|
+
export declare function sanitizeSegment(value: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Higieniza o nome exibido ao usuário. Não participa da chave de storage — é só
|
|
33
|
+
* o rótulo guardado em `document_version.original_filename` e devolvido no
|
|
34
|
+
* download. Remove diretório, controla o comprimento e recusa nome vazio.
|
|
35
|
+
*/
|
|
36
|
+
export declare function sanitizeFilename(value: string): string;
|
|
37
|
+
//# sourceMappingURL=key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/storage/key.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,GAAG,MAAM,CAmBT;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUrD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAStD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Construção da chave de objeto (ADR 0007 D7).
|
|
4
|
+
*
|
|
5
|
+
* Formato:
|
|
6
|
+
* {tenant_id}/{client_id}/{yyyy}/{mm}/{category}/{document_id}/{version}-{rand}
|
|
7
|
+
*
|
|
8
|
+
* Três propriedades que a forma garante:
|
|
9
|
+
*
|
|
10
|
+
* 1. **Tenant no primeiro segmento** — a fronteira fica legível no próprio
|
|
11
|
+
* bucket e permite política de acesso por prefixo no provedor.
|
|
12
|
+
* 2. **Não previsível** — o sufixo aleatório impede que alguém que conheça os
|
|
13
|
+
* ids enumere objetos. A URL assinada já expira, mas defesa em profundidade
|
|
14
|
+
* custa 8 bytes.
|
|
15
|
+
* 3. **Sem nome de arquivo do cliente** — o `original_filename` vive na tabela
|
|
16
|
+
* `document_version`, nunca na chave. Nome vindo do cliente não é identidade
|
|
17
|
+
* de objeto e é o vetor clássico de path traversal.
|
|
18
|
+
*/
|
|
19
|
+
export function buildStorageKey(input) {
|
|
20
|
+
const { tenantId, clientId, documentId, versionNo } = input;
|
|
21
|
+
// Competência dá a partição temporal quando existe; senão, a data corrente.
|
|
22
|
+
// O formato YYYY-MM já é validado no banco, então o split é seguro.
|
|
23
|
+
let yyyy;
|
|
24
|
+
let mm;
|
|
25
|
+
if (input.competenceLabel && /^\d{4}-\d{2}$/.test(input.competenceLabel)) {
|
|
26
|
+
[yyyy, mm] = input.competenceLabel.split('-');
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const now = new Date();
|
|
30
|
+
yyyy = String(now.getUTCFullYear());
|
|
31
|
+
mm = String(now.getUTCMonth() + 1).padStart(2, '0');
|
|
32
|
+
}
|
|
33
|
+
const category = sanitizeSegment(input.categoryKey ?? 'geral');
|
|
34
|
+
const rand = randomBytes(8).toString('hex');
|
|
35
|
+
return `${tenantId}/${clientId}/${yyyy}/${mm}/${category}/${documentId}/${versionNo}-${rand}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Reduz um segmento a `[a-z0-9_-]`. Qualquer outra coisa — inclusive `.` e `/` —
|
|
39
|
+
* é descartada, o que torna `../` impossível de construir por aqui.
|
|
40
|
+
*/
|
|
41
|
+
export function sanitizeSegment(value) {
|
|
42
|
+
const cleaned = value
|
|
43
|
+
.toLowerCase()
|
|
44
|
+
.normalize('NFD')
|
|
45
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
46
|
+
.replace(/[^a-z0-9_-]/g, '-')
|
|
47
|
+
.replace(/-+/g, '-')
|
|
48
|
+
.replace(/^-|-$/g, '')
|
|
49
|
+
.slice(0, 48);
|
|
50
|
+
return cleaned.length > 0 ? cleaned : 'geral';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Higieniza o nome exibido ao usuário. Não participa da chave de storage — é só
|
|
54
|
+
* o rótulo guardado em `document_version.original_filename` e devolvido no
|
|
55
|
+
* download. Remove diretório, controla o comprimento e recusa nome vazio.
|
|
56
|
+
*/
|
|
57
|
+
export function sanitizeFilename(value) {
|
|
58
|
+
const base = value.split(/[\\/]/).pop() ?? '';
|
|
59
|
+
const cleaned = base
|
|
60
|
+
// eslint-disable-next-line no-control-regex
|
|
61
|
+
.replace(/[\u0000-\u001f\u007f]/g, '')
|
|
62
|
+
.replace(/^\.+/, '')
|
|
63
|
+
.trim()
|
|
64
|
+
.slice(0, 180);
|
|
65
|
+
return cleaned.length > 0 ? cleaned : 'arquivo';
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/storage/key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,KAO/B;IACC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE5D,4EAA4E;IAC5E,oEAAoE;IACpE,IAAI,IAAY,CAAC;IACjB,IAAI,EAAU,CAAC;IACf,IAAI,KAAK,CAAC,eAAe,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QACzE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QACpC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,OAAO,GAAG,QAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ,IAAI,UAAU,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;AAChG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,OAAO,GAAG,KAAK;SAClB,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI;QAClB,4CAA4C;SAC3C,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC;SACrC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ObjectHead, type PutObjectInput, type PutObjectResult, type SignedUrlOptions, type StorageProvider } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Provider de sistema de arquivos — o default seguro (ADR 0007 D4).
|
|
4
|
+
*
|
|
5
|
+
* Usado em desenvolvimento e em toda a suíte de testes: nenhum teste depende de
|
|
6
|
+
* R2 real, o que mantém o CI offline e determinístico.
|
|
7
|
+
*
|
|
8
|
+
* A "URL assinada" aqui é um caminho relativo da própria API com token HMAC e
|
|
9
|
+
* expiração — mesma semântica do presigned do R2 (link temporário, sem
|
|
10
|
+
* credencial embutida), servido pelo backend em vez do provedor.
|
|
11
|
+
*/
|
|
12
|
+
export declare class LocalStorageProvider implements StorageProvider {
|
|
13
|
+
readonly key: "local";
|
|
14
|
+
private readonly root;
|
|
15
|
+
private readonly signingSecret;
|
|
16
|
+
constructor(options: {
|
|
17
|
+
rootDir: string;
|
|
18
|
+
signingSecret: string;
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Resolve a chave para um caminho absoluto e recusa qualquer coisa que escape
|
|
22
|
+
* da raiz. A chave já é construída por `buildStorageKey`, mas este guard não
|
|
23
|
+
* confia nisso: um provider de storage é o último lugar onde se deve supor
|
|
24
|
+
* que a entrada é boa.
|
|
25
|
+
*/
|
|
26
|
+
private pathFor;
|
|
27
|
+
put(input: PutObjectInput): Promise<PutObjectResult>;
|
|
28
|
+
getSignedUrl(key: string, options?: SignedUrlOptions): Promise<string>;
|
|
29
|
+
head(key: string): Promise<ObjectHead>;
|
|
30
|
+
delete(key: string): Promise<void>;
|
|
31
|
+
/** Lê o objeto. Só o LocalStorageProvider expõe isso — o R2 serve direto. */
|
|
32
|
+
read(key: string): Promise<Uint8Array>;
|
|
33
|
+
private sign;
|
|
34
|
+
/**
|
|
35
|
+
* Valida assinatura e expiração. Comparação em tempo constante — um HMAC
|
|
36
|
+
* comparado com `===` vaza o prefixo correto byte a byte.
|
|
37
|
+
*/
|
|
38
|
+
verifySignature(key: string, expiresAt: number, signature: string): boolean;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAGpB;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,QAAQ,CAAC,GAAG,EAAG,OAAO,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAK/D;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IAST,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAWpD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAStE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAStC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,6EAA6E;IACvE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAQ5C,OAAO,CAAC,IAAI;IAIZ;;;OAGG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;CAO5E"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, normalize, resolve, sep } from 'node:path';
|
|
4
|
+
import { DEFAULT_SIGNED_URL_TTL_SECONDS, StorageError, } from './types.js';
|
|
5
|
+
import { sha256Hex } from './checksum.js';
|
|
6
|
+
/**
|
|
7
|
+
* Provider de sistema de arquivos — o default seguro (ADR 0007 D4).
|
|
8
|
+
*
|
|
9
|
+
* Usado em desenvolvimento e em toda a suíte de testes: nenhum teste depende de
|
|
10
|
+
* R2 real, o que mantém o CI offline e determinístico.
|
|
11
|
+
*
|
|
12
|
+
* A "URL assinada" aqui é um caminho relativo da própria API com token HMAC e
|
|
13
|
+
* expiração — mesma semântica do presigned do R2 (link temporário, sem
|
|
14
|
+
* credencial embutida), servido pelo backend em vez do provedor.
|
|
15
|
+
*/
|
|
16
|
+
export class LocalStorageProvider {
|
|
17
|
+
key = 'local';
|
|
18
|
+
root;
|
|
19
|
+
signingSecret;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.root = resolve(options.rootDir);
|
|
22
|
+
this.signingSecret = options.signingSecret;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve a chave para um caminho absoluto e recusa qualquer coisa que escape
|
|
26
|
+
* da raiz. A chave já é construída por `buildStorageKey`, mas este guard não
|
|
27
|
+
* confia nisso: um provider de storage é o último lugar onde se deve supor
|
|
28
|
+
* que a entrada é boa.
|
|
29
|
+
*/
|
|
30
|
+
pathFor(key) {
|
|
31
|
+
if (key.includes('\0'))
|
|
32
|
+
throw new StorageError('chave inválida', 'invalid');
|
|
33
|
+
const target = resolve(join(this.root, normalize(key)));
|
|
34
|
+
if (target !== this.root && !target.startsWith(this.root + sep)) {
|
|
35
|
+
throw new StorageError('chave fora da raiz de storage', 'invalid');
|
|
36
|
+
}
|
|
37
|
+
return target;
|
|
38
|
+
}
|
|
39
|
+
async put(input) {
|
|
40
|
+
const target = this.pathFor(input.key);
|
|
41
|
+
await mkdir(dirname(target), { recursive: true });
|
|
42
|
+
await writeFile(target, input.body);
|
|
43
|
+
return {
|
|
44
|
+
key: input.key,
|
|
45
|
+
checksumSha256: sha256Hex(input.body),
|
|
46
|
+
sizeBytes: input.body.byteLength,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async getSignedUrl(key, options) {
|
|
50
|
+
const ttl = options?.expiresInSeconds ?? DEFAULT_SIGNED_URL_TTL_SECONDS;
|
|
51
|
+
const expiresAt = Math.floor(Date.now() / 1000) + ttl;
|
|
52
|
+
const signature = this.sign(key, expiresAt);
|
|
53
|
+
const params = new URLSearchParams({ key, expires: String(expiresAt), sig: signature });
|
|
54
|
+
if (options?.downloadFilename)
|
|
55
|
+
params.set('filename', options.downloadFilename);
|
|
56
|
+
return `/v1/documents/blob?${params.toString()}`;
|
|
57
|
+
}
|
|
58
|
+
async head(key) {
|
|
59
|
+
try {
|
|
60
|
+
const info = await stat(this.pathFor(key));
|
|
61
|
+
return { exists: true, sizeBytes: info.size };
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return { exists: false };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async delete(key) {
|
|
68
|
+
await rm(this.pathFor(key), { force: true });
|
|
69
|
+
}
|
|
70
|
+
/** Lê o objeto. Só o LocalStorageProvider expõe isso — o R2 serve direto. */
|
|
71
|
+
async read(key) {
|
|
72
|
+
try {
|
|
73
|
+
return new Uint8Array(await readFile(this.pathFor(key)));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
throw new StorageError('objeto não encontrado', 'not-found');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
sign(key, expiresAt) {
|
|
80
|
+
return createHmac('sha256', this.signingSecret).update(`${key}:${expiresAt}`).digest('hex');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Valida assinatura e expiração. Comparação em tempo constante — um HMAC
|
|
84
|
+
* comparado com `===` vaza o prefixo correto byte a byte.
|
|
85
|
+
*/
|
|
86
|
+
verifySignature(key, expiresAt, signature) {
|
|
87
|
+
if (!Number.isFinite(expiresAt) || expiresAt < Math.floor(Date.now() / 1000))
|
|
88
|
+
return false;
|
|
89
|
+
const expected = Buffer.from(this.sign(key, expiresAt), 'utf8');
|
|
90
|
+
const received = Buffer.from(signature, 'utf8');
|
|
91
|
+
if (expected.length !== received.length)
|
|
92
|
+
return false;
|
|
93
|
+
return timingSafeEqual(expected, received);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type ObjectHead, type PutObjectInput, type PutObjectResult, type SignedUrlOptions, type StorageProvider } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cloudflare R2 — provider de produção (ADR 0007 D5).
|
|
4
|
+
*
|
|
5
|
+
* Fala S3 por AWS SigV4 implementado aqui, sem SDK. Duas razões:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Nenhuma dependência nova.** `@aws-sdk/client-s3` traria dezenas de
|
|
8
|
+
* pacotes transitivos para usarmos quatro operações. O lockfile deste
|
|
9
|
+
* monorepo já é sensível a divergência entre macOS e o CI Linux.
|
|
10
|
+
* 2. **A superfície é pequena e estável.** SigV4 não muda; o que muda é o
|
|
11
|
+
* fornecedor, e é exatamente isso que a interface `StorageProvider` isola.
|
|
12
|
+
*
|
|
13
|
+
* O bucket é privado. Não existe caminho neste arquivo que torne um objeto
|
|
14
|
+
* público — leitura é sempre por URL assinada com expiração.
|
|
15
|
+
*/
|
|
16
|
+
export interface R2Config {
|
|
17
|
+
accountId: string;
|
|
18
|
+
accessKeyId: string;
|
|
19
|
+
secretAccessKey: string;
|
|
20
|
+
bucket: string;
|
|
21
|
+
/** Região fixa do R2. */
|
|
22
|
+
region?: string;
|
|
23
|
+
fetchImpl?: typeof fetch;
|
|
24
|
+
}
|
|
25
|
+
export declare class R2StorageProvider implements StorageProvider {
|
|
26
|
+
readonly key: "r2";
|
|
27
|
+
private readonly cfg;
|
|
28
|
+
private readonly fetchImpl;
|
|
29
|
+
private readonly host;
|
|
30
|
+
constructor(config: R2Config);
|
|
31
|
+
private objectUrl;
|
|
32
|
+
put(input: PutObjectInput): Promise<PutObjectResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Presigned GET por query string (SigV4). O link carrega a assinatura e a
|
|
35
|
+
* expiração — nunca a credencial.
|
|
36
|
+
*/
|
|
37
|
+
getSignedUrl(key: string, options?: SignedUrlOptions): Promise<string>;
|
|
38
|
+
head(key: string): Promise<ObjectHead>;
|
|
39
|
+
delete(key: string): Promise<void>;
|
|
40
|
+
private signedHeaders;
|
|
41
|
+
private calculateSignature;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=r2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../src/storage/r2.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAGpB;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAKD,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,GAAG,EAAG,IAAI,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwC;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,MAAM,EAAE,QAAQ;IAe5B,OAAO,CAAC,SAAS;IAIX,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IA6B1D;;;OAGG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAqCtE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,OAAO,CAAC,aAAa;IA8CrB,OAAO,CAAC,kBAAkB;CAsB3B"}
|