@baruk/core 0.4.2 → 0.6.0
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 +4 -4
- package/CHANGELOG.md +42 -0
- package/dist/audit/repository.d.ts +33 -1
- package/dist/audit/repository.d.ts.map +1 -1
- package/dist/audit/repository.js +41 -7
- package/dist/audit/repository.js.map +1 -1
- package/dist/auth/service.d.ts +21 -0
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +46 -1
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +41 -1
- package/dist/billing/ar-repository.d.ts.map +1 -1
- package/dist/billing/ar-repository.js +82 -6
- package/dist/billing/ar-repository.js.map +1 -1
- package/dist/billing/provider-account.d.ts +38 -0
- package/dist/billing/provider-account.d.ts.map +1 -1
- package/dist/billing/provider-account.js +58 -2
- package/dist/billing/provider-account.js.map +1 -1
- package/dist/billing/repository.d.ts +44 -0
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +49 -5
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/audit/repository.js +41 -7
- package/dist/cjs/audit/repository.js.map +1 -1
- package/dist/cjs/auth/service.js +46 -1
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +82 -6
- package/dist/cjs/billing/ar-repository.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +60 -1
- package/dist/cjs/billing/provider-account.js.map +1 -1
- package/dist/cjs/billing/repository.js +51 -5
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/ibge.js +117 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/http.js +157 -0
- package/dist/cjs/clients/registry/http.js.map +1 -0
- package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
- package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/cjs/clients/registry/ibge.js +63 -0
- package/dist/cjs/clients/registry/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/lookup.js +191 -0
- package/dist/cjs/clients/registry/lookup.js.map +1 -0
- package/dist/cjs/clients/registry/provider.js +34 -0
- package/dist/cjs/clients/registry/provider.js.map +1 -0
- package/dist/cjs/clients/registry/resolve.js +47 -0
- package/dist/cjs/clients/registry/resolve.js.map +1 -0
- package/dist/cjs/clients/registry/serpro.js +149 -0
- package/dist/cjs/clients/registry/serpro.js.map +1 -0
- package/dist/cjs/clients/registry/service.js +230 -0
- package/dist/cjs/clients/registry/service.js.map +1 -0
- package/dist/cjs/clients/registry/synthetic.js +165 -0
- package/dist/cjs/clients/registry/synthetic.js.map +1 -0
- package/dist/cjs/clients/repository.js +190 -9
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +190 -0
- package/dist/cjs/collection/branding.js.map +1 -1
- package/dist/cjs/collection/clearance-store.js +74 -0
- package/dist/cjs/collection/clearance-store.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +65 -2
- package/dist/cjs/collection/communication-runtime.js.map +1 -1
- package/dist/cjs/collection/engine.js +20 -0
- package/dist/cjs/collection/engine.js.map +1 -1
- package/dist/cjs/collection/policy.js +29 -1
- package/dist/cjs/collection/policy.js.map +1 -1
- package/dist/cjs/communication/clearance.js +18 -0
- package/dist/cjs/communication/clearance.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +5 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
- package/dist/cjs/communication/engine.js +12 -0
- package/dist/cjs/communication/engine.js.map +1 -1
- package/dist/cjs/communication/policy.js.map +1 -1
- package/dist/cjs/competence/business-days.js +155 -0
- package/dist/cjs/competence/business-days.js.map +1 -0
- package/dist/cjs/competence/catalog-validation.js +174 -0
- package/dist/cjs/competence/catalog-validation.js.map +1 -0
- package/dist/cjs/competence/obligation-preview.js +190 -0
- package/dist/cjs/competence/obligation-preview.js.map +1 -0
- package/dist/cjs/competence/repository.js +330 -17
- package/dist/cjs/competence/repository.js.map +1 -1
- package/dist/cjs/dashboard/pilot-panel.js +90 -0
- package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +11 -1
- package/dist/cjs/dashboard/repository.js.map +1 -1
- package/dist/cjs/db/client.js +17 -11
- package/dist/cjs/db/client.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +116 -0
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
- package/dist/cjs/fiscal/applicability.js +164 -0
- package/dist/cjs/fiscal/applicability.js.map +1 -0
- package/dist/cjs/fiscal/collection/authorization.js +186 -0
- package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
- package/dist/cjs/fiscal/collection/competence.js +97 -0
- package/dist/cjs/fiscal/collection/competence.js.map +1 -0
- package/dist/cjs/fiscal/collection/first-contact.js +204 -0
- package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
- package/dist/cjs/fiscal/collection/plan.js +122 -0
- package/dist/cjs/fiscal/collection/plan.js.map +1 -0
- package/dist/cjs/fiscal/conditions.js +198 -0
- package/dist/cjs/fiscal/conditions.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +137 -0
- package/dist/cjs/fiscal/coverage/model.js.map +1 -0
- package/dist/cjs/fiscal/coverage/requests.js +99 -0
- package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
- package/dist/cjs/fiscal/credentials/inspect.js +182 -0
- package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
- package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +190 -0
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
- package/dist/cjs/fiscal/eligibility.js +199 -0
- package/dist/cjs/fiscal/eligibility.js.map +1 -0
- package/dist/cjs/fiscal/enrollment.js +134 -0
- package/dist/cjs/fiscal/enrollment.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/direction.js +36 -0
- package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/provider.js +51 -0
- package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/repository.js +132 -0
- package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/cjs/fiscal/repository.js +470 -0
- package/dist/cjs/fiscal/repository.js.map +1 -0
- package/dist/cjs/fiscal/sync/circuit.js +124 -0
- package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
- package/dist/cjs/fiscal/sync/intervention.js +140 -0
- package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
- package/dist/cjs/fiscal/sync/lease.js +146 -0
- package/dist/cjs/fiscal/sync/lease.js.map +1 -0
- package/dist/cjs/fiscal/sync/observability.js +244 -0
- package/dist/cjs/fiscal/sync/observability.js.map +1 -0
- package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
- package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/cjs/fiscal/sync/policy.js +143 -0
- package/dist/cjs/fiscal/sync/policy.js.map +1 -0
- package/dist/cjs/fiscal/sync/reprocess.js +241 -0
- package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
- package/dist/cjs/fiscal/sync/retry.js +183 -0
- package/dist/cjs/fiscal/sync/retry.js.map +1 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/cjs/fiscal/transport/https.js +309 -0
- package/dist/cjs/fiscal/transport/https.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +380 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/cjs/fiscal/transport/types.js +93 -0
- package/dist/cjs/fiscal/transport/types.js.map +1 -0
- package/dist/cjs/import/br-documents.js +85 -0
- package/dist/cjs/import/br-documents.js.map +1 -0
- package/dist/cjs/import/clients-import.js +347 -40
- package/dist/cjs/import/clients-import.js.map +1 -1
- package/dist/cjs/index.js +461 -73
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +164 -19
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/index.js +3 -1
- package/dist/cjs/legal/index.js.map +1 -1
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/onboarding/persistence.js +4 -4
- package/dist/cjs/onboarding/persistence.js.map +1 -1
- package/dist/cjs/pilot/go-live-checklist.js +212 -0
- package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
- package/dist/cjs/pilot/milestone.js +79 -0
- package/dist/cjs/pilot/milestone.js.map +1 -0
- package/dist/cjs/platform/capabilities.js +173 -0
- package/dist/cjs/platform/capabilities.js.map +1 -0
- package/dist/cjs/platform/job-contract.js +411 -0
- package/dist/cjs/platform/job-contract.js.map +1 -0
- package/dist/cjs/rbac/catalog.js +110 -0
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/subscription-billing/index.js +9 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
- package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/cjs/subscription-billing/service.js +246 -78
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/tenancy/features.js +131 -0
- package/dist/cjs/tenancy/features.js.map +1 -0
- package/dist/cjs/tenancy/settings.js +224 -0
- package/dist/cjs/tenancy/settings.js.map +1 -0
- package/dist/cjs/users/repository.js +24 -1
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +92 -5
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/ibge.d.ts +17 -0
- package/dist/clients/ibge.d.ts.map +1 -0
- package/dist/clients/ibge.js +112 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/registry/http.d.ts +61 -0
- package/dist/clients/registry/http.d.ts.map +1 -0
- package/dist/clients/registry/http.js +151 -0
- package/dist/clients/registry/http.js.map +1 -0
- package/dist/clients/registry/ibge-municipios.d.ts +25 -0
- package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
- package/dist/clients/registry/ibge-municipios.js +25 -0
- package/dist/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/clients/registry/ibge.d.ts +62 -0
- package/dist/clients/registry/ibge.d.ts.map +1 -0
- package/dist/clients/registry/ibge.js +57 -0
- package/dist/clients/registry/ibge.js.map +1 -0
- package/dist/clients/registry/lookup.d.ts +94 -0
- package/dist/clients/registry/lookup.d.ts.map +1 -0
- package/dist/clients/registry/lookup.js +184 -0
- package/dist/clients/registry/lookup.js.map +1 -0
- package/dist/clients/registry/provider.d.ts +124 -0
- package/dist/clients/registry/provider.d.ts.map +1 -0
- package/dist/clients/registry/provider.js +39 -0
- package/dist/clients/registry/provider.js.map +1 -0
- package/dist/clients/registry/resolve.d.ts +36 -0
- package/dist/clients/registry/resolve.d.ts.map +1 -0
- package/dist/clients/registry/resolve.js +44 -0
- package/dist/clients/registry/resolve.js.map +1 -0
- package/dist/clients/registry/serpro.d.ts +57 -0
- package/dist/clients/registry/serpro.d.ts.map +1 -0
- package/dist/clients/registry/serpro.js +143 -0
- package/dist/clients/registry/serpro.js.map +1 -0
- package/dist/clients/registry/service.d.ts +59 -0
- package/dist/clients/registry/service.d.ts.map +1 -0
- package/dist/clients/registry/service.js +225 -0
- package/dist/clients/registry/service.js.map +1 -0
- package/dist/clients/registry/synthetic.d.ts +30 -0
- package/dist/clients/registry/synthetic.d.ts.map +1 -0
- package/dist/clients/registry/synthetic.js +161 -0
- package/dist/clients/registry/synthetic.js.map +1 -0
- package/dist/clients/repository.d.ts +158 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +186 -9
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +65 -0
- package/dist/collection/branding.d.ts.map +1 -1
- package/dist/collection/branding.js +186 -0
- package/dist/collection/branding.js.map +1 -1
- package/dist/collection/clearance-store.d.ts +39 -0
- package/dist/collection/clearance-store.d.ts.map +1 -0
- package/dist/collection/clearance-store.js +69 -0
- package/dist/collection/clearance-store.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +37 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -1
- package/dist/collection/communication-runtime.js +63 -1
- package/dist/collection/communication-runtime.js.map +1 -1
- package/dist/collection/engine.d.ts +23 -0
- package/dist/collection/engine.d.ts.map +1 -1
- package/dist/collection/engine.js +20 -0
- package/dist/collection/engine.js.map +1 -1
- package/dist/collection/policy.d.ts +25 -0
- package/dist/collection/policy.d.ts.map +1 -1
- package/dist/collection/policy.js +27 -0
- package/dist/collection/policy.js.map +1 -1
- package/dist/communication/clearance.d.ts +53 -0
- package/dist/communication/clearance.d.ts.map +1 -0
- package/dist/communication/clearance.js +15 -0
- package/dist/communication/clearance.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -1
- package/dist/communication/dry-run-scenario.js +5 -0
- package/dist/communication/dry-run-scenario.js.map +1 -1
- package/dist/communication/engine.d.ts +10 -0
- package/dist/communication/engine.d.ts.map +1 -1
- package/dist/communication/engine.js +12 -0
- package/dist/communication/engine.js.map +1 -1
- package/dist/communication/policy.d.ts +16 -0
- package/dist/communication/policy.d.ts.map +1 -1
- package/dist/communication/policy.js.map +1 -1
- package/dist/competence/business-days.d.ts +51 -0
- package/dist/competence/business-days.d.ts.map +1 -0
- package/dist/competence/business-days.js +145 -0
- package/dist/competence/business-days.js.map +1 -0
- package/dist/competence/catalog-validation.d.ts +86 -0
- package/dist/competence/catalog-validation.d.ts.map +1 -0
- package/dist/competence/catalog-validation.js +168 -0
- package/dist/competence/catalog-validation.js.map +1 -0
- package/dist/competence/obligation-preview.d.ts +103 -0
- package/dist/competence/obligation-preview.d.ts.map +1 -0
- package/dist/competence/obligation-preview.js +184 -0
- package/dist/competence/obligation-preview.js.map +1 -0
- package/dist/competence/repository.d.ts +139 -1
- package/dist/competence/repository.d.ts.map +1 -1
- package/dist/competence/repository.js +325 -17
- package/dist/competence/repository.js.map +1 -1
- package/dist/dashboard/pilot-panel.d.ts +100 -0
- package/dist/dashboard/pilot-panel.d.ts.map +1 -0
- package/dist/dashboard/pilot-panel.js +87 -0
- package/dist/dashboard/pilot-panel.js.map +1 -0
- package/dist/dashboard/repository.d.ts.map +1 -1
- package/dist/dashboard/repository.js +11 -1
- package/dist/dashboard/repository.js.map +1 -1
- package/dist/db/client.d.ts +45 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +16 -11
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +36 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +199 -32
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/provision-e2e-identity.d.ts +2 -0
- package/dist/db/provision-e2e-identity.d.ts.map +1 -0
- package/dist/db/provision-e2e-identity.js +114 -0
- package/dist/db/provision-e2e-identity.js.map +1 -0
- package/dist/fiscal/applicability.d.ts +73 -0
- package/dist/fiscal/applicability.d.ts.map +1 -0
- package/dist/fiscal/applicability.js +160 -0
- package/dist/fiscal/applicability.js.map +1 -0
- package/dist/fiscal/collection/authorization.d.ts +152 -0
- package/dist/fiscal/collection/authorization.d.ts.map +1 -0
- package/dist/fiscal/collection/authorization.js +178 -0
- package/dist/fiscal/collection/authorization.js.map +1 -0
- package/dist/fiscal/collection/competence.d.ts +66 -0
- package/dist/fiscal/collection/competence.d.ts.map +1 -0
- package/dist/fiscal/collection/competence.js +90 -0
- package/dist/fiscal/collection/competence.js.map +1 -0
- package/dist/fiscal/collection/first-contact.d.ts +103 -0
- package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
- package/dist/fiscal/collection/first-contact.js +201 -0
- package/dist/fiscal/collection/first-contact.js.map +1 -0
- package/dist/fiscal/collection/plan.d.ts +74 -0
- package/dist/fiscal/collection/plan.d.ts.map +1 -0
- package/dist/fiscal/collection/plan.js +119 -0
- package/dist/fiscal/collection/plan.js.map +1 -0
- package/dist/fiscal/conditions.d.ts +99 -0
- package/dist/fiscal/conditions.d.ts.map +1 -0
- package/dist/fiscal/conditions.js +190 -0
- package/dist/fiscal/conditions.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +114 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +130 -0
- package/dist/fiscal/coverage/model.js.map +1 -0
- package/dist/fiscal/coverage/requests.d.ts +70 -0
- package/dist/fiscal/coverage/requests.d.ts.map +1 -0
- package/dist/fiscal/coverage/requests.js +95 -0
- package/dist/fiscal/coverage/requests.js.map +1 -0
- package/dist/fiscal/credentials/inspect.d.ts +114 -0
- package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
- package/dist/fiscal/credentials/inspect.js +178 -0
- package/dist/fiscal/credentials/inspect.js.map +1 -0
- package/dist/fiscal/credentials/material.d.ts +81 -0
- package/dist/fiscal/credentials/material.d.ts.map +1 -0
- package/dist/fiscal/credentials/material.js +164 -0
- package/dist/fiscal/credentials/material.js.map +1 -0
- package/dist/fiscal/credentials/onboarding.d.ts +119 -0
- package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
- package/dist/fiscal/credentials/onboarding.js +259 -0
- package/dist/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +119 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +186 -0
- package/dist/fiscal/credentials/readiness.js.map +1 -0
- package/dist/fiscal/eligibility.d.ts +106 -0
- package/dist/fiscal/eligibility.d.ts.map +1 -0
- package/dist/fiscal/eligibility.js +194 -0
- package/dist/fiscal/eligibility.js.map +1 -0
- package/dist/fiscal/enrollment.d.ts +91 -0
- package/dist/fiscal/enrollment.d.ts.map +1 -0
- package/dist/fiscal/enrollment.js +126 -0
- package/dist/fiscal/enrollment.js.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.js +220 -0
- package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/fiscal/ingestion/direction.d.ts +60 -0
- package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
- package/dist/fiscal/ingestion/direction.js +32 -0
- package/dist/fiscal/ingestion/direction.js.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.js +222 -0
- package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
- package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
- package/dist/fiscal/ingestion/pipeline.js +699 -0
- package/dist/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/fiscal/ingestion/provider.d.ts +206 -0
- package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/provider.js +47 -0
- package/dist/fiscal/ingestion/provider.js.map +1 -0
- package/dist/fiscal/ingestion/repository.d.ts +82 -0
- package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
- package/dist/fiscal/ingestion/repository.js +127 -0
- package/dist/fiscal/ingestion/repository.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
- package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
- package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.js +112 -0
- package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/fiscal/repository.d.ts +220 -0
- package/dist/fiscal/repository.d.ts.map +1 -0
- package/dist/fiscal/repository.js +449 -0
- package/dist/fiscal/repository.js.map +1 -0
- package/dist/fiscal/sync/circuit.d.ts +86 -0
- package/dist/fiscal/sync/circuit.d.ts.map +1 -0
- package/dist/fiscal/sync/circuit.js +118 -0
- package/dist/fiscal/sync/circuit.js.map +1 -0
- package/dist/fiscal/sync/intervention.d.ts +81 -0
- package/dist/fiscal/sync/intervention.d.ts.map +1 -0
- package/dist/fiscal/sync/intervention.js +135 -0
- package/dist/fiscal/sync/intervention.js.map +1 -0
- package/dist/fiscal/sync/lease.d.ts +118 -0
- package/dist/fiscal/sync/lease.d.ts.map +1 -0
- package/dist/fiscal/sync/lease.js +139 -0
- package/dist/fiscal/sync/lease.js.map +1 -0
- package/dist/fiscal/sync/observability.d.ts +148 -0
- package/dist/fiscal/sync/observability.d.ts.map +1 -0
- package/dist/fiscal/sync/observability.js +239 -0
- package/dist/fiscal/sync/observability.js.map +1 -0
- package/dist/fiscal/sync/orchestrator.d.ts +132 -0
- package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
- package/dist/fiscal/sync/orchestrator.js +487 -0
- package/dist/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/fiscal/sync/policy.d.ts +87 -0
- package/dist/fiscal/sync/policy.d.ts.map +1 -0
- package/dist/fiscal/sync/policy.js +136 -0
- package/dist/fiscal/sync/policy.js.map +1 -0
- package/dist/fiscal/sync/reprocess.d.ts +76 -0
- package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
- package/dist/fiscal/sync/reprocess.js +237 -0
- package/dist/fiscal/sync/reprocess.js.map +1 -0
- package/dist/fiscal/sync/retry.d.ts +82 -0
- package/dist/fiscal/sync/retry.d.ts.map +1 -0
- package/dist/fiscal/sync/retry.js +176 -0
- package/dist/fiscal/sync/retry.js.map +1 -0
- package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
- package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
- package/dist/fiscal/sync/secret-boundary.js +116 -0
- package/dist/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/fiscal/transport/https.d.ts +86 -0
- package/dist/fiscal/transport/https.d.ts.map +1 -0
- package/dist/fiscal/transport/https.js +303 -0
- package/dist/fiscal/transport/https.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +99 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +374 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/fiscal/transport/types.d.ts +134 -0
- package/dist/fiscal/transport/types.d.ts.map +1 -0
- package/dist/fiscal/transport/types.js +88 -0
- package/dist/fiscal/transport/types.js.map +1 -0
- package/dist/import/br-documents.d.ts +26 -0
- package/dist/import/br-documents.d.ts.map +1 -0
- package/dist/import/br-documents.js +78 -0
- package/dist/import/br-documents.js.map +1 -0
- package/dist/import/clients-import.d.ts +122 -4
- package/dist/import/clients-import.d.ts.map +1 -1
- package/dist/import/clients-import.js +341 -41
- package/dist/import/clients-import.js.map +1 -1
- package/dist/index.d.ts +145 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -7
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts +12 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +162 -18
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +2 -2
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/index.js +1 -1
- package/dist/legal/index.js.map +1 -1
- package/dist/legal/types.d.ts +114 -2
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js.map +1 -1
- package/dist/onboarding/persistence.d.ts +10 -1
- package/dist/onboarding/persistence.d.ts.map +1 -1
- package/dist/onboarding/persistence.js +4 -4
- package/dist/onboarding/persistence.js.map +1 -1
- package/dist/pilot/go-live-checklist.d.ts +41 -0
- package/dist/pilot/go-live-checklist.d.ts.map +1 -0
- package/dist/pilot/go-live-checklist.js +209 -0
- package/dist/pilot/go-live-checklist.js.map +1 -0
- package/dist/pilot/milestone.d.ts +56 -0
- package/dist/pilot/milestone.d.ts.map +1 -0
- package/dist/pilot/milestone.js +74 -0
- package/dist/pilot/milestone.js.map +1 -0
- package/dist/platform/capabilities.d.ts +88 -0
- package/dist/platform/capabilities.d.ts.map +1 -0
- package/dist/platform/capabilities.js +169 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/job-contract.d.ts +232 -0
- package/dist/platform/job-contract.d.ts.map +1 -0
- package/dist/platform/job-contract.js +403 -0
- package/dist/platform/job-contract.js.map +1 -0
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +110 -0
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/index.d.ts +8 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +4 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/platform-exemption.d.ts +89 -0
- package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
- package/dist/subscription-billing/platform-exemption.js +113 -0
- package/dist/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/subscription-billing/service.d.ts +74 -0
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +182 -16
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/tenancy/features.d.ts +69 -0
- package/dist/tenancy/features.d.ts.map +1 -0
- package/dist/tenancy/features.js +123 -0
- package/dist/tenancy/features.js.map +1 -0
- package/dist/tenancy/settings.d.ts +63 -0
- package/dist/tenancy/settings.d.ts.map +1 -0
- package/dist/tenancy/settings.js +218 -0
- package/dist/tenancy/settings.js.map +1 -0
- package/dist/users/repository.d.ts +16 -1
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +24 -1
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +69 -1
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +88 -5
- package/dist/vault/repository.js.map +1 -1
- package/package.json +10 -2
- package/src/db/migrations/0045_role_write_scope.sql +122 -0
- package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
- package/src/db/migrations/0047_recipient_clearance.sql +89 -0
- package/src/db/migrations/0048_item_type_note.sql +16 -0
- package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
- package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
- package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
- package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
- package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
- package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
- package/src/db/migrations/0055_job_capability_contract.sql +300 -0
- package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
- package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
- package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
- package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
- package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
- package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
- package/src/db/migrations/0062_first_contact_and_capability_truth.sql +119 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../../src/fiscal/coverage/requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O que dá para saber sobre um certificado SEM falar com ninguém.
|
|
3
|
+
*
|
|
4
|
+
* ## Por que a validação local existe, e o que ela não é
|
|
5
|
+
*
|
|
6
|
+
* Um A1 recém-cadastrado tem duas perguntas em aberto, e elas têm custos
|
|
7
|
+
* opostos. "A senha abre o arquivo?" custa milissegundos e nenhuma consequência
|
|
8
|
+
* externa. "A Receita aceita este titular?" custa uma requisição autenticada em
|
|
9
|
+
* nome de um terceiro — e, se ela for feita fora de hora, custa ao CLIENTE um
|
|
10
|
+
* CNPJ bloqueado.
|
|
11
|
+
*
|
|
12
|
+
* Este módulo responde só a primeira família de perguntas. O produto inteiro
|
|
13
|
+
* depende de nunca confundir as duas: `verified_at` (1004) continua significando
|
|
14
|
+
* "o ambiente oficial já aceitou", e nada aqui o preenche.
|
|
15
|
+
*
|
|
16
|
+
* ## Por que o SecureContext, e não uma biblioteca de PKCS#12
|
|
17
|
+
*
|
|
18
|
+
* O Node não expõe leitor de PKCS#12 na API pública — `X509Certificate` lê PEM e
|
|
19
|
+
* DER, não `.pfx`. As saídas óbvias seriam uma dependência nova (superfície
|
|
20
|
+
* grande para uma tela de upload) ou chamar o binário `openssl` (que exige o
|
|
21
|
+
* binário na imagem, e cuja saída de erro cita caminho de arquivo e sujeito do
|
|
22
|
+
* certificado).
|
|
23
|
+
*
|
|
24
|
+
* A saída usada aqui é o leitor de PKCS#12 que já está no processo: o do OpenSSL
|
|
25
|
+
* que o próprio Node embute. `tls.createSecureContext({ pfx, passphrase })` o
|
|
26
|
+
* invoca e LANÇA na hora se a senha não abrir — esse é o teste de senha, e ele
|
|
27
|
+
* não custa nem um socket. O contexto resultante guarda o certificado carregado,
|
|
28
|
+
* e o handle nativo o devolve em DER.
|
|
29
|
+
*
|
|
30
|
+
* A propriedade que isso compra é um ORÁCULO CORRETO: "abre aqui" passa a
|
|
31
|
+
* significar exatamente "abre no handshake real", porque é o mesmo código de
|
|
32
|
+
* OpenSSL, com os mesmos parâmetros, que o transporte de mTLS usaria. Um parser
|
|
33
|
+
* de terceiro poderia aceitar um arquivo que o handshake recusa — e a diferença
|
|
34
|
+
* apareceria só contra o servidor da Receita.
|
|
35
|
+
*
|
|
36
|
+
* ## A primeira escrita usava um servidor TLS em loopback, e estava errada
|
|
37
|
+
*
|
|
38
|
+
* Ela subia um servidor com o `pfx` em `127.0.0.1`, conectava um cliente do
|
|
39
|
+
* mesmo processo e lia o certificado apresentado. Funcionava — e exigia
|
|
40
|
+
* `rejectUnauthorized: false` no cliente, porque um A1 é assinado por uma AC da
|
|
41
|
+
* ICP-Brasil que não está no truststore e o nome nunca seria `localhost`.
|
|
42
|
+
*
|
|
43
|
+
* O guarda `tls-no-bypass` reprovou, e com razão. A resposta certa não era
|
|
44
|
+
* abrir uma exceção nominal para este arquivo: um controle com uma exceção tem
|
|
45
|
+
* duas na semana seguinte. Era não precisar da exceção — o que este caminho
|
|
46
|
+
* consegue, com menos código e sem socket nenhum.
|
|
47
|
+
*
|
|
48
|
+
* Nada toca o disco e nada toca a rede: `pfx` é um `Buffer`, e tudo acontece
|
|
49
|
+
* dentro do processo.
|
|
50
|
+
*/
|
|
51
|
+
/** Classe da falha. CLASSE — a mensagem do OpenSSL cita sujeito e caminho. */
|
|
52
|
+
export type CertificateInspectionFailure = 'wrong_password' | 'malformed_material' | 'unsupported_material' | 'inspection_failed';
|
|
53
|
+
export interface CertificateFacts {
|
|
54
|
+
/** sha256 do DER do certificado apresentado, minúsculo e sem dois-pontos. */
|
|
55
|
+
fingerprintSha256: string;
|
|
56
|
+
subjectCommonName: string | null;
|
|
57
|
+
issuerCommonName: string | null;
|
|
58
|
+
/** Últimos 8 caracteres do serial. O serial inteiro identifica sem acrescentar. */
|
|
59
|
+
serialTail: string | null;
|
|
60
|
+
validFrom: string;
|
|
61
|
+
validTo: string;
|
|
62
|
+
/** Já venceu, medido contra o relógio de quem inspeciona. */
|
|
63
|
+
expired: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* CNPJ/CPF lido DO MATERIAL — nunca o digitado no cadastro.
|
|
66
|
+
* `null` quando o certificado não o carrega em forma reconhecível.
|
|
67
|
+
*/
|
|
68
|
+
document: string | null;
|
|
69
|
+
}
|
|
70
|
+
export type CertificateInspection = {
|
|
71
|
+
status: 'ok';
|
|
72
|
+
facts: CertificateFacts;
|
|
73
|
+
} | {
|
|
74
|
+
status: 'failed';
|
|
75
|
+
reason: CertificateInspectionFailure;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Inspeciona o material, sem rede e sem disco.
|
|
79
|
+
*
|
|
80
|
+
* NUNCA lança: toda falha vira uma classe. Quem chama é uma rota de upload, e
|
|
81
|
+
* uma exceção com texto de OpenSSL atravessando até o handler é exatamente como
|
|
82
|
+
* o sujeito de um certificado acaba num log.
|
|
83
|
+
*/
|
|
84
|
+
/**
|
|
85
|
+
* Inspeciona o material, sem rede e sem disco.
|
|
86
|
+
*
|
|
87
|
+
* NUNCA lança: toda falha vira uma classe. Quem chama é uma rota de upload, e
|
|
88
|
+
* uma exceção com texto de OpenSSL atravessando até o handler é exatamente como
|
|
89
|
+
* o sujeito de um certificado acaba num log.
|
|
90
|
+
*
|
|
91
|
+
* `async` sem `await` é deliberado: o contrato é assíncrono porque a primeira
|
|
92
|
+
* implementação precisava de um handshake, e porque uma leitura de material
|
|
93
|
+
* criptográfico é o tipo de operação que pode voltar a precisar. Mudar a
|
|
94
|
+
* assinatura para síncrona obrigaria todo chamador a mudar junto, por nenhum
|
|
95
|
+
* ganho.
|
|
96
|
+
*/
|
|
97
|
+
export declare function inspectPkcs12(pfx: Buffer, passphrase: string | undefined): Promise<CertificateInspection>;
|
|
98
|
+
/**
|
|
99
|
+
* O certificado é DESTE cliente?
|
|
100
|
+
*
|
|
101
|
+
* Três respostas, e a do meio é a que impede o vínculo silencioso:
|
|
102
|
+
*
|
|
103
|
+
* `match` os dois documentos existem e são o mesmo.
|
|
104
|
+
* `mismatch` os dois existem e são diferentes. Exige assinatura humana
|
|
105
|
+
* (a restrição está na 0060, não aqui).
|
|
106
|
+
* `indeterminate` falta um dos dois. Não é aprovação.
|
|
107
|
+
*
|
|
108
|
+
* A comparação é por DÍGITOS: o cadastro do produto guarda o documento sem
|
|
109
|
+
* máscara, o certificado o traz sem máscara, e uma comparação textual passaria a
|
|
110
|
+
* reprovar no dia em que alguém colasse um CNPJ pontuado num dos dois lados.
|
|
111
|
+
*/
|
|
112
|
+
export type IdentityMatch = 'match' | 'mismatch' | 'indeterminate';
|
|
113
|
+
export declare function matchIdentity(certificateDocument: string | null, clientDocument: string | null | undefined): IdentityMatch;
|
|
114
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/fiscal/credentials/inspect.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,4BAA4B,GACtC,gBAAgB,GAAG,oBAAoB,GAAG,sBAAsB,GAAG,mBAAmB,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mFAAmF;IACnF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AAe/D;;;;;;GAMG;AACH;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CAyBhC;AA+GD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC;AAEnE,wBAAgB,aAAa,CAC3B,mBAAmB,EAAE,MAAM,GAAG,IAAI,EAClC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACxC,aAAa,CAKf"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { createSecureContext } from 'node:tls';
|
|
2
|
+
import { X509Certificate } from 'node:crypto';
|
|
3
|
+
/**
|
|
4
|
+
* OID 2.16.76.1.3.3 — o CNPJ da pessoa jurídica no `otherName` do
|
|
5
|
+
* `subjectAltName`, na forma que a ICP-Brasil padronizou (DOC-ICP-04).
|
|
6
|
+
*
|
|
7
|
+
* Em DER: tag `06`, comprimento `05`, e os componentes `2.16` colapsados em
|
|
8
|
+
* `0x60`. Procurar a sequência de bytes é mais confiável que ler
|
|
9
|
+
* `x509.subjectAltName`, que em várias versões do Node devolve `undefined` ou
|
|
10
|
+
* `othername:<unsupported>` justamente para os `otherName` do ICP-Brasil.
|
|
11
|
+
*/
|
|
12
|
+
const OID_CNPJ_ICP_BRASIL = Buffer.from([0x06, 0x05, 0x60, 0x4c, 0x01, 0x03, 0x03]);
|
|
13
|
+
/** Janela de busca depois do OID: o valor vem logo em seguida, dentro do mesmo `otherName`. */
|
|
14
|
+
const OID_VALUE_WINDOW = 48;
|
|
15
|
+
/**
|
|
16
|
+
* Inspeciona o material, sem rede e sem disco.
|
|
17
|
+
*
|
|
18
|
+
* NUNCA lança: toda falha vira uma classe. Quem chama é uma rota de upload, e
|
|
19
|
+
* uma exceção com texto de OpenSSL atravessando até o handler é exatamente como
|
|
20
|
+
* o sujeito de um certificado acaba num log.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Inspeciona o material, sem rede e sem disco.
|
|
24
|
+
*
|
|
25
|
+
* NUNCA lança: toda falha vira uma classe. Quem chama é uma rota de upload, e
|
|
26
|
+
* uma exceção com texto de OpenSSL atravessando até o handler é exatamente como
|
|
27
|
+
* o sujeito de um certificado acaba num log.
|
|
28
|
+
*
|
|
29
|
+
* `async` sem `await` é deliberado: o contrato é assíncrono porque a primeira
|
|
30
|
+
* implementação precisava de um handshake, e porque uma leitura de material
|
|
31
|
+
* criptográfico é o tipo de operação que pode voltar a precisar. Mudar a
|
|
32
|
+
* assinatura para síncrona obrigaria todo chamador a mudar junto, por nenhum
|
|
33
|
+
* ganho.
|
|
34
|
+
*/
|
|
35
|
+
export async function inspectPkcs12(pfx, passphrase) {
|
|
36
|
+
if (pfx.byteLength === 0)
|
|
37
|
+
return { status: 'failed', reason: 'malformed_material' };
|
|
38
|
+
// Primeiro portão: o contexto abre? Isto é a checagem de senha, e ela lança
|
|
39
|
+
// aqui — antes de existir qualquer outra coisa.
|
|
40
|
+
let context;
|
|
41
|
+
try {
|
|
42
|
+
context = createSecureContext({ pfx, passphrase, minVersion: 'TLSv1.2' });
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
return { status: 'failed', reason: classify(err) };
|
|
46
|
+
}
|
|
47
|
+
let der;
|
|
48
|
+
try {
|
|
49
|
+
der = certificateDerFrom(context);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return { status: 'failed', reason: classify(err) };
|
|
53
|
+
}
|
|
54
|
+
if (!der || der.byteLength === 0)
|
|
55
|
+
return { status: 'failed', reason: 'inspection_failed' };
|
|
56
|
+
try {
|
|
57
|
+
return { status: 'ok', facts: factsFrom(new X509Certificate(der)) };
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
return { status: 'failed', reason: classify(err) };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* O DER do certificado carregado no contexto.
|
|
65
|
+
*
|
|
66
|
+
* `context.getCertificate()` é o handle NATIVO do `SecureContext`, não a API
|
|
67
|
+
* pública documentada do Node. Por isso o acesso é defensivo em vez de direto: o
|
|
68
|
+
* dia em que uma versão do Node o renomear, o produto deve responder
|
|
69
|
+
* `inspection_failed` — e a suíte, que lê um PKCS#12 sintético de verdade, vai
|
|
70
|
+
* ficar vermelha na atualização, que é quando alguém pode agir.
|
|
71
|
+
*
|
|
72
|
+
* A alternativa — depender do binário `openssl` na imagem — troca este risco por
|
|
73
|
+
* um pior: uma falha que só aparece em produção, num contêiner onde ninguém
|
|
74
|
+
* conferiu o que está instalado.
|
|
75
|
+
*/
|
|
76
|
+
function certificateDerFrom(context) {
|
|
77
|
+
const handle = context.context;
|
|
78
|
+
const der = handle?.getCertificate?.();
|
|
79
|
+
return Buffer.isBuffer(der) ? der : null;
|
|
80
|
+
}
|
|
81
|
+
function factsFrom(cert) {
|
|
82
|
+
const validTo = new Date(cert.validTo);
|
|
83
|
+
return {
|
|
84
|
+
fingerprintSha256: cert.fingerprint256.replace(/:/g, '').toLowerCase(),
|
|
85
|
+
subjectCommonName: commonName(cert.subject),
|
|
86
|
+
issuerCommonName: commonName(cert.issuer),
|
|
87
|
+
serialTail: cert.serialNumber ? cert.serialNumber.slice(-8) : null,
|
|
88
|
+
validFrom: new Date(cert.validFrom).toISOString(),
|
|
89
|
+
validTo: validTo.toISOString(),
|
|
90
|
+
expired: validTo.getTime() <= Date.now(),
|
|
91
|
+
document: documentFrom(cert),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** `CN=` do DN multilinha que o Node devolve. `null` quando não há. */
|
|
95
|
+
function commonName(dn) {
|
|
96
|
+
if (!dn)
|
|
97
|
+
return null;
|
|
98
|
+
for (const line of dn.split('\n')) {
|
|
99
|
+
const m = /^\s*CN\s*=\s*(.+?)\s*$/.exec(line);
|
|
100
|
+
if (m?.[1])
|
|
101
|
+
return m[1];
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* O documento do titular, do material.
|
|
107
|
+
*
|
|
108
|
+
* Duas fontes, nesta ordem — e a ordem importa:
|
|
109
|
+
*
|
|
110
|
+
* 1. O `otherName` do OID da ICP-Brasil, varrido no DER. É onde a norma manda
|
|
111
|
+
* escrever, é o que a Receita valida, e é o único lugar que não depende de
|
|
112
|
+
* convenção de quem emitiu.
|
|
113
|
+
* 2. O sufixo `:<14 dígitos>` do `CN`, convenção quase universal dos e-CNPJ.
|
|
114
|
+
*
|
|
115
|
+
* Não há terceira fonte. Procurar "14 dígitos em qualquer lugar do sujeito"
|
|
116
|
+
* casaria com um CEP colado a um telefone e devolveria um CNPJ inventado — que
|
|
117
|
+
* é pior que `null`, porque `null` deixa a comparação `indeterminate` e essa é
|
|
118
|
+
* a resposta honesta.
|
|
119
|
+
*/
|
|
120
|
+
function documentFrom(cert) {
|
|
121
|
+
const fromOid = documentFromDer(cert.raw);
|
|
122
|
+
if (fromOid)
|
|
123
|
+
return fromOid;
|
|
124
|
+
const cn = commonName(cert.subject);
|
|
125
|
+
const m = cn ? /:(\d{11}|\d{14})\s*$/.exec(cn) : null;
|
|
126
|
+
return m?.[1] ?? null;
|
|
127
|
+
}
|
|
128
|
+
function documentFromDer(der) {
|
|
129
|
+
let from = 0;
|
|
130
|
+
for (;;) {
|
|
131
|
+
const at = der.indexOf(OID_CNPJ_ICP_BRASIL, from);
|
|
132
|
+
if (at < 0)
|
|
133
|
+
return null;
|
|
134
|
+
const window = der
|
|
135
|
+
.subarray(at + OID_CNPJ_ICP_BRASIL.length, at + OID_CNPJ_ICP_BRASIL.length + OID_VALUE_WINDOW)
|
|
136
|
+
.toString('latin1');
|
|
137
|
+
const digits = /(\d{14})/.exec(window);
|
|
138
|
+
if (digits?.[1])
|
|
139
|
+
return digits[1];
|
|
140
|
+
from = at + 1;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Traduz a falha do OpenSSL em classe, olhando SÓ os fragmentos conhecidos.
|
|
145
|
+
*
|
|
146
|
+
* A mensagem inteira nunca é propagada nem registrada. `mac verify failure` é a
|
|
147
|
+
* resposta do PKCS#12 a uma senha que não abre o MAC — é o único caso em que se
|
|
148
|
+
* pode dizer ao operador "a senha está errada" com alguma confiança.
|
|
149
|
+
*/
|
|
150
|
+
function classify(err) {
|
|
151
|
+
const raw = err instanceof Error ? err.message : '';
|
|
152
|
+
const message = raw.toLowerCase();
|
|
153
|
+
if (message.includes('mac verify failure') || message.includes('invalid password')) {
|
|
154
|
+
return 'wrong_password';
|
|
155
|
+
}
|
|
156
|
+
if (message.includes('not enough data') ||
|
|
157
|
+
message.includes('wrong tag') ||
|
|
158
|
+
message.includes('header too long') ||
|
|
159
|
+
message.includes('nested asn1') ||
|
|
160
|
+
message.includes('asn1')) {
|
|
161
|
+
return 'malformed_material';
|
|
162
|
+
}
|
|
163
|
+
if (message.includes('unsupported') || message.includes('unknown cipher')) {
|
|
164
|
+
return 'unsupported_material';
|
|
165
|
+
}
|
|
166
|
+
return 'inspection_failed';
|
|
167
|
+
}
|
|
168
|
+
export function matchIdentity(certificateDocument, clientDocument) {
|
|
169
|
+
const a = digitsOnly(certificateDocument);
|
|
170
|
+
const b = digitsOnly(clientDocument);
|
|
171
|
+
if (!a || !b)
|
|
172
|
+
return 'indeterminate';
|
|
173
|
+
return a === b ? 'match' : 'mismatch';
|
|
174
|
+
}
|
|
175
|
+
function digitsOnly(v) {
|
|
176
|
+
return (v ?? '').replace(/\D/g, '');
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/fiscal/credentials/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Tx } from '../../db/client.js';
|
|
2
|
+
import type { Keyring } from '../../vault/crypto.js';
|
|
3
|
+
import type { ClientTlsMaterial } from '../transport/types.js';
|
|
4
|
+
import type { FiscalCredentialKind } from '../eligibility.js';
|
|
5
|
+
import { type FiscalSecretAuthorization } from '../sync/secret-boundary.js';
|
|
6
|
+
/**
|
|
7
|
+
* O material de TLS mútuo, do cofre para a memória — e para lugar nenhum mais.
|
|
8
|
+
*
|
|
9
|
+
* ## As três coisas que este módulo recusa a fazer
|
|
10
|
+
*
|
|
11
|
+
* **Não escreve no disco.** Um PKCS#12 em `/tmp` precisa de permissão restrita,
|
|
12
|
+
* de limpeza garantida em todo caminho de saída (inclusive `SIGKILL`) e de
|
|
13
|
+
* alguém que lembre das duas coisas no dia do incidente. O `https.Agent` do Node
|
|
14
|
+
* aceita `Buffer`, então o arquivo temporário nunca é necessário — e "nunca
|
|
15
|
+
* necessário" é a única forma segura de "nunca esquecido".
|
|
16
|
+
*
|
|
17
|
+
* **Não passa por variável de ambiente.** Env var vaza em `env`, em dump de
|
|
18
|
+
* processo, em painel de provedor e em log de boot. Este ecossistema já perdeu
|
|
19
|
+
* `DATABASE_URL` inteiro por um `env | grep` bem-intencionado.
|
|
20
|
+
*
|
|
21
|
+
* **Não aparece em log, erro ou trilha.** O único campo desta estrutura que
|
|
22
|
+
* pode ser impresso é `fingerprintSha256`, e é por isso que ele existe: ele
|
|
23
|
+
* responde "qual certificado foi apresentado?" sem revelar nada dele.
|
|
24
|
+
*
|
|
25
|
+
* ## O envelope
|
|
26
|
+
*
|
|
27
|
+
* `vault_credential` guarda UM texto cifrado. Para certificado, esse texto é um
|
|
28
|
+
* JSON com formato declarado — e não o base64 solto, que obrigaria quem lê a
|
|
29
|
+
* adivinhar se recebeu PKCS#12 ou PEM:
|
|
30
|
+
*
|
|
31
|
+
* {"format":"pkcs12","material":"<base64 do .pfx>","passphrase":"..."}
|
|
32
|
+
* {"format":"pem","cert":"<base64 do PEM>","key":"<base64 do PEM>"}
|
|
33
|
+
*
|
|
34
|
+
* O `format` é obrigatório. Um envelope sem ele é recusado em vez de tentado
|
|
35
|
+
* como PKCS#12: adivinhar formato de material criptográfico produz um erro de
|
|
36
|
+
* OpenSSL seis camadas adiante, indistinguível de senha errada.
|
|
37
|
+
*/
|
|
38
|
+
/** O que deu errado ao buscar o material. Classe, nunca o texto do sistema. */
|
|
39
|
+
export type TlsMaterialFailure = 'no_credential' | 'vault_unavailable' | 'envelope_unreadable' | 'unsupported_format';
|
|
40
|
+
export type TlsMaterialResult = {
|
|
41
|
+
status: 'ok';
|
|
42
|
+
material: ClientTlsMaterial;
|
|
43
|
+
} | {
|
|
44
|
+
status: 'unavailable';
|
|
45
|
+
reason: TlsMaterialFailure;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Constrói o material a partir do envelope decifrado.
|
|
49
|
+
*
|
|
50
|
+
* Separado da leitura do banco de propósito: é esta função que o teste
|
|
51
|
+
* exercita com um PKCS#12 sintético, sem precisar de cofre nem de tenant.
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildTlsMaterial(raw: string): TlsMaterialResult;
|
|
54
|
+
/**
|
|
55
|
+
* Busca o material do certificado de um cliente.
|
|
56
|
+
*
|
|
57
|
+
* O ponteiro vem de `digital_certificate.vault_credential_id` — o MESMO domínio
|
|
58
|
+
* que a prontidão lê, e não uma segunda tabela de credencial fiscal. Duas
|
|
59
|
+
* origens para o mesmo fato divergiriam na primeira atualização de uma só.
|
|
60
|
+
*
|
|
61
|
+
* NUNCA lança por ausência: um cliente sem certificado é estado normal, e uma
|
|
62
|
+
* exceção aqui derrubaria o worker no meio da carteira por causa do primeiro
|
|
63
|
+
* cliente não configurado.
|
|
64
|
+
*
|
|
65
|
+
* ## O `authorization` não é decoração
|
|
66
|
+
*
|
|
67
|
+
* Esta é a única porta do produto para material de certificado, e ela agora
|
|
68
|
+
* EXIGE o passe que o orquestrador emite depois do último portão. Um chamador
|
|
69
|
+
* que tente abrir o cofre antes disso — para "só conferir se o certificado
|
|
70
|
+
* abre", que é sempre como começa — recebe `FiscalSecretBoundaryError` em vez de
|
|
71
|
+
* uma chave privada. Ver `sync/secret-boundary.ts`.
|
|
72
|
+
*
|
|
73
|
+
* A checagem lança ANTES do primeiro `SELECT`: nem a existência do ponteiro é
|
|
74
|
+
* revelada a quem não passou pelos portões.
|
|
75
|
+
*/
|
|
76
|
+
export declare function loadFiscalTlsMaterial(tx: Tx, keyring: Keyring, tenantId: string, input: {
|
|
77
|
+
clientId: string;
|
|
78
|
+
kind?: FiscalCredentialKind;
|
|
79
|
+
authorization: FiscalSecretAuthorization;
|
|
80
|
+
}): Promise<TlsMaterialResult>;
|
|
81
|
+
//# sourceMappingURL=material.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material.d.ts","sourceRoot":"","sources":["../../../src/fiscal/credentials/material.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,kBAAkB,GAC5B,eAAe,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;AAEvF,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,GAC7C;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAe1D;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAsC/D;AAwCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,aAAa,EAAE,yBAAyB,CAAC;CAC1C,GACA,OAAO,CAAC,iBAAiB,CAAC,CA6D5B"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { revealWriteOnlySecretForProcess } from '../../vault/repository.js';
|
|
3
|
+
import { FiscalSecretBoundaryError, assertFiscalSecretAccess, } from '../sync/secret-boundary.js';
|
|
4
|
+
/**
|
|
5
|
+
* Constrói o material a partir do envelope decifrado.
|
|
6
|
+
*
|
|
7
|
+
* Separado da leitura do banco de propósito: é esta função que o teste
|
|
8
|
+
* exercita com um PKCS#12 sintético, sem precisar de cofre nem de tenant.
|
|
9
|
+
*/
|
|
10
|
+
export function buildTlsMaterial(raw) {
|
|
11
|
+
let envelope;
|
|
12
|
+
try {
|
|
13
|
+
envelope = JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Sem `err.message`: um JSON malformado costuma vir citado inteiro na
|
|
17
|
+
// exceção, e o "JSON malformado" aqui é um certificado.
|
|
18
|
+
return { status: 'unavailable', reason: 'envelope_unreadable' };
|
|
19
|
+
}
|
|
20
|
+
if (!envelope || typeof envelope !== 'object' || !('format' in envelope)) {
|
|
21
|
+
return { status: 'unavailable', reason: 'envelope_unreadable' };
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
if (envelope.format === 'pkcs12') {
|
|
25
|
+
if (typeof envelope.material !== 'string' || envelope.material === '') {
|
|
26
|
+
return { status: 'unavailable', reason: 'envelope_unreadable' };
|
|
27
|
+
}
|
|
28
|
+
const pfx = Buffer.from(envelope.material, 'base64');
|
|
29
|
+
if (pfx.byteLength === 0)
|
|
30
|
+
return { status: 'unavailable', reason: 'envelope_unreadable' };
|
|
31
|
+
return { status: 'ok', material: sealed({ pfx, passphrase: envelope.passphrase }) };
|
|
32
|
+
}
|
|
33
|
+
if (envelope.format === 'pem') {
|
|
34
|
+
if (typeof envelope.cert !== 'string' || typeof envelope.key !== 'string') {
|
|
35
|
+
return { status: 'unavailable', reason: 'envelope_unreadable' };
|
|
36
|
+
}
|
|
37
|
+
const cert = Buffer.from(envelope.cert, 'base64');
|
|
38
|
+
const key = Buffer.from(envelope.key, 'base64');
|
|
39
|
+
const ca = (envelope.ca ?? []).map((c) => Buffer.from(c, 'base64'));
|
|
40
|
+
if (cert.byteLength === 0 || key.byteLength === 0) {
|
|
41
|
+
return { status: 'unavailable', reason: 'envelope_unreadable' };
|
|
42
|
+
}
|
|
43
|
+
return { status: 'ok', material: sealed({ cert, key, ca }) };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return { status: 'unavailable', reason: 'envelope_unreadable' };
|
|
48
|
+
}
|
|
49
|
+
return { status: 'unavailable', reason: 'unsupported_format' };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Embrulha os buffers com a impressão digital e com o descarte.
|
|
53
|
+
*
|
|
54
|
+
* A impressão é do material APRESENTADO (o `.pfx` ou o `cert`), nunca da chave
|
|
55
|
+
* privada: identificar qual certificado foi usado não deve exigir tocar no
|
|
56
|
+
* segredo, nem sequer para calcular um hash.
|
|
57
|
+
*/
|
|
58
|
+
function sealed(parts) {
|
|
59
|
+
const identity = parts.pfx ?? parts.cert ?? Buffer.alloc(0);
|
|
60
|
+
const fingerprintSha256 = createHash('sha256').update(identity).digest('hex');
|
|
61
|
+
let disposed = false;
|
|
62
|
+
return {
|
|
63
|
+
...(parts.pfx ? { pfx: parts.pfx } : {}),
|
|
64
|
+
...(parts.passphrase ? { passphrase: parts.passphrase } : {}),
|
|
65
|
+
...(parts.cert ? { cert: parts.cert } : {}),
|
|
66
|
+
...(parts.key ? { key: parts.key } : {}),
|
|
67
|
+
...(parts.ca && parts.ca.length > 0 ? { ca: parts.ca } : {}),
|
|
68
|
+
fingerprintSha256,
|
|
69
|
+
dispose() {
|
|
70
|
+
if (disposed)
|
|
71
|
+
return;
|
|
72
|
+
disposed = true;
|
|
73
|
+
// Zerar não é cerimônia: o Buffer sobrevive no heap até o GC passar, e um
|
|
74
|
+
// heap dump de produção é um arquivo que alguém abre e guarda.
|
|
75
|
+
parts.pfx?.fill(0);
|
|
76
|
+
parts.cert?.fill(0);
|
|
77
|
+
parts.key?.fill(0);
|
|
78
|
+
for (const c of parts.ca ?? [])
|
|
79
|
+
c.fill(0);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Busca o material do certificado de um cliente.
|
|
85
|
+
*
|
|
86
|
+
* O ponteiro vem de `digital_certificate.vault_credential_id` — o MESMO domínio
|
|
87
|
+
* que a prontidão lê, e não uma segunda tabela de credencial fiscal. Duas
|
|
88
|
+
* origens para o mesmo fato divergiriam na primeira atualização de uma só.
|
|
89
|
+
*
|
|
90
|
+
* NUNCA lança por ausência: um cliente sem certificado é estado normal, e uma
|
|
91
|
+
* exceção aqui derrubaria o worker no meio da carteira por causa do primeiro
|
|
92
|
+
* cliente não configurado.
|
|
93
|
+
*
|
|
94
|
+
* ## O `authorization` não é decoração
|
|
95
|
+
*
|
|
96
|
+
* Esta é a única porta do produto para material de certificado, e ela agora
|
|
97
|
+
* EXIGE o passe que o orquestrador emite depois do último portão. Um chamador
|
|
98
|
+
* que tente abrir o cofre antes disso — para "só conferir se o certificado
|
|
99
|
+
* abre", que é sempre como começa — recebe `FiscalSecretBoundaryError` em vez de
|
|
100
|
+
* uma chave privada. Ver `sync/secret-boundary.ts`.
|
|
101
|
+
*
|
|
102
|
+
* A checagem lança ANTES do primeiro `SELECT`: nem a existência do ponteiro é
|
|
103
|
+
* revelada a quem não passou pelos portões.
|
|
104
|
+
*/
|
|
105
|
+
export async function loadFiscalTlsMaterial(tx, keyring, tenantId, input) {
|
|
106
|
+
assertFiscalSecretAccess(input.authorization, 'loadFiscalTlsMaterial');
|
|
107
|
+
/*
|
|
108
|
+
* O passe é AUTÊNTICO — mas para quem?
|
|
109
|
+
*
|
|
110
|
+
* `assertFiscalSecretAccess` responde "esta autorização saiu dos portões", e
|
|
111
|
+
* não "esta autorização é DESTE cliente". A diferença abre um caso que a RLS
|
|
112
|
+
* não fecha: dentro do MESMO escritório, um passe emitido para o cliente X
|
|
113
|
+
* abriria o certificado do cliente Y, porque a política de tenant considera as
|
|
114
|
+
* duas linhas visíveis. É o `WHERE client_id = ...` abaixo que escolhe a
|
|
115
|
+
* linha, e ele obedece ao parâmetro, não ao passe.
|
|
116
|
+
*
|
|
117
|
+
* Hoje o orquestrador emite e usa o passe no mesmo par (tenant, cliente), de
|
|
118
|
+
* modo que o caso não ocorre. Mas é exatamente esse tipo de invariante — "quem
|
|
119
|
+
* chama sempre passa os mesmos valores" — que um refactor quebra em silêncio,
|
|
120
|
+
* e o módulo inteiro da fronteira existe porque convenção não é portão.
|
|
121
|
+
*
|
|
122
|
+
* A checagem é de ESCOPO, e vem antes de qualquer consulta: um passe fora do
|
|
123
|
+
* seu escopo não chega nem a saber se existe certificado do outro lado.
|
|
124
|
+
*/
|
|
125
|
+
if (input.authorization.tenantId !== tenantId ||
|
|
126
|
+
input.authorization.clientId !== input.clientId) {
|
|
127
|
+
throw new FiscalSecretBoundaryError('loadFiscalTlsMaterial:scope');
|
|
128
|
+
}
|
|
129
|
+
const certType = input.kind === 'certificate_a3' ? 'A3' : 'A1';
|
|
130
|
+
let rows;
|
|
131
|
+
try {
|
|
132
|
+
rows = await tx `
|
|
133
|
+
SELECT vault_credential_id
|
|
134
|
+
FROM digital_certificate
|
|
135
|
+
WHERE client_id = ${input.clientId}
|
|
136
|
+
AND cert_type = ${certType}
|
|
137
|
+
AND deleted_at IS NULL
|
|
138
|
+
ORDER BY expires_at DESC
|
|
139
|
+
LIMIT 1
|
|
140
|
+
`;
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
const code = err?.code;
|
|
144
|
+
if (code === '42P01' || code === '42703') {
|
|
145
|
+
return { status: 'unavailable', reason: 'no_credential' };
|
|
146
|
+
}
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
const pointer = rows[0]?.vault_credential_id;
|
|
150
|
+
if (!pointer)
|
|
151
|
+
return { status: 'unavailable', reason: 'no_credential' };
|
|
152
|
+
let secret;
|
|
153
|
+
try {
|
|
154
|
+
({ secret } = await revealWriteOnlySecretForProcess(tx, keyring, tenantId, pointer));
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Ponteiro pendurado, chave de cifra ausente, linha invisível sob RLS: os
|
|
158
|
+
// três colapsam em "não deu para abrir", e diferenciá-los aqui vazaria a
|
|
159
|
+
// existência de um registro que a RLS já respondeu como ausente.
|
|
160
|
+
return { status: 'unavailable', reason: 'vault_unavailable' };
|
|
161
|
+
}
|
|
162
|
+
return buildTlsMaterial(secret);
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=material.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material.js","sourceRoot":"","sources":["../../../src/fiscal/credentials/material.ts"],"names":[],"mappings":"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"}
|