shield360 1.1.0 → 1.2.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/README.md +330 -3
- package/dist/__tests__/build-info.test.js +8 -1
- package/dist/__tests__/build-info.test.js.map +1 -1
- package/dist/__tests__/code-location.test.js +1 -1
- package/dist/__tests__/masking.test.d.ts +1 -0
- package/dist/__tests__/masking.test.js +66 -0
- package/dist/__tests__/masking.test.js.map +1 -0
- package/dist/__tests__/register.e2e.test.d.ts +1 -0
- package/dist/__tests__/register.e2e.test.js +264 -0
- package/dist/__tests__/register.e2e.test.js.map +1 -0
- package/dist/__tests__/register.test.js +60 -0
- package/dist/__tests__/register.test.js.map +1 -1
- package/dist/agents/__tests__/agents.test.d.ts +1 -0
- package/dist/agents/__tests__/agents.test.js +529 -0
- package/dist/agents/__tests__/agents.test.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.js +25 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/passport.d.ts +92 -0
- package/dist/agents/passport.js +301 -0
- package/dist/agents/passport.js.map +1 -0
- package/dist/agents/policy.d.ts +24 -0
- package/dist/agents/policy.js +93 -0
- package/dist/agents/policy.js.map +1 -0
- package/dist/agents/replay.d.ts +20 -0
- package/dist/agents/replay.js +47 -0
- package/dist/agents/replay.js.map +1 -0
- package/dist/agents/report.d.ts +30 -0
- package/dist/agents/report.js +93 -0
- package/dist/agents/report.js.map +1 -0
- package/dist/agents/types.d.ts +148 -0
- package/dist/agents/types.js +37 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/verifier.d.ts +33 -0
- package/dist/agents/verifier.js +276 -0
- package/dist/agents/verifier.js.map +1 -0
- package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
- package/dist/ai-security/__tests__/bench.test.js +50 -0
- package/dist/ai-security/__tests__/bench.test.js.map +1 -0
- package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
- package/dist/ai-security/__tests__/checks.test.js +248 -0
- package/dist/ai-security/__tests__/checks.test.js.map +1 -0
- package/dist/ai-security/__tests__/config.test.d.ts +1 -0
- package/dist/ai-security/__tests__/config.test.js +164 -0
- package/dist/ai-security/__tests__/config.test.js.map +1 -0
- package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
- package/dist/ai-security/__tests__/detection.test.js +114 -0
- package/dist/ai-security/__tests__/detection.test.js.map +1 -0
- package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
- package/dist/ai-security/__tests__/fixtures.js +30 -0
- package/dist/ai-security/__tests__/fixtures.js.map +1 -0
- package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
- package/dist/ai-security/__tests__/hooks.test.js +174 -0
- package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
- package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
- package/dist/ai-security/__tests__/stream.test.js +85 -0
- package/dist/ai-security/__tests__/stream.test.js.map +1 -0
- package/dist/ai-security/config.d.ts +94 -0
- package/dist/ai-security/config.js +241 -0
- package/dist/ai-security/config.js.map +1 -0
- package/dist/ai-security/context.d.ts +45 -0
- package/dist/ai-security/context.js +108 -0
- package/dist/ai-security/context.js.map +1 -0
- package/dist/ai-security/custom-kinds.d.ts +23 -0
- package/dist/ai-security/custom-kinds.js +97 -0
- package/dist/ai-security/custom-kinds.js.map +1 -0
- package/dist/ai-security/events.d.ts +77 -0
- package/dist/ai-security/events.js +153 -0
- package/dist/ai-security/events.js.map +1 -0
- package/dist/ai-security/hooks.d.ts +48 -0
- package/dist/ai-security/hooks.js +461 -0
- package/dist/ai-security/hooks.js.map +1 -0
- package/dist/ai-security/index.d.ts +209 -0
- package/dist/ai-security/index.js +587 -0
- package/dist/ai-security/index.js.map +1 -0
- package/dist/ai-security/injection-rules.json +1024 -0
- package/dist/ai-security/injection.d.ts +46 -0
- package/dist/ai-security/injection.js +635 -0
- package/dist/ai-security/injection.js.map +1 -0
- package/dist/ai-security/jailbreak.d.ts +38 -0
- package/dist/ai-security/jailbreak.js +73 -0
- package/dist/ai-security/jailbreak.js.map +1 -0
- package/dist/ai-security/limits.d.ts +84 -0
- package/dist/ai-security/limits.js +195 -0
- package/dist/ai-security/limits.js.map +1 -0
- package/dist/ai-security/mcp.d.ts +82 -0
- package/dist/ai-security/mcp.js +150 -0
- package/dist/ai-security/mcp.js.map +1 -0
- package/dist/ai-security/output.d.ts +107 -0
- package/dist/ai-security/output.js +390 -0
- package/dist/ai-security/output.js.map +1 -0
- package/dist/ai-security/policy.d.ts +125 -0
- package/dist/ai-security/policy.js +196 -0
- package/dist/ai-security/policy.js.map +1 -0
- package/dist/ai-security/rag.d.ts +70 -0
- package/dist/ai-security/rag.js +174 -0
- package/dist/ai-security/rag.js.map +1 -0
- package/dist/ai-security/tool-rules.json +203 -0
- package/dist/ai-security/tools.d.ts +46 -0
- package/dist/ai-security/tools.js +62 -0
- package/dist/ai-security/tools.js.map +1 -0
- package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
- package/dist/budgets/__tests__/budgets.test.js +134 -0
- package/dist/budgets/__tests__/budgets.test.js.map +1 -0
- package/dist/budgets/auto.d.ts +25 -0
- package/dist/budgets/auto.js +63 -0
- package/dist/budgets/auto.js.map +1 -0
- package/dist/budgets/index.d.ts +110 -0
- package/dist/budgets/index.js +239 -0
- package/dist/budgets/index.js.map +1 -0
- package/dist/customer/__tests__/customer.test.d.ts +1 -0
- package/dist/customer/__tests__/customer.test.js +155 -0
- package/dist/customer/__tests__/customer.test.js.map +1 -0
- package/dist/customer/index.d.ts +48 -0
- package/dist/customer/index.js +132 -0
- package/dist/customer/index.js.map +1 -0
- package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
- package/dist/feedback/__tests__/feedback.test.js +80 -0
- package/dist/feedback/__tests__/feedback.test.js.map +1 -0
- package/dist/feedback/index.d.ts +48 -0
- package/dist/feedback/index.js +97 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/flags/__tests__/flags.test.d.ts +1 -0
- package/dist/flags/__tests__/flags.test.js +301 -0
- package/dist/flags/__tests__/flags.test.js.map +1 -0
- package/dist/flags/client.d.ts +131 -0
- package/dist/flags/client.js +301 -0
- package/dist/flags/client.js.map +1 -0
- package/dist/flags/engine.d.ts +200 -0
- package/dist/flags/engine.js +677 -0
- package/dist/flags/engine.js.map +1 -0
- package/dist/flags/index.d.ts +4 -0
- package/dist/flags/index.js +16 -0
- package/dist/flags/index.js.map +1 -0
- package/dist/guard/__tests__/findings.test.js +1 -1
- package/dist/guard/__tests__/report.test.js +67 -0
- package/dist/guard/__tests__/report.test.js.map +1 -1
- package/dist/guard/heartbeat.d.ts +34 -0
- package/dist/guard/heartbeat.js +83 -0
- package/dist/guard/heartbeat.js.map +1 -0
- package/dist/guard/integration.d.ts +9 -0
- package/dist/guard/integration.js +4 -2
- package/dist/guard/integration.js.map +1 -1
- package/dist/guard/report.d.ts +24 -1
- package/dist/guard/report.js +67 -18
- package/dist/guard/report.js.map +1 -1
- package/dist/index.d.ts +88 -0
- package/dist/index.js +193 -2
- package/dist/index.js.map +1 -1
- package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
- package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
- package/dist/instrumentation/anthropic/wrapper.js +4 -0
- package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
- package/dist/instrumentation/openai/wrapper.js +6 -0
- package/dist/instrumentation/openai/wrapper.js.map +1 -1
- package/dist/masking.d.ts +42 -0
- package/dist/masking.js +197 -0
- package/dist/masking.js.map +1 -0
- package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
- package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
- package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
- package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
- package/dist/otel/__tests__/app-logs.test.js +269 -0
- package/dist/otel/__tests__/app-logs.test.js.map +1 -0
- package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
- package/dist/otel/__tests__/log-auto.test.js +125 -0
- package/dist/otel/__tests__/log-auto.test.js.map +1 -0
- package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
- package/dist/otel/__tests__/log-bridges.test.js +170 -0
- package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
- package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
- package/dist/otel/__tests__/system-metrics.test.js +79 -0
- package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
- package/dist/otel/app-logs.d.ts +80 -0
- package/dist/otel/app-logs.js +195 -0
- package/dist/otel/app-logs.js.map +1 -0
- package/dist/otel/build-info.d.ts +2 -1
- package/dist/otel/build-info.js +3 -2
- package/dist/otel/build-info.js.map +1 -1
- package/dist/otel/events.d.ts +1 -0
- package/dist/otel/events.js +21 -12
- package/dist/otel/events.js.map +1 -1
- package/dist/otel/log-auto.d.ts +44 -0
- package/dist/otel/log-auto.js +200 -0
- package/dist/otel/log-auto.js.map +1 -0
- package/dist/otel/log-bridges.d.ts +54 -0
- package/dist/otel/log-bridges.js +307 -0
- package/dist/otel/log-bridges.js.map +1 -0
- package/dist/otel/system-metrics.d.ts +39 -0
- package/dist/otel/system-metrics.js +166 -0
- package/dist/otel/system-metrics.js.map +1 -0
- package/dist/otel/tracing.js +5 -1
- package/dist/otel/tracing.js.map +1 -1
- package/dist/protect/__tests__/protect.test.js +4 -0
- package/dist/protect/__tests__/protect.test.js.map +1 -1
- package/dist/protect/index.js +9 -4
- package/dist/protect/index.js.map +1 -1
- package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
- package/dist/rasp/__tests__/auto-http.test.js +136 -0
- package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
- package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
- package/dist/rasp/__tests__/baseline.test.js +86 -0
- package/dist/rasp/__tests__/baseline.test.js.map +1 -0
- package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
- package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
- package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
- package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
- package/dist/rasp/__tests__/capture-context.test.js +135 -0
- package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
- package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/code-hook.test.js +218 -0
- package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
- package/dist/rasp/__tests__/config-client.test.js +283 -0
- package/dist/rasp/__tests__/config-client.test.js.map +1 -0
- package/dist/rasp/__tests__/corpus.d.ts +13 -0
- package/dist/rasp/__tests__/corpus.js +111 -0
- package/dist/rasp/__tests__/corpus.js.map +1 -0
- package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
- package/dist/rasp/__tests__/custom-rules.test.js +276 -0
- package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
- package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/db-hook.test.js +438 -0
- package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/deception.test.d.ts +1 -0
- package/dist/rasp/__tests__/deception.test.js +567 -0
- package/dist/rasp/__tests__/deception.test.js.map +1 -0
- package/dist/rasp/__tests__/detect.test.d.ts +1 -0
- package/dist/rasp/__tests__/detect.test.js +276 -0
- package/dist/rasp/__tests__/detect.test.js.map +1 -0
- package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
- package/dist/rasp/__tests__/esm-exports.test.js +20 -0
- package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
- package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/fs-hook.test.js +241 -0
- package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
- package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
- package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
- package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
- package/dist/rasp/__tests__/hook-kit.js +139 -0
- package/dist/rasp/__tests__/hook-kit.js.map +1 -0
- package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/http-hook.test.js +250 -0
- package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/iast.test.d.ts +1 -0
- package/dist/rasp/__tests__/iast.test.js +361 -0
- package/dist/rasp/__tests__/iast.test.js.map +1 -0
- package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/include-hook.test.js +122 -0
- package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
- package/dist/rasp/__tests__/middleware.test.js +302 -0
- package/dist/rasp/__tests__/middleware.test.js.map +1 -0
- package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/process-hook.test.js +238 -0
- package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
- package/dist/rasp/__tests__/reporter.test.js +114 -0
- package/dist/rasp/__tests__/reporter.test.js.map +1 -0
- package/dist/rasp/__tests__/route.test.d.ts +1 -0
- package/dist/rasp/__tests__/route.test.js +46 -0
- package/dist/rasp/__tests__/route.test.js.map +1 -0
- package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
- package/dist/rasp/__tests__/rule-expr.test.js +151 -0
- package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
- package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
- package/dist/rasp/__tests__/rule-phases.test.js +271 -0
- package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
- package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
- package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/targets.test.d.ts +1 -0
- package/dist/rasp/__tests__/targets.test.js +82 -0
- package/dist/rasp/__tests__/targets.test.js.map +1 -0
- package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/template-hook.test.js +254 -0
- package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/upload.test.d.ts +1 -0
- package/dist/rasp/__tests__/upload.test.js +81 -0
- package/dist/rasp/__tests__/upload.test.js.map +1 -0
- package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
- package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
- package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
- package/dist/rasp/auto-http.d.ts +6 -0
- package/dist/rasp/auto-http.js +194 -0
- package/dist/rasp/auto-http.js.map +1 -0
- package/dist/rasp/baseline.d.ts +35 -0
- package/dist/rasp/baseline.js +91 -0
- package/dist/rasp/baseline.js.map +1 -0
- package/dist/rasp/capture.d.ts +76 -0
- package/dist/rasp/capture.js +304 -0
- package/dist/rasp/capture.js.map +1 -0
- package/dist/rasp/config-client.d.ts +122 -0
- package/dist/rasp/config-client.js +337 -0
- package/dist/rasp/config-client.js.map +1 -0
- package/dist/rasp/context.d.ts +65 -0
- package/dist/rasp/context.js +68 -0
- package/dist/rasp/context.js.map +1 -0
- package/dist/rasp/custom-rules.d.ts +68 -0
- package/dist/rasp/custom-rules.js +222 -0
- package/dist/rasp/custom-rules.js.map +1 -0
- package/dist/rasp/data/default-rules.json +199 -0
- package/dist/rasp/data/default-sinks.json +4 -0
- package/dist/rasp/data/dnslog-domains.json +11 -0
- package/dist/rasp/deception.d.ts +70 -0
- package/dist/rasp/deception.js +220 -0
- package/dist/rasp/deception.js.map +1 -0
- package/dist/rasp/detect.d.ts +68 -0
- package/dist/rasp/detect.js +671 -0
- package/dist/rasp/detect.js.map +1 -0
- package/dist/rasp/engine.d.ts +107 -0
- package/dist/rasp/engine.js +330 -0
- package/dist/rasp/engine.js.map +1 -0
- package/dist/rasp/hooks/code.d.ts +20 -0
- package/dist/rasp/hooks/code.js +334 -0
- package/dist/rasp/hooks/code.js.map +1 -0
- package/dist/rasp/hooks/db.d.ts +48 -0
- package/dist/rasp/hooks/db.js +322 -0
- package/dist/rasp/hooks/db.js.map +1 -0
- package/dist/rasp/hooks/esm.d.ts +7 -0
- package/dist/rasp/hooks/esm.js +18 -0
- package/dist/rasp/hooks/esm.js.map +1 -0
- package/dist/rasp/hooks/fs.d.ts +3 -0
- package/dist/rasp/hooks/fs.js +206 -0
- package/dist/rasp/hooks/fs.js.map +1 -0
- package/dist/rasp/hooks/http.d.ts +4 -0
- package/dist/rasp/hooks/http.js +213 -0
- package/dist/rasp/hooks/http.js.map +1 -0
- package/dist/rasp/hooks/include.d.ts +9 -0
- package/dist/rasp/hooks/include.js +79 -0
- package/dist/rasp/hooks/include.js.map +1 -0
- package/dist/rasp/hooks/marks.d.ts +2 -0
- package/dist/rasp/hooks/marks.js +16 -0
- package/dist/rasp/hooks/marks.js.map +1 -0
- package/dist/rasp/hooks/process.d.ts +22 -0
- package/dist/rasp/hooks/process.js +191 -0
- package/dist/rasp/hooks/process.js.map +1 -0
- package/dist/rasp/hooks/sinks.d.ts +54 -0
- package/dist/rasp/hooks/sinks.js +329 -0
- package/dist/rasp/hooks/sinks.js.map +1 -0
- package/dist/rasp/hooks/template.d.ts +21 -0
- package/dist/rasp/hooks/template.js +152 -0
- package/dist/rasp/hooks/template.js.map +1 -0
- package/dist/rasp/iast-rules.d.ts +82 -0
- package/dist/rasp/iast-rules.js +240 -0
- package/dist/rasp/iast-rules.js.map +1 -0
- package/dist/rasp/iast-scope.d.ts +29 -0
- package/dist/rasp/iast-scope.js +54 -0
- package/dist/rasp/iast-scope.js.map +1 -0
- package/dist/rasp/iast.d.ts +81 -0
- package/dist/rasp/iast.js +272 -0
- package/dist/rasp/iast.js.map +1 -0
- package/dist/rasp/index.d.ts +52 -0
- package/dist/rasp/index.js +280 -0
- package/dist/rasp/index.js.map +1 -0
- package/dist/rasp/lexers.d.ts +32 -0
- package/dist/rasp/lexers.js +444 -0
- package/dist/rasp/lexers.js.map +1 -0
- package/dist/rasp/middleware.d.ts +155 -0
- package/dist/rasp/middleware.js +568 -0
- package/dist/rasp/middleware.js.map +1 -0
- package/dist/rasp/model-output.d.ts +14 -0
- package/dist/rasp/model-output.js +107 -0
- package/dist/rasp/model-output.js.map +1 -0
- package/dist/rasp/normalize.d.ts +23 -0
- package/dist/rasp/normalize.js +140 -0
- package/dist/rasp/normalize.js.map +1 -0
- package/dist/rasp/reporter.d.ts +60 -0
- package/dist/rasp/reporter.js +230 -0
- package/dist/rasp/reporter.js.map +1 -0
- package/dist/rasp/rule-expr.d.ts +236 -0
- package/dist/rasp/rule-expr.js +1253 -0
- package/dist/rasp/rule-expr.js.map +1 -0
- package/dist/rasp/template.d.ts +53 -0
- package/dist/rasp/template.js +336 -0
- package/dist/rasp/template.js.map +1 -0
- package/dist/rasp/types.d.ts +110 -0
- package/dist/rasp/types.js +51 -0
- package/dist/rasp/types.js.map +1 -0
- package/dist/rasp/vpatch.d.ts +55 -0
- package/dist/rasp/vpatch.js +120 -0
- package/dist/rasp/vpatch.js.map +1 -0
- package/dist/register.js +52 -11
- package/dist/register.js.map +1 -1
- package/dist/semantic-convention.d.ts +2 -0
- package/dist/semantic-convention.js +5 -0
- package/dist/semantic-convention.js.map +1 -1
- package/dist/types.d.ts +75 -1
- package/dist/zero-code.d.ts +8 -0
- package/dist/zero-code.js +38 -0
- package/dist/zero-code.js.map +1 -0
- package/package.json +18 -2
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* shield360/agents: verify the agents that call your API or MCP server.
|
|
4
|
+
*
|
|
5
|
+
* import { agentVerifier, AGENT_HEADER } from 'shield360/agents';
|
|
6
|
+
* const verifier = agentVerifier({ audience: 'api.example.com' });
|
|
7
|
+
* const result = await verifier.check(request);
|
|
8
|
+
*
|
|
9
|
+
* Kept apart from tracing: importing this subpath loads no OpenTelemetry code.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.assuranceRank = exports.PASSPORT_TYP = exports.DEFAULT_POLICY = exports.DEFAULT_ISSUERS = exports.ASSURANCE_LEVELS = exports.AGENT_HEADER = exports.MemoryReplayStore = exports.readPassport = exports.agentVerifier = void 0;
|
|
13
|
+
var verifier_1 = require("./verifier");
|
|
14
|
+
Object.defineProperty(exports, "agentVerifier", { enumerable: true, get: function () { return verifier_1.agentVerifier; } });
|
|
15
|
+
Object.defineProperty(exports, "readPassport", { enumerable: true, get: function () { return verifier_1.readPassport; } });
|
|
16
|
+
var replay_1 = require("./replay");
|
|
17
|
+
Object.defineProperty(exports, "MemoryReplayStore", { enumerable: true, get: function () { return replay_1.MemoryReplayStore; } });
|
|
18
|
+
var types_1 = require("./types");
|
|
19
|
+
Object.defineProperty(exports, "AGENT_HEADER", { enumerable: true, get: function () { return types_1.AGENT_HEADER; } });
|
|
20
|
+
Object.defineProperty(exports, "ASSURANCE_LEVELS", { enumerable: true, get: function () { return types_1.ASSURANCE_LEVELS; } });
|
|
21
|
+
Object.defineProperty(exports, "DEFAULT_ISSUERS", { enumerable: true, get: function () { return types_1.DEFAULT_ISSUERS; } });
|
|
22
|
+
Object.defineProperty(exports, "DEFAULT_POLICY", { enumerable: true, get: function () { return types_1.DEFAULT_POLICY; } });
|
|
23
|
+
Object.defineProperty(exports, "PASSPORT_TYP", { enumerable: true, get: function () { return types_1.PASSPORT_TYP; } });
|
|
24
|
+
Object.defineProperty(exports, "assuranceRank", { enumerable: true, get: function () { return types_1.assuranceRank; } });
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,uCAAyD;AAAhD,yGAAA,aAAa,OAAA;AAAE,wGAAA,YAAY,OAAA;AAEpC,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAE1B,iCAAuH;AAA9G,qGAAA,YAAY,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,qGAAA,YAAY,OAAA;AAAE,sGAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading an agent passport: the compact JWS, its claims, the issuer's keys and
|
|
3
|
+
* the audience. Pure functions plus the key cache; nothing here throws on
|
|
4
|
+
* hostile input.
|
|
5
|
+
*
|
|
6
|
+
* Must stay in sync with: sdk/python/src/shield360/agents/_passport.py
|
|
7
|
+
*/
|
|
8
|
+
import { KeyObject } from 'crypto';
|
|
9
|
+
import { AgentIdentity, AgentMandate, Assurance } from './types';
|
|
10
|
+
/** Longer than any real passport; anything bigger is refused unparsed. */
|
|
11
|
+
export declare const MAX_TOKEN_LENGTH = 8192;
|
|
12
|
+
export type PassportClaims = {
|
|
13
|
+
iss: string;
|
|
14
|
+
sub: string;
|
|
15
|
+
aud: string;
|
|
16
|
+
iat: number;
|
|
17
|
+
exp: number;
|
|
18
|
+
jti: string;
|
|
19
|
+
agent: AgentIdentity;
|
|
20
|
+
operator: {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
domain: string | null;
|
|
24
|
+
};
|
|
25
|
+
act?: {
|
|
26
|
+
sub: string;
|
|
27
|
+
domain: string | null;
|
|
28
|
+
assurance: Assurance;
|
|
29
|
+
mandate?: AgentMandate;
|
|
30
|
+
};
|
|
31
|
+
scope?: string;
|
|
32
|
+
decision?: {
|
|
33
|
+
id: string;
|
|
34
|
+
policyVersion: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type ParsedPassport = {
|
|
38
|
+
kid: string;
|
|
39
|
+
claims: PassportClaims;
|
|
40
|
+
signingInput: Buffer;
|
|
41
|
+
signature: Buffer;
|
|
42
|
+
};
|
|
43
|
+
export type ParseResult = {
|
|
44
|
+
ok: true;
|
|
45
|
+
passport: ParsedPassport;
|
|
46
|
+
} | {
|
|
47
|
+
ok: false;
|
|
48
|
+
reason: 'malformed' | 'unsupported_alg';
|
|
49
|
+
};
|
|
50
|
+
/** An act's assurance: absent means "named" (older passports); anything unknown counts as the weakest. */
|
|
51
|
+
export declare function assuranceOf(v: unknown): Assurance;
|
|
52
|
+
/** Step 1: three base64url parts, typ and alg, and claims of the right shape. */
|
|
53
|
+
export declare function parsePassport(token: string): ParseResult;
|
|
54
|
+
/** The scopes a passport presents: well-formed ones only, at most 32. */
|
|
55
|
+
export declare function scopesOf(scope: string | undefined): string[];
|
|
56
|
+
export declare function verifySignature(p: ParsedPassport, key: KeyObject): boolean;
|
|
57
|
+
/** An issuer base URL without its trailing slash. */
|
|
58
|
+
export declare function normaliseIssuer(iss: string): string;
|
|
59
|
+
type Audience = {
|
|
60
|
+
host: string;
|
|
61
|
+
origin?: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* What an audience names: a host name as is (lower case), or an origin and its
|
|
65
|
+
* host. `strict` refuses origins that are not https (passport audiences).
|
|
66
|
+
*/
|
|
67
|
+
export declare function parseAudience(value: string, strict: boolean): Audience | null;
|
|
68
|
+
/**
|
|
69
|
+
* Step 5: the passport's aud names one of the receiver's audiences. Hosts
|
|
70
|
+
* compare case-insensitively; a bare host on either side matches an origin
|
|
71
|
+
* with that host; two origins must be identical.
|
|
72
|
+
*/
|
|
73
|
+
export declare function audienceMatches(aud: string, audiences: string[]): boolean;
|
|
74
|
+
/** Fetches with a timeout; resolves to undefined on any failure. */
|
|
75
|
+
export declare function fetchJson(fetchImpl: typeof fetch, url: string, init: RequestInit): Promise<{
|
|
76
|
+
status: number;
|
|
77
|
+
body: unknown;
|
|
78
|
+
} | undefined>;
|
|
79
|
+
/**
|
|
80
|
+
* The issuers' public keys: cached for an hour; an unknown kid refetches at
|
|
81
|
+
* most once a minute per issuer. A stale key is still used when a refetch fails
|
|
82
|
+
* (published keys stay published after rotation).
|
|
83
|
+
*/
|
|
84
|
+
export declare class KeyCache {
|
|
85
|
+
private readonly fetchImpl;
|
|
86
|
+
private readonly now;
|
|
87
|
+
private readonly issuers;
|
|
88
|
+
constructor(fetchImpl: () => typeof fetch, now: () => number);
|
|
89
|
+
get(issuer: string, kid: string): Promise<KeyObject | undefined>;
|
|
90
|
+
private refresh;
|
|
91
|
+
}
|
|
92
|
+
export {};
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reading an agent passport: the compact JWS, its claims, the issuer's keys and
|
|
4
|
+
* the audience. Pure functions plus the key cache; nothing here throws on
|
|
5
|
+
* hostile input.
|
|
6
|
+
*
|
|
7
|
+
* Must stay in sync with: sdk/python/src/shield360/agents/_passport.py
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.KeyCache = exports.MAX_TOKEN_LENGTH = void 0;
|
|
11
|
+
exports.assuranceOf = assuranceOf;
|
|
12
|
+
exports.parsePassport = parsePassport;
|
|
13
|
+
exports.scopesOf = scopesOf;
|
|
14
|
+
exports.verifySignature = verifySignature;
|
|
15
|
+
exports.normaliseIssuer = normaliseIssuer;
|
|
16
|
+
exports.parseAudience = parseAudience;
|
|
17
|
+
exports.audienceMatches = audienceMatches;
|
|
18
|
+
exports.fetchJson = fetchJson;
|
|
19
|
+
const crypto_1 = require("crypto");
|
|
20
|
+
const types_1 = require("./types");
|
|
21
|
+
/** Longer than any real passport; anything bigger is refused unparsed. */
|
|
22
|
+
exports.MAX_TOKEN_LENGTH = 8192;
|
|
23
|
+
const B64URL = /^[A-Za-z0-9_-]+$/;
|
|
24
|
+
const SCOPE = /^[A-Za-z0-9_.:-]{1,64}$/;
|
|
25
|
+
const MAX_SCOPES = 32;
|
|
26
|
+
const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
27
|
+
const isText = (v, max = 1024) => typeof v === 'string' && v.length > 0 && v.length <= max;
|
|
28
|
+
const isOptionalText = (v, max = 1024) => v === undefined || v === null || (typeof v === 'string' && v.length <= max);
|
|
29
|
+
const optText = (v, max = 256) => (typeof v === 'string' && v && v.length <= max ? v : null);
|
|
30
|
+
/** An act's assurance: absent means "named" (older passports); anything unknown counts as the weakest. */
|
|
31
|
+
function assuranceOf(v) {
|
|
32
|
+
if (v === undefined || v === null)
|
|
33
|
+
return 'named';
|
|
34
|
+
return types_1.ASSURANCE_LEVELS.includes(v) ? v : 'unverified';
|
|
35
|
+
}
|
|
36
|
+
/** The agent claim: required id and name; the optional profile fields are passed through when well-typed. */
|
|
37
|
+
function agentOf(a) {
|
|
38
|
+
const out = { id: a.id, name: a.name };
|
|
39
|
+
if (typeof a.purpose === 'string' && a.purpose)
|
|
40
|
+
out.purpose = a.purpose;
|
|
41
|
+
if (a.status === 'enrolled' || a.status === 'not_enrolled')
|
|
42
|
+
out.status = a.status;
|
|
43
|
+
for (const k of ['environment', 'risk', 'reviewedAt', 'enrolledAt']) {
|
|
44
|
+
if (k in a && (a[k] === null || typeof a[k] === 'string'))
|
|
45
|
+
out[k] = optText(a[k], 128);
|
|
46
|
+
}
|
|
47
|
+
if (isObject(a.owner))
|
|
48
|
+
out.owner = { domain: optText(a.owner.domain) };
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
function actOf(act) {
|
|
52
|
+
const out = {
|
|
53
|
+
sub: act.sub,
|
|
54
|
+
domain: optText(act.domain),
|
|
55
|
+
assurance: assuranceOf(act.assurance),
|
|
56
|
+
};
|
|
57
|
+
const m = act.mandate;
|
|
58
|
+
if (isObject(m) && isText(m.id, 256) && isText(m.expiresAt, 64))
|
|
59
|
+
out.mandate = { id: m.id, expiresAt: m.expiresAt };
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function decodeJson(part) {
|
|
63
|
+
try {
|
|
64
|
+
return JSON.parse(Buffer.from(part, 'base64url').toString('utf8'));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Step 1: three base64url parts, typ and alg, and claims of the right shape. */
|
|
71
|
+
function parsePassport(token) {
|
|
72
|
+
const malformed = { ok: false, reason: 'malformed' };
|
|
73
|
+
if (typeof token !== 'string' || token.length > exports.MAX_TOKEN_LENGTH)
|
|
74
|
+
return malformed;
|
|
75
|
+
const parts = token.split('.');
|
|
76
|
+
if (parts.length !== 3 || !parts.every((p) => B64URL.test(p)))
|
|
77
|
+
return malformed;
|
|
78
|
+
const header = decodeJson(parts[0]);
|
|
79
|
+
if (!isObject(header))
|
|
80
|
+
return malformed;
|
|
81
|
+
if (typeof header.typ !== 'string' || header.typ.toLowerCase() !== types_1.PASSPORT_TYP)
|
|
82
|
+
return malformed;
|
|
83
|
+
// Extensions the verifier does not understand must not be ignored (RFC 7515 4.1.11).
|
|
84
|
+
if (header.crit !== undefined)
|
|
85
|
+
return malformed;
|
|
86
|
+
if (header.alg !== 'EdDSA')
|
|
87
|
+
return { ok: false, reason: 'unsupported_alg' };
|
|
88
|
+
if (!isText(header.kid, 256))
|
|
89
|
+
return malformed;
|
|
90
|
+
const c = decodeJson(parts[1]);
|
|
91
|
+
if (!isObject(c))
|
|
92
|
+
return malformed;
|
|
93
|
+
const agent = c.agent;
|
|
94
|
+
const operator = c.operator;
|
|
95
|
+
const act = c.act;
|
|
96
|
+
const decision = c.decision;
|
|
97
|
+
if (!isText(c.iss, 512) ||
|
|
98
|
+
!isText(c.sub, 512) ||
|
|
99
|
+
!isText(c.aud, 512) ||
|
|
100
|
+
!isText(c.jti, 256) ||
|
|
101
|
+
typeof c.iat !== 'number' ||
|
|
102
|
+
!Number.isFinite(c.iat) ||
|
|
103
|
+
typeof c.exp !== 'number' ||
|
|
104
|
+
!Number.isFinite(c.exp) ||
|
|
105
|
+
!isObject(agent) ||
|
|
106
|
+
!isText(agent.id, 256) ||
|
|
107
|
+
!isText(agent.name, 512) ||
|
|
108
|
+
!isOptionalText(agent.purpose, 2048) ||
|
|
109
|
+
!isObject(operator) ||
|
|
110
|
+
!isText(operator.id, 256) ||
|
|
111
|
+
!isText(operator.name, 512) ||
|
|
112
|
+
!isOptionalText(operator.domain, 256) ||
|
|
113
|
+
(act !== undefined && act !== null && (!isObject(act) || !isText(act.sub, 256) || !isOptionalText(act.domain, 256))) ||
|
|
114
|
+
(c.scope !== undefined && c.scope !== null && typeof c.scope !== 'string') ||
|
|
115
|
+
(decision !== undefined && decision !== null && !isObject(decision))) {
|
|
116
|
+
return malformed;
|
|
117
|
+
}
|
|
118
|
+
const signature = Buffer.from(parts[2], 'base64url');
|
|
119
|
+
if (signature.length !== 64)
|
|
120
|
+
return malformed;
|
|
121
|
+
const claims = {
|
|
122
|
+
iss: c.iss,
|
|
123
|
+
sub: c.sub,
|
|
124
|
+
aud: c.aud,
|
|
125
|
+
iat: c.iat,
|
|
126
|
+
exp: c.exp,
|
|
127
|
+
jti: c.jti,
|
|
128
|
+
agent: agentOf(agent),
|
|
129
|
+
operator: { id: operator.id, name: operator.name, domain: typeof operator.domain === 'string' && operator.domain ? operator.domain : null },
|
|
130
|
+
...(isObject(act) ? { act: actOf(act) } : {}),
|
|
131
|
+
...(typeof c.scope === 'string' ? { scope: c.scope } : {}),
|
|
132
|
+
...(isObject(decision) ? { decision: { id: String(decision.id ?? ''), policyVersion: String(decision.policyVersion ?? '') } } : {}),
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
ok: true,
|
|
136
|
+
passport: { kid: header.kid, claims, signingInput: Buffer.from(`${parts[0]}.${parts[1]}`, 'ascii'), signature },
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/** The scopes a passport presents: well-formed ones only, at most 32. */
|
|
140
|
+
function scopesOf(scope) {
|
|
141
|
+
if (!scope)
|
|
142
|
+
return [];
|
|
143
|
+
const out = [];
|
|
144
|
+
for (const s of scope.split(/\s+/)) {
|
|
145
|
+
if (SCOPE.test(s) && !out.includes(s))
|
|
146
|
+
out.push(s);
|
|
147
|
+
if (out.length >= MAX_SCOPES)
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
function verifySignature(p, key) {
|
|
153
|
+
try {
|
|
154
|
+
return (0, crypto_1.verify)(null, p.signingInput, key, p.signature);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** An issuer base URL without its trailing slash. */
|
|
161
|
+
function normaliseIssuer(iss) {
|
|
162
|
+
return iss.replace(/\/+$/, '');
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* What an audience names: a host name as is (lower case), or an origin and its
|
|
166
|
+
* host. `strict` refuses origins that are not https (passport audiences).
|
|
167
|
+
*/
|
|
168
|
+
function parseAudience(value, strict) {
|
|
169
|
+
if (typeof value !== 'string')
|
|
170
|
+
return null;
|
|
171
|
+
const v = value.trim().toLowerCase();
|
|
172
|
+
if (!v)
|
|
173
|
+
return null;
|
|
174
|
+
if (v.includes('://')) {
|
|
175
|
+
let url;
|
|
176
|
+
try {
|
|
177
|
+
url = new URL(v);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
if (url.protocol !== 'https:' && (strict || url.protocol !== 'http:'))
|
|
183
|
+
return null;
|
|
184
|
+
if (url.username || url.password || (url.pathname && url.pathname !== '/') || url.search || url.hash)
|
|
185
|
+
return null;
|
|
186
|
+
return url.host ? { host: url.host, origin: url.origin } : null;
|
|
187
|
+
}
|
|
188
|
+
return /^[a-z0-9.-]+(:\d{1,5})?$/.test(v) ? { host: v.replace(/\.$/, '') } : null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Step 5: the passport's aud names one of the receiver's audiences. Hosts
|
|
192
|
+
* compare case-insensitively; a bare host on either side matches an origin
|
|
193
|
+
* with that host; two origins must be identical.
|
|
194
|
+
*/
|
|
195
|
+
function audienceMatches(aud, audiences) {
|
|
196
|
+
const a = parseAudience(aud, true);
|
|
197
|
+
if (!a)
|
|
198
|
+
return false;
|
|
199
|
+
return audiences.some((value) => {
|
|
200
|
+
const b = parseAudience(value, false);
|
|
201
|
+
if (!b)
|
|
202
|
+
return false;
|
|
203
|
+
if (a.origin && b.origin)
|
|
204
|
+
return a.origin === b.origin;
|
|
205
|
+
return a.host === b.host;
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const HOUR_MS = 60 * 60 * 1000;
|
|
209
|
+
const MISS_REFETCH_MS = 60 * 1000;
|
|
210
|
+
const FETCH_TIMEOUT_MS = 5000;
|
|
211
|
+
/** Fetches with a timeout; resolves to undefined on any failure. */
|
|
212
|
+
async function fetchJson(fetchImpl, url, init) {
|
|
213
|
+
const controller = typeof AbortController === 'function' ? new AbortController() : undefined;
|
|
214
|
+
const timer = controller ? setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS) : undefined;
|
|
215
|
+
timer?.unref?.();
|
|
216
|
+
try {
|
|
217
|
+
const res = await fetchImpl(url, { ...init, signal: controller?.signal });
|
|
218
|
+
let body;
|
|
219
|
+
try {
|
|
220
|
+
body = await res.json();
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
body = undefined;
|
|
224
|
+
}
|
|
225
|
+
return { status: res.status, body };
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
if (timer)
|
|
232
|
+
clearTimeout(timer);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function keyFromJwk(jwk) {
|
|
236
|
+
if (!isObject(jwk) || jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519' || !isText(jwk.x, 128) || !isText(jwk.kid, 256))
|
|
237
|
+
return undefined;
|
|
238
|
+
if (jwk.d !== undefined)
|
|
239
|
+
return undefined; // never accept a private key as a verification key
|
|
240
|
+
try {
|
|
241
|
+
const key = (0, crypto_1.createPublicKey)({ key: { kty: 'OKP', crv: 'Ed25519', x: jwk.x }, format: 'jwk' });
|
|
242
|
+
return { kid: jwk.kid, key };
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* The issuers' public keys: cached for an hour; an unknown kid refetches at
|
|
250
|
+
* most once a minute per issuer. A stale key is still used when a refetch fails
|
|
251
|
+
* (published keys stay published after rotation).
|
|
252
|
+
*/
|
|
253
|
+
class KeyCache {
|
|
254
|
+
constructor(fetchImpl, now) {
|
|
255
|
+
this.fetchImpl = fetchImpl;
|
|
256
|
+
this.now = now;
|
|
257
|
+
this.issuers = new Map();
|
|
258
|
+
}
|
|
259
|
+
async get(issuer, kid) {
|
|
260
|
+
let entry = this.issuers.get(issuer);
|
|
261
|
+
if (!entry) {
|
|
262
|
+
entry = { keys: new Map(), fetchedAt: -Infinity, lastAttempt: -Infinity };
|
|
263
|
+
this.issuers.set(issuer, entry);
|
|
264
|
+
}
|
|
265
|
+
const now = this.now();
|
|
266
|
+
const known = entry.keys.get(kid);
|
|
267
|
+
if (known && now - entry.fetchedAt < HOUR_MS)
|
|
268
|
+
return known;
|
|
269
|
+
// An unknown kid (or a stale set) refetches at most once a minute per issuer.
|
|
270
|
+
if (!entry.inflight) {
|
|
271
|
+
if (now - entry.lastAttempt < MISS_REFETCH_MS)
|
|
272
|
+
return known;
|
|
273
|
+
entry.lastAttempt = now;
|
|
274
|
+
}
|
|
275
|
+
await this.refresh(issuer, kid, entry);
|
|
276
|
+
return entry.keys.get(kid) ?? known;
|
|
277
|
+
}
|
|
278
|
+
refresh(issuer, kid, entry) {
|
|
279
|
+
if (entry.inflight)
|
|
280
|
+
return entry.inflight;
|
|
281
|
+
entry.inflight = (async () => {
|
|
282
|
+
const got = await fetchJson(this.fetchImpl(), `${issuer}/api/agent-passports/keys?kid=${encodeURIComponent(kid)}`, {
|
|
283
|
+
method: 'GET',
|
|
284
|
+
headers: { Accept: 'application/json' },
|
|
285
|
+
});
|
|
286
|
+
if (!got || got.status !== 200 || !isObject(got.body) || !Array.isArray(got.body.keys))
|
|
287
|
+
return;
|
|
288
|
+
for (const jwk of got.body.keys.slice(0, 50)) {
|
|
289
|
+
const k = keyFromJwk(jwk);
|
|
290
|
+
if (k)
|
|
291
|
+
entry.keys.set(k.kid, k.key);
|
|
292
|
+
}
|
|
293
|
+
entry.fetchedAt = this.now();
|
|
294
|
+
})().finally(() => {
|
|
295
|
+
entry.inflight = undefined;
|
|
296
|
+
});
|
|
297
|
+
return entry.inflight;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
exports.KeyCache = KeyCache;
|
|
301
|
+
//# sourceMappingURL=passport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passport.js","sourceRoot":"","sources":["../../src/agents/passport.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAyCH,kCAGC;AAkCD,sCAgEC;AAGD,4BAQC;AAED,0CAMC;AAGD,0CAEC;AAQD,sCAgBC;AAOD,0CASC;AASD,8BAsBC;AA3OD,mCAA4E;AAC5E,mCAAiG;AAEjG,0EAA0E;AAC7D,QAAA,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAClC,MAAM,KAAK,GAAG,yBAAyB,CAAC;AACxC,MAAM,UAAU,GAAG,EAAE,CAAC;AAyBtB,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxH,MAAM,MAAM,GAAG,CAAC,CAAU,EAAE,GAAG,GAAG,IAAI,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;AACjH,MAAM,cAAc,GAAG,CAAC,CAAU,EAAE,GAAG,GAAG,IAAI,EAAW,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;AAExI,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,GAAG,GAAG,GAAG,EAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAErH,0GAA0G;AAC1G,SAAgB,WAAW,CAAC,CAAU;IACpC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IAClD,OAAQ,wBAAuC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAe,CAAC,CAAC,CAAC,YAAY,CAAC;AAChG,CAAC;AAED,6GAA6G;AAC7G,SAAS,OAAO,CAAC,CAA0B;IACzC,MAAM,GAAG,GAAkB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAY,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,CAAC;IAC1E,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IACxE,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc;QAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAClF,KAAK,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,CAAU,EAAE,CAAC;QAC7E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,GAAG,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IACvE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK,CAAC,GAA4B;IACzC,MAAM,GAAG,GAAuC;QAC9C,GAAG,EAAE,GAAG,CAAC,GAAa;QACtB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAC3B,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;KACtC,CAAC;IACF,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;IACtB,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;QAAE,GAAG,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;IACpH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,SAAS,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAW,CAAC;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,wBAAgB;QAAE,OAAO,SAAS,CAAC;IACnF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAEhF,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,oBAAY;QAAE,OAAO,SAAS,CAAC;IAClG,qFAAqF;IACrF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;IAClB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC5B,IACE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACnB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACnB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACnB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACnB,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACzB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;QACvB,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACzB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;QACvB,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;QACtB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC;QACxB,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;QACpC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACnB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;QACzB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;QAC3B,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;QACrC,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;QAC1E,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EACpE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAE9C,MAAM,MAAM,GAAmB;QAC7B,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;QACrB,QAAQ,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAc,EAAE,MAAM,EAAE,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE;QAC/J,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpI,CAAC;IACF,OAAO;QACL,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE;KAChH,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAgB,QAAQ,CAAC,KAAyB;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,GAAG,CAAC,MAAM,IAAI,UAAU;YAAE,MAAM;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,eAAe,CAAC,CAAiB,EAAE,GAAc;IAC/D,IAAI,CAAC;QACH,OAAO,IAAA,eAAY,EAAC,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,SAAgB,eAAe,CAAC,GAAW;IACzC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAID;;;GAGG;AACH,SAAgB,aAAa,CAAC,KAAa,EAAE,MAAe;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QACnF,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAClH,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IACD,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpF,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,GAAW,EAAE,SAAmB;IAC9D,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACrB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC;QACvD,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/B,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;AAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAI9B,oEAAoE;AAC7D,KAAK,UAAU,SAAS,CAC7B,SAAuB,EACvB,GAAW,EACX,IAAiB;IAEjB,MAAM,UAAU,GAAG,OAAO,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,KAA4C,EAAE,KAAK,EAAE,EAAE,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACnI,IAAI,GAAG,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,CAAC,mDAAmD;IAC9F,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,wBAAe,EAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9F,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAa,QAAQ;IAGnB,YACmB,SAA6B,EAC7B,GAAiB;QADjB,cAAS,GAAT,SAAS,CAAoB;QAC7B,QAAG,GAAH,GAAG,CAAc;QAJnB,YAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAKtD,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,GAAW;QACnC,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC1E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3D,8EAA8E;QAC9E,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,eAAe;gBAAE,OAAO,KAAK,CAAC;YAC5D,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;IACtC,CAAC;IAEO,OAAO,CAAC,MAAc,EAAE,GAAW,EAAE,KAAiB;QAC5D,IAAI,KAAK,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;QAC1C,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,MAAM,iCAAiC,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;gBACjH,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;aACxC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC/F,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC7C,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC;YACD,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;CACF;AA5CD,4BA4CC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The receiver's policy: defaults, the console policy (GET
|
|
3
|
+
* /api/inbound-agents/policy, cached 60 s) and the local policy, in that order
|
|
4
|
+
* of precedence from lowest to highest. A failed fetch keeps the last good
|
|
5
|
+
* console policy, or the defaults when there never was one.
|
|
6
|
+
*/
|
|
7
|
+
import { AgentPolicy, Shield360Connection } from './types';
|
|
8
|
+
/** The well-typed fields of a policy-like value; unknown or ill-typed ones are dropped. */
|
|
9
|
+
export declare function sanitisePolicy(value: unknown): Partial<AgentPolicy>;
|
|
10
|
+
export declare function baseUrlOf(conn: Shield360Connection): string;
|
|
11
|
+
export declare class PolicySource {
|
|
12
|
+
private readonly from;
|
|
13
|
+
private readonly fetchImpl;
|
|
14
|
+
private readonly now;
|
|
15
|
+
private readonly local;
|
|
16
|
+
private remote;
|
|
17
|
+
private fetchedAt;
|
|
18
|
+
private inflight;
|
|
19
|
+
constructor(local: Partial<AgentPolicy> | undefined, from: Shield360Connection | undefined, fetchImpl: () => typeof fetch, now: () => number);
|
|
20
|
+
/** The policy in force now. The first call with policyFrom waits for the console policy. */
|
|
21
|
+
current(): Promise<AgentPolicy>;
|
|
22
|
+
private merged;
|
|
23
|
+
private refresh;
|
|
24
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The receiver's policy: defaults, the console policy (GET
|
|
4
|
+
* /api/inbound-agents/policy, cached 60 s) and the local policy, in that order
|
|
5
|
+
* of precedence from lowest to highest. A failed fetch keeps the last good
|
|
6
|
+
* console policy, or the defaults when there never was one.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PolicySource = void 0;
|
|
10
|
+
exports.sanitisePolicy = sanitisePolicy;
|
|
11
|
+
exports.baseUrlOf = baseUrlOf;
|
|
12
|
+
const passport_1 = require("./passport");
|
|
13
|
+
const types_1 = require("./types");
|
|
14
|
+
const CACHE_MS = 60 * 1000;
|
|
15
|
+
const MAX_OPERATORS = 1000;
|
|
16
|
+
const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
17
|
+
/** The well-typed fields of a policy-like value; unknown or ill-typed ones are dropped. */
|
|
18
|
+
function sanitisePolicy(value) {
|
|
19
|
+
if (!isObject(value))
|
|
20
|
+
return {};
|
|
21
|
+
const out = {};
|
|
22
|
+
if (value.mode === 'observe' || value.mode === 'enforce')
|
|
23
|
+
out.mode = value.mode;
|
|
24
|
+
if (typeof value.requireAgent === 'boolean')
|
|
25
|
+
out.requireAgent = value.requireAgent;
|
|
26
|
+
if (typeof value.requireOnBehalfOf === 'boolean')
|
|
27
|
+
out.requireOnBehalfOf = value.requireOnBehalfOf;
|
|
28
|
+
if (typeof value.online === 'boolean')
|
|
29
|
+
out.online = value.online;
|
|
30
|
+
if (value.minAssurance === 'none' || types_1.ASSURANCE_LEVELS.includes(value.minAssurance)) {
|
|
31
|
+
out.minAssurance = value.minAssurance;
|
|
32
|
+
}
|
|
33
|
+
if (Array.isArray(value.operators)) {
|
|
34
|
+
out.operators = value.operators
|
|
35
|
+
.filter((o) => typeof o === 'string' && o.trim().length > 0 && o.length <= 256)
|
|
36
|
+
.map((o) => o.trim())
|
|
37
|
+
.slice(0, MAX_OPERATORS);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
function baseUrlOf(conn) {
|
|
42
|
+
const env = typeof process !== 'undefined' ? process.env?.SHIELD360_URL : undefined;
|
|
43
|
+
return (conn.baseUrl || env || types_1.DEFAULT_BASE_URL).replace(/\/+$/, '');
|
|
44
|
+
}
|
|
45
|
+
class PolicySource {
|
|
46
|
+
constructor(local, from, fetchImpl, now) {
|
|
47
|
+
this.from = from;
|
|
48
|
+
this.fetchImpl = fetchImpl;
|
|
49
|
+
this.now = now;
|
|
50
|
+
this.fetchedAt = -Infinity;
|
|
51
|
+
this.local = sanitisePolicy(local);
|
|
52
|
+
}
|
|
53
|
+
/** The policy in force now. The first call with policyFrom waits for the console policy. */
|
|
54
|
+
async current() {
|
|
55
|
+
if (this.from?.apiKey && this.now() - this.fetchedAt >= CACHE_MS) {
|
|
56
|
+
const refresh = this.refresh();
|
|
57
|
+
// After the first answer, a stale policy is served while it refreshes.
|
|
58
|
+
if (this.remote === undefined)
|
|
59
|
+
await refresh;
|
|
60
|
+
}
|
|
61
|
+
return this.merged();
|
|
62
|
+
}
|
|
63
|
+
merged() {
|
|
64
|
+
const p = { ...types_1.DEFAULT_POLICY, ...(this.remote ?? {}), ...this.local };
|
|
65
|
+
return { ...p, operators: [...p.operators] };
|
|
66
|
+
}
|
|
67
|
+
refresh() {
|
|
68
|
+
if (this.inflight)
|
|
69
|
+
return this.inflight;
|
|
70
|
+
const from = this.from;
|
|
71
|
+
this.inflight = (async () => {
|
|
72
|
+
const got = await (0, passport_1.fetchJson)(this.fetchImpl(), `${baseUrlOf(from)}/api/inbound-agents/policy`, {
|
|
73
|
+
method: 'GET',
|
|
74
|
+
headers: { Accept: 'application/json', Authorization: `Bearer ${from.apiKey}` },
|
|
75
|
+
});
|
|
76
|
+
// Failures also wait out the cache period, so a down console is not hammered.
|
|
77
|
+
this.fetchedAt = this.now();
|
|
78
|
+
if (!got || got.status !== 200 || !isObject(got.body)) {
|
|
79
|
+
console.warn(`Shield360 agents: could not load the inbound agents policy${got ? ` (HTTP ${got.status})` : ''}; using the last known policy`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const body = got.body;
|
|
83
|
+
this.remote = sanitisePolicy(isObject(body.policy) ? body.policy : body);
|
|
84
|
+
})()
|
|
85
|
+
.catch(() => undefined)
|
|
86
|
+
.finally(() => {
|
|
87
|
+
this.inflight = undefined;
|
|
88
|
+
});
|
|
89
|
+
return this.inflight;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.PolicySource = PolicySource;
|
|
93
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/agents/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The default replay store: passport ids remembered in memory until they
|
|
3
|
+
* expire, with a size cap. One per process; use a shared ReplayStore (Redis,
|
|
4
|
+
* a database) when a receiver runs on several instances.
|
|
5
|
+
*/
|
|
6
|
+
import { ReplayStore } from './types';
|
|
7
|
+
export type MemoryReplayStoreOptions = {
|
|
8
|
+
maxEntries?: number;
|
|
9
|
+
clock?: () => number;
|
|
10
|
+
};
|
|
11
|
+
export declare class MemoryReplayStore implements ReplayStore {
|
|
12
|
+
private readonly entries;
|
|
13
|
+
private readonly maxEntries;
|
|
14
|
+
private readonly clock;
|
|
15
|
+
constructor(options?: MemoryReplayStoreOptions);
|
|
16
|
+
seen(jti: string, expiresAtMs: number): Promise<boolean>;
|
|
17
|
+
get size(): number;
|
|
18
|
+
/** Drops expired ids; if still full, the oldest-inserted ones. */
|
|
19
|
+
private evict;
|
|
20
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The default replay store: passport ids remembered in memory until they
|
|
4
|
+
* expire, with a size cap. One per process; use a shared ReplayStore (Redis,
|
|
5
|
+
* a database) when a receiver runs on several instances.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.MemoryReplayStore = void 0;
|
|
9
|
+
class MemoryReplayStore {
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.entries = new Map();
|
|
12
|
+
this.maxEntries = Math.max(1, options.maxEntries ?? 100000);
|
|
13
|
+
this.clock = options.clock ?? Date.now;
|
|
14
|
+
}
|
|
15
|
+
async seen(jti, expiresAtMs) {
|
|
16
|
+
const now = this.clock();
|
|
17
|
+
const until = this.entries.get(jti);
|
|
18
|
+
if (until !== undefined && until > now)
|
|
19
|
+
return true;
|
|
20
|
+
if (until !== undefined)
|
|
21
|
+
this.entries.delete(jti);
|
|
22
|
+
if (this.entries.size >= this.maxEntries)
|
|
23
|
+
this.evict(now);
|
|
24
|
+
this.entries.set(jti, expiresAtMs);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
get size() {
|
|
28
|
+
return this.entries.size;
|
|
29
|
+
}
|
|
30
|
+
/** Drops expired ids; if still full, the oldest-inserted ones. */
|
|
31
|
+
evict(now) {
|
|
32
|
+
for (const [k, until] of this.entries)
|
|
33
|
+
if (until <= now)
|
|
34
|
+
this.entries.delete(k);
|
|
35
|
+
const over = this.entries.size - this.maxEntries + 1;
|
|
36
|
+
if (over <= 0)
|
|
37
|
+
return;
|
|
38
|
+
let n = 0;
|
|
39
|
+
for (const k of this.entries.keys()) {
|
|
40
|
+
if (n++ >= over)
|
|
41
|
+
break;
|
|
42
|
+
this.entries.delete(k);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.MemoryReplayStore = MemoryReplayStore;
|
|
47
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/agents/replay.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAMH,MAAa,iBAAiB;IAK5B,YAAY,UAAoC,EAAE;QAJjC,YAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAKnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,IAAI,MAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,WAAmB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,GAAG;YAAE,OAAO,IAAI,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,kEAAkE;IAC1D,KAAK,CAAC,GAAW;QACvB,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,KAAK,IAAI,GAAG;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACrD,IAAI,IAAI,IAAI,CAAC;YAAE,OAAO;QACtB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,EAAE,IAAI,IAAI;gBAAE,MAAM;YACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAnCD,8CAmCC"}
|