@cdxgen/cdxgen 0.0.1 → 13.0.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 +921 -87
- package/bin/audit.js +239 -0
- package/bin/cdxgen.js +2324 -0
- package/bin/convert.js +213 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +495 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +295 -0
- package/bin/validate.js +268 -0
- package/bin/verify.js +189 -0
- package/data/README.md +307 -0
- package/data/bom-1.4.schema.json +1605 -0
- package/data/bom-1.5.schema.json +3660 -0
- package/data/bom-1.6.schema.json +5511 -0
- package/data/bom-1.7.schema.json +6700 -0
- package/data/cbomosdb-queries.json +68 -0
- package/data/component-tags.json +339 -0
- package/data/container-knowledge-index.json +125 -0
- package/data/cosdb-queries.json +17 -0
- package/data/crypto-oid.json +1998 -0
- package/data/cryptography-defs.json +3793 -0
- package/data/cryptography-defs.schema.json +576 -0
- package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
- package/data/frameworks-list.json +219 -0
- package/data/glibc-stdlib.json +117 -0
- package/data/gtfobins-index.json +6296 -0
- package/data/helpers/init.gradle +71 -0
- package/data/jsf-0.82.schema.json +211 -0
- package/data/known-licenses.json +82 -0
- package/data/lic-mapping.json +338 -0
- package/data/license-aliases.json +6624 -0
- package/data/license-db.json +39059 -0
- package/data/license-deprecations.json +302 -0
- package/data/lolbas-index.json +150 -0
- package/data/predictive-audit-allowlist.json +11 -0
- package/data/pypi-pkg-aliases.json +1199 -0
- package/data/python-stdlib.json +308 -0
- package/data/queries-darwin.json +193 -0
- package/data/queries-win.json +257 -0
- package/data/queries.json +268 -0
- package/data/ruby-known-modules.json +281 -0
- package/data/rules/ai-agent-governance.yaml +323 -0
- package/data/rules/ai-bom.yaml +268 -0
- package/data/rules/ai-oversight.yaml +186 -0
- package/data/rules/ai-provenance.yaml +92 -0
- package/data/rules/asar-archives.yaml +150 -0
- package/data/rules/cbom-security.yaml +165 -0
- package/data/rules/chrome-extensions.yaml +248 -0
- package/data/rules/ci-permissions.yaml +802 -0
- package/data/rules/container-risk.yaml +353 -0
- package/data/rules/dependency-sources.yaml +236 -0
- package/data/rules/golem-go.yaml +229 -0
- package/data/rules/hbom-compliance.yaml +325 -0
- package/data/rules/hbom-performance.yaml +307 -0
- package/data/rules/hbom-security.yaml +248 -0
- package/data/rules/host-topology.yaml +165 -0
- package/data/rules/mcp-servers.yaml +388 -0
- package/data/rules/obom-runtime.yaml +1776 -0
- package/data/rules/package-integrity.yaml +364 -0
- package/data/rules/rootfs-hardening.yaml +179 -0
- package/data/rules/vscode-extensions.yaml +237 -0
- package/data/spdx-export.schema.json +6794 -0
- package/data/spdx-license-list.json +7449 -0
- package/data/spdx-licenses.json +759 -0
- package/data/spdx.schema.json +819 -0
- package/data/templates/README.md +3 -0
- package/data/templates/asvs-4.0.3.cdx.json +2943 -0
- package/data/templates/asvs-5.0.cdx.json +3046 -0
- package/data/templates/bsimm-v13.cdx.json +1008 -0
- package/data/templates/masvs-2.0.0.cdx.json +225 -0
- package/data/templates/nist-ssdf-1.1.cdx.json +828 -0
- package/data/templates/pcissc-secure-slc-1.1.cdx.json +1027 -0
- package/data/templates/scvs-1.0.0.cdx.json +813 -0
- package/data/templates/ssaf-DRAFT-2023-11.cdx.json +127 -0
- package/data/vendor-alias.json +41967 -0
- package/data/wrapdb-releases.json +4227 -0
- package/index.cjs +15 -0
- package/lib/audit/index.js +2800 -0
- package/lib/audit/progress.js +114 -0
- package/lib/audit/reporters.js +937 -0
- package/lib/audit/scoring.js +560 -0
- package/lib/audit/targets.js +798 -0
- package/lib/cli/bomAssembly.js +1833 -0
- package/lib/cli/cliOptions.js +513 -0
- package/lib/cli/index.js +2759 -0
- package/lib/cli/jsBom.js +2087 -0
- package/lib/cli/jvmBom.js +1858 -0
- package/lib/cli/managedBom.js +2083 -0
- package/lib/cli/nativeBom.js +2125 -0
- package/lib/core/activity.js +1087 -0
- package/lib/core/env.js +719 -0
- package/lib/core/fs.js +1058 -0
- package/lib/core/httpClient.js +730 -0
- package/lib/core/logger.js +142 -0
- package/lib/core/parallel.js +323 -0
- package/lib/core/paths.js +70 -0
- package/lib/core/projectConfig.js +122 -0
- package/lib/core/propertySanitizer.js +174 -0
- package/lib/core/spdx.js +5 -0
- package/lib/core/state.js +59 -0
- package/lib/core/text.js +207 -0
- package/lib/core/ui.js +876 -0
- package/lib/core/urls.js +84 -0
- package/lib/ecosystems/asarutils.js +1636 -0
- package/lib/ecosystems/bunutils.js +402 -0
- package/lib/ecosystems/caxa.js +77 -0
- package/lib/ecosystems/chromextutils.js +1174 -0
- package/lib/ecosystems/cmakeResolver.js +587 -0
- package/lib/ecosystems/cppEvidence.js +305 -0
- package/lib/ecosystems/denoutils.js +1094 -0
- package/lib/ecosystems/dotnetutils.js +132 -0
- package/lib/ecosystems/ecosystems.js +2772 -0
- package/lib/ecosystems/golem.js +1807 -0
- package/lib/ecosystems/gradleutils.js +1048 -0
- package/lib/ecosystems/jsEvidence.js +317 -0
- package/lib/ecosystems/npmutils.js +586 -0
- package/lib/ecosystems/parsers-bazel.js +875 -0
- package/lib/ecosystems/parsers-dotnet.js +1430 -0
- package/lib/ecosystems/parsers-gleam.js +302 -0
- package/lib/ecosystems/parsers-go.js +818 -0
- package/lib/ecosystems/parsers-js.js +4222 -0
- package/lib/ecosystems/parsers-jvm.js +948 -0
- package/lib/ecosystems/parsers-misc.js +3191 -0
- package/lib/ecosystems/parsers-python.js +2070 -0
- package/lib/ecosystems/parsers-rust.js +1294 -0
- package/lib/ecosystems/parsers-zig.js +861 -0
- package/lib/ecosystems/pep770.js +341 -0
- package/lib/ecosystems/pylockutils.js +427 -0
- package/lib/ecosystems/pythonutils.js +1281 -0
- package/lib/ecosystems/registryProvenance.js +1003 -0
- package/lib/ecosystems/remote/huggingface.js +1343 -0
- package/lib/ecosystems/rubyutils.js +1629 -0
- package/lib/ecosystems/rusi.js +820 -0
- package/lib/ecosystems/sbtutils.js +972 -0
- package/lib/ecosystems/tea.js +607 -0
- package/lib/ecosystems/utils.js +575 -0
- package/lib/ecosystems/zigResolver.js +410 -0
- package/lib/evinser/db.js +145 -0
- package/lib/evinser/evinser.js +2362 -0
- package/lib/evinser/scalasem.js +65 -0
- package/lib/evinser/swiftsem.js +767 -0
- package/lib/helpers/annotationFormatter.js +84 -0
- package/lib/helpers/bomSigner.js +312 -0
- package/lib/helpers/exportUtils.js +160 -0
- package/lib/helpers/remote/dependency-track.js +117 -0
- package/lib/helpers/versutils.js +202 -0
- package/lib/helpers/vsixutils.js +1069 -0
- package/lib/inventory/agentFormulationParser.js +322 -0
- package/lib/inventory/aiCollector.js +2140 -0
- package/lib/inventory/aiInventory.js +414 -0
- package/lib/inventory/aiModelVariants.js +121 -0
- package/lib/inventory/aiOversightCollector.js +661 -0
- package/lib/inventory/aiProvenanceCollector.js +822 -0
- package/lib/inventory/analyzer.js +6089 -0
- package/lib/inventory/analyzerScope.js +807 -0
- package/lib/inventory/astWorker.js +20 -0
- package/lib/inventory/atomUtils.js +1092 -0
- package/lib/inventory/auditCategories.js +192 -0
- package/lib/inventory/bomUtils.js +369 -0
- package/lib/inventory/cacheCommands.js +182 -0
- package/lib/inventory/cacheDir.js +104 -0
- package/lib/inventory/cbomutils.js +590 -0
- package/lib/inventory/cdxrs.js +434 -0
- package/lib/inventory/ciParsers/azurePipelines.js +295 -0
- package/lib/inventory/ciParsers/circleCi.js +286 -0
- package/lib/inventory/ciParsers/common.js +24 -0
- package/lib/inventory/ciParsers/githubActions.js +2434 -0
- package/lib/inventory/ciParsers/gitlabCi.js +213 -0
- package/lib/inventory/ciParsers/jenkins.js +180 -0
- package/lib/inventory/citations.js +234 -0
- package/lib/inventory/communityAiConfigParser.js +756 -0
- package/lib/inventory/containerRisk.js +204 -0
- package/lib/inventory/cryptoAlgorithmFamily.js +258 -0
- package/lib/inventory/deps.js +807 -0
- package/lib/inventory/depsUtils.js +588 -0
- package/lib/inventory/display.js +2128 -0
- package/lib/inventory/dosai.js +601 -0
- package/lib/inventory/dosaiParsers.js +154 -0
- package/lib/inventory/dynamic.js +145 -0
- package/lib/inventory/envcontext.js +1789 -0
- package/lib/inventory/evidenceUtils.js +774 -0
- package/lib/inventory/fetchBatch.js +779 -0
- package/lib/inventory/fetchRate.js +255 -0
- package/lib/inventory/forgeEnricher.js +300 -0
- package/lib/inventory/formulationParsers.js +422 -0
- package/lib/inventory/gtfobins.js +339 -0
- package/lib/inventory/hbom.js +719 -0
- package/lib/inventory/hbomAnalysis.js +310 -0
- package/lib/inventory/hbomLoader.js +35 -0
- package/lib/inventory/hostTopology.js +835 -0
- package/lib/inventory/inventoryStats.js +100 -0
- package/lib/inventory/jsonLike.js +121 -0
- package/lib/inventory/licenseEnhancer.js +918 -0
- package/lib/inventory/lolbas.js +285 -0
- package/lib/inventory/mcp.js +253 -0
- package/lib/inventory/mcpConfigParser.js +683 -0
- package/lib/inventory/mcpDiscovery.js +112 -0
- package/lib/inventory/mcpPinning.js +209 -0
- package/lib/inventory/osPackageResolver.js +493 -0
- package/lib/inventory/osinfo.js +277 -0
- package/lib/inventory/osqueryTransform.js +274 -0
- package/lib/inventory/plugins.js +466 -0
- package/lib/inventory/protobom.js +231 -0
- package/lib/inventory/protobomLoader.js +43 -0
- package/lib/inventory/provenanceUtils.js +224 -0
- package/lib/inventory/purl.js +749 -0
- package/lib/inventory/rustFormulationParser.js +339 -0
- package/lib/inventory/sbomDocument.js +340 -0
- package/lib/inventory/source.js +1488 -0
- package/lib/inventory/spdx.js +361 -0
- package/lib/inventory/spdxExpression.js +512 -0
- package/lib/inventory/spdxUtils.js +107 -0
- package/lib/inventory/table.js +263 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3307 -0
- package/lib/managers/containerutils.js +125 -0
- package/lib/managers/docker.js +2145 -0
- package/lib/managers/dockerConnection.js +162 -0
- package/lib/managers/oci.js +704 -0
- package/lib/managers/piptree.js +267 -0
- package/lib/parsers/cmakeCache.js +199 -0
- package/lib/parsers/gguf.js +492 -0
- package/lib/parsers/gitAiNotes.js +233 -0
- package/lib/parsers/gitmodules.js +239 -0
- package/lib/parsers/htmlExtract.js +610 -0
- package/lib/parsers/huggingfaceManifest.js +551 -0
- package/lib/parsers/huggingfaceUtils.js +506 -0
- package/lib/parsers/iri.js +618 -0
- package/lib/parsers/npmrc.js +99 -0
- package/lib/parsers/ollama.js +101 -0
- package/lib/parsers/xml.js +841 -0
- package/lib/server/openapi.yaml +433 -0
- package/lib/server/server.js +616 -0
- package/lib/stages/postgen/annotator.js +977 -0
- package/lib/stages/postgen/auditBom.js +468 -0
- package/lib/stages/postgen/postgen.js +1239 -0
- package/lib/stages/postgen/ruleEngine.js +731 -0
- package/lib/stages/postgen/sortBom.js +195 -0
- package/lib/stages/postgen/spdxConverter.js +796 -0
- package/lib/stages/postgen/specVersionCompat.js +703 -0
- package/lib/stages/pregen/envAudit.js +388 -0
- package/lib/stages/pregen/pregen.js +637 -0
- package/lib/third-party/README.md +9 -0
- package/lib/third-party/arborist/CHANGELOG.md +1109 -0
- package/lib/third-party/arborist/LICENSE.md +20 -0
- package/lib/third-party/arborist/README.md +315 -0
- package/lib/third-party/arborist/lib/arborist/index.js +258 -0
- package/lib/third-party/arborist/lib/arborist/load-actual.js +605 -0
- package/lib/third-party/arborist/lib/arborist/load-virtual.js +300 -0
- package/lib/third-party/arborist/lib/bin-links.js +120 -0
- package/lib/third-party/arborist/lib/calc-dep-flags.js +130 -0
- package/lib/third-party/arborist/lib/case-insensitive-map.js +51 -0
- package/lib/third-party/arborist/lib/consistent-resolve.js +42 -0
- package/lib/third-party/arborist/lib/debug.js +50 -0
- package/lib/third-party/arborist/lib/dep-valid.js +190 -0
- package/lib/third-party/arborist/lib/edge.js +417 -0
- package/lib/third-party/arborist/lib/from-path.js +36 -0
- package/lib/third-party/arborist/lib/gather-dep-set.js +43 -0
- package/lib/third-party/arborist/lib/index.js +22 -0
- package/lib/third-party/arborist/lib/inventory.js +138 -0
- package/lib/third-party/arborist/lib/link.js +169 -0
- package/lib/third-party/arborist/lib/node.js +1673 -0
- package/lib/third-party/arborist/lib/npm-extension.js +45 -0
- package/lib/third-party/arborist/lib/override-resolves.js +11 -0
- package/lib/third-party/arborist/lib/override-set.js +319 -0
- package/lib/third-party/arborist/lib/package-extensions.js +289 -0
- package/lib/third-party/arborist/lib/printable.js +210 -0
- package/lib/third-party/arborist/lib/proc-log.js +30 -0
- package/lib/third-party/arborist/lib/realpath.js +100 -0
- package/lib/third-party/arborist/lib/relpath.js +4 -0
- package/lib/third-party/arborist/lib/shrinkwrap.js +1291 -0
- package/lib/third-party/arborist/lib/spec-from-lock.js +34 -0
- package/lib/third-party/arborist/lib/tree-check.js +165 -0
- package/lib/third-party/arborist/lib/validate-npm-package-name.js +107 -0
- package/lib/third-party/arborist/lib/version-from-tgz.js +51 -0
- package/lib/third-party/arborist/lib/yarn-lock.js +397 -0
- package/lib/validator/bomValidator.js +985 -0
- package/lib/validator/complianceEngine.js +241 -0
- package/lib/validator/complianceRules.js +1680 -0
- package/lib/validator/generated/runtime.mjs +17 -0
- package/lib/validator/generated/validate-1.6.mjs +21258 -0
- package/lib/validator/generated/validate-1.7.mjs +24803 -0
- package/lib/validator/generated/validate-2.0.mjs +22931 -0
- package/lib/validator/index.js +246 -0
- package/lib/validator/reporters/annotations.js +142 -0
- package/lib/validator/reporters/console.js +160 -0
- package/lib/validator/reporters/index.js +41 -0
- package/lib/validator/reporters/json.js +37 -0
- package/lib/validator/reporters/sarif.js +184 -0
- package/package.json +209 -26
- package/types/bin/audit.d.ts +3 -0
- package/types/bin/audit.d.ts.map +1 -0
- package/types/bin/cdxgen.d.ts +3 -0
- package/types/bin/cdxgen.d.ts.map +1 -0
- package/types/bin/convert.d.ts +3 -0
- package/types/bin/convert.d.ts.map +1 -0
- package/types/bin/evinse.d.ts +3 -0
- package/types/bin/evinse.d.ts.map +1 -0
- package/types/bin/hbom.d.ts +3 -0
- package/types/bin/hbom.d.ts.map +1 -0
- package/types/bin/repl.d.ts +3 -0
- package/types/bin/repl.d.ts.map +1 -0
- package/types/bin/sign.d.ts +3 -0
- package/types/bin/sign.d.ts.map +1 -0
- package/types/bin/tracebom.d.ts +3 -0
- package/types/bin/tracebom.d.ts.map +1 -0
- package/types/bin/validate.d.ts +14 -0
- package/types/bin/validate.d.ts.map +1 -0
- package/types/bin/verify.d.ts +3 -0
- package/types/bin/verify.d.ts.map +1 -0
- package/types/lib/audit/index.d.ts +153 -0
- package/types/lib/audit/index.d.ts.map +1 -0
- package/types/lib/audit/progress.d.ts +31 -0
- package/types/lib/audit/progress.d.ts.map +1 -0
- package/types/lib/audit/reporters.d.ts +62 -0
- package/types/lib/audit/reporters.d.ts.map +1 -0
- package/types/lib/audit/scoring.d.ts +36 -0
- package/types/lib/audit/scoring.d.ts.map +1 -0
- package/types/lib/audit/targets.d.ts +77 -0
- package/types/lib/audit/targets.d.ts.map +1 -0
- package/types/lib/cli/bomAssembly.d.ts +315 -0
- package/types/lib/cli/bomAssembly.d.ts.map +1 -0
- package/types/lib/cli/cliOptions.d.ts +156 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -0
- package/types/lib/cli/index.d.ts +107 -0
- package/types/lib/cli/index.d.ts.map +1 -0
- package/types/lib/cli/jsBom.d.ts +94 -0
- package/types/lib/cli/jsBom.d.ts.map +1 -0
- package/types/lib/cli/jvmBom.d.ts +54 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -0
- package/types/lib/cli/managedBom.d.ts +105 -0
- package/types/lib/cli/managedBom.d.ts.map +1 -0
- package/types/lib/cli/nativeBom.d.ts +143 -0
- package/types/lib/cli/nativeBom.d.ts.map +1 -0
- package/types/lib/core/activity.d.ts +178 -0
- package/types/lib/core/activity.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +192 -0
- package/types/lib/core/env.d.ts.map +1 -0
- package/types/lib/core/fs.d.ts +158 -0
- package/types/lib/core/fs.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +149 -0
- package/types/lib/core/httpClient.d.ts.map +1 -0
- package/types/lib/core/logger.d.ts +28 -0
- package/types/lib/core/logger.d.ts.map +1 -0
- package/types/lib/core/parallel.d.ts +95 -0
- package/types/lib/core/parallel.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +36 -0
- package/types/lib/core/paths.d.ts.map +1 -0
- package/types/lib/core/projectConfig.d.ts +23 -0
- package/types/lib/core/projectConfig.d.ts.map +1 -0
- package/types/lib/core/propertySanitizer.d.ts +23 -0
- package/types/lib/core/propertySanitizer.d.ts.map +1 -0
- package/types/lib/core/spdx.d.ts +5 -0
- package/types/lib/core/spdx.d.ts.map +1 -0
- package/types/lib/core/state.d.ts +20 -0
- package/types/lib/core/state.d.ts.map +1 -0
- package/types/lib/core/text.d.ts +78 -0
- package/types/lib/core/text.d.ts.map +1 -0
- package/types/lib/core/ui.d.ts +87 -0
- package/types/lib/core/ui.d.ts.map +1 -0
- package/types/lib/core/urls.d.ts +43 -0
- package/types/lib/core/urls.d.ts.map +1 -0
- package/types/lib/ecosystems/asarutils.d.ts +71 -0
- package/types/lib/ecosystems/asarutils.d.ts.map +1 -0
- package/types/lib/ecosystems/bunutils.d.ts +38 -0
- package/types/lib/ecosystems/bunutils.d.ts.map +1 -0
- package/types/lib/ecosystems/caxa.d.ts +8 -0
- package/types/lib/ecosystems/caxa.d.ts.map +1 -0
- package/types/lib/ecosystems/chromextutils.d.ts +97 -0
- package/types/lib/ecosystems/chromextutils.d.ts.map +1 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts +176 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +35 -0
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/denoutils.d.ts +76 -0
- package/types/lib/ecosystems/denoutils.d.ts.map +1 -0
- package/types/lib/ecosystems/dotnetutils.d.ts +45 -0
- package/types/lib/ecosystems/dotnetutils.d.ts.map +1 -0
- package/types/lib/ecosystems/ecosystems.d.ts +279 -0
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts +60 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -0
- package/types/lib/ecosystems/gradleutils.d.ts +139 -0
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -0
- package/types/lib/ecosystems/jsEvidence.d.ts +17 -0
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/npmutils.d.ts +183 -0
- package/types/lib/ecosystems/npmutils.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts +36 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts +116 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts +33 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-go.d.ts +92 -0
- package/types/lib/ecosystems/parsers-go.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-js.d.ts +242 -0
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts +100 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-misc.d.ts +450 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-python.d.ts +145 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-rust.d.ts +56 -0
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-zig.d.ts +83 -0
- package/types/lib/ecosystems/parsers-zig.d.ts.map +1 -0
- package/types/lib/ecosystems/pep770.d.ts +38 -0
- package/types/lib/ecosystems/pep770.d.ts.map +1 -0
- package/types/lib/ecosystems/pylockutils.d.ts +68 -0
- package/types/lib/ecosystems/pylockutils.d.ts.map +1 -0
- package/types/lib/ecosystems/pythonutils.d.ts +70 -0
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -0
- package/types/lib/ecosystems/registryProvenance.d.ts +26 -0
- package/types/lib/ecosystems/registryProvenance.d.ts.map +1 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts +31 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -0
- package/types/lib/ecosystems/rubyutils.d.ts +182 -0
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -0
- package/types/lib/ecosystems/rusi.d.ts +40 -0
- package/types/lib/ecosystems/rusi.d.ts.map +1 -0
- package/types/lib/ecosystems/sbtutils.d.ts +179 -0
- package/types/lib/ecosystems/sbtutils.d.ts.map +1 -0
- package/types/lib/ecosystems/tea.d.ts +180 -0
- package/types/lib/ecosystems/tea.d.ts.map +1 -0
- package/types/lib/ecosystems/utils.d.ts +41 -0
- package/types/lib/ecosystems/utils.d.ts.map +1 -0
- package/types/lib/ecosystems/zigResolver.d.ts +70 -0
- package/types/lib/ecosystems/zigResolver.d.ts.map +1 -0
- package/types/lib/evinser/db.d.ts +17 -0
- package/types/lib/evinser/db.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +354 -0
- package/types/lib/evinser/evinser.d.ts.map +1 -0
- package/types/lib/evinser/scalasem.d.ts +15 -0
- package/types/lib/evinser/scalasem.d.ts.map +1 -0
- package/types/lib/evinser/swiftsem.d.ts +103 -0
- package/types/lib/evinser/swiftsem.d.ts.map +1 -0
- package/types/lib/helpers/annotationFormatter.d.ts +23 -0
- package/types/lib/helpers/annotationFormatter.d.ts.map +1 -0
- package/types/lib/helpers/bomSigner.d.ts +28 -0
- package/types/lib/helpers/bomSigner.d.ts.map +1 -0
- package/types/lib/helpers/exportUtils.d.ts +52 -0
- package/types/lib/helpers/exportUtils.d.ts.map +1 -0
- package/types/lib/helpers/remote/dependency-track.d.ts +23 -0
- package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -0
- package/types/lib/helpers/versutils.d.ts +8 -0
- package/types/lib/helpers/versutils.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +130 -0
- package/types/lib/helpers/vsixutils.d.ts.map +1 -0
- package/types/lib/inventory/agentFormulationParser.d.ts +21 -0
- package/types/lib/inventory/agentFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts +61 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiInventory.d.ts +103 -0
- package/types/lib/inventory/aiInventory.d.ts.map +1 -0
- package/types/lib/inventory/aiModelVariants.d.ts +31 -0
- package/types/lib/inventory/aiModelVariants.d.ts.map +1 -0
- package/types/lib/inventory/aiOversightCollector.d.ts +28 -0
- package/types/lib/inventory/aiOversightCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts +13 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts.map +1 -0
- package/types/lib/inventory/analyzer.d.ts +157 -0
- package/types/lib/inventory/analyzer.d.ts.map +1 -0
- package/types/lib/inventory/analyzerScope.d.ts +106 -0
- package/types/lib/inventory/analyzerScope.d.ts.map +1 -0
- package/types/lib/inventory/astWorker.d.ts +9 -0
- package/types/lib/inventory/astWorker.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +159 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -0
- package/types/lib/inventory/auditCategories.d.ts +80 -0
- package/types/lib/inventory/auditCategories.d.ts.map +1 -0
- package/types/lib/inventory/bomUtils.d.ts +145 -0
- package/types/lib/inventory/bomUtils.d.ts.map +1 -0
- package/types/lib/inventory/cacheCommands.d.ts +28 -0
- package/types/lib/inventory/cacheCommands.d.ts.map +1 -0
- package/types/lib/inventory/cacheDir.d.ts +55 -0
- package/types/lib/inventory/cacheDir.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +37 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -0
- package/types/lib/inventory/cdxrs.d.ts +90 -0
- package/types/lib/inventory/cdxrs.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts +27 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts +27 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/common.d.ts +11 -0
- package/types/lib/inventory/ciParsers/common.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts +38 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts +26 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts +26 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +90 -0
- package/types/lib/inventory/citations.d.ts.map +1 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts +14 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/containerRisk.d.ts +20 -0
- package/types/lib/inventory/containerRisk.d.ts.map +1 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts +37 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +140 -0
- package/types/lib/inventory/deps.d.ts.map +1 -0
- package/types/lib/inventory/depsUtils.d.ts +74 -0
- package/types/lib/inventory/depsUtils.d.ts.map +1 -0
- package/types/lib/inventory/display.d.ts +227 -0
- package/types/lib/inventory/display.d.ts.map +1 -0
- package/types/lib/inventory/dosai.d.ts +130 -0
- package/types/lib/inventory/dosai.d.ts.map +1 -0
- package/types/lib/inventory/dosaiParsers.d.ts +59 -0
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -0
- package/types/lib/inventory/dynamic.d.ts +25 -0
- package/types/lib/inventory/dynamic.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +377 -0
- package/types/lib/inventory/envcontext.d.ts.map +1 -0
- package/types/lib/inventory/evidenceUtils.d.ts +74 -0
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -0
- package/types/lib/inventory/fetchBatch.d.ts +127 -0
- package/types/lib/inventory/fetchBatch.d.ts.map +1 -0
- package/types/lib/inventory/fetchRate.d.ts +118 -0
- package/types/lib/inventory/fetchRate.d.ts.map +1 -0
- package/types/lib/inventory/forgeEnricher.d.ts +31 -0
- package/types/lib/inventory/forgeEnricher.d.ts.map +1 -0
- package/types/lib/inventory/formulationParsers.d.ts +50 -0
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/gtfobins.d.ts +27 -0
- package/types/lib/inventory/gtfobins.d.ts.map +1 -0
- package/types/lib/inventory/hbom.d.ts +58 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -0
- package/types/lib/inventory/hbomAnalysis.d.ts +56 -0
- package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -0
- package/types/lib/inventory/hbomLoader.d.ts +7 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -0
- package/types/lib/inventory/hostTopology.d.ts +47 -0
- package/types/lib/inventory/hostTopology.d.ts.map +1 -0
- package/types/lib/inventory/inventoryStats.d.ts +42 -0
- package/types/lib/inventory/inventoryStats.d.ts.map +1 -0
- package/types/lib/inventory/jsonLike.d.ts +23 -0
- package/types/lib/inventory/jsonLike.d.ts.map +1 -0
- package/types/lib/inventory/licenseEnhancer.d.ts +70 -0
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -0
- package/types/lib/inventory/lolbas.d.ts +16 -0
- package/types/lib/inventory/lolbas.d.ts.map +1 -0
- package/types/lib/inventory/mcp.d.ts +29 -0
- package/types/lib/inventory/mcp.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts +20 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/mcpDiscovery.d.ts +33 -0
- package/types/lib/inventory/mcpDiscovery.d.ts.map +1 -0
- package/types/lib/inventory/mcpPinning.d.ts +11 -0
- package/types/lib/inventory/mcpPinning.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +49 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -0
- package/types/lib/inventory/osinfo.d.ts +120 -0
- package/types/lib/inventory/osinfo.d.ts.map +1 -0
- package/types/lib/inventory/osqueryTransform.d.ts +84 -0
- package/types/lib/inventory/osqueryTransform.d.ts.map +1 -0
- package/types/lib/inventory/plugins.d.ts +58 -0
- package/types/lib/inventory/plugins.d.ts.map +1 -0
- package/types/lib/inventory/protobom.d.ts +71 -0
- package/types/lib/inventory/protobom.d.ts.map +1 -0
- package/types/lib/inventory/protobomLoader.d.ts +17 -0
- package/types/lib/inventory/protobomLoader.d.ts.map +1 -0
- package/types/lib/inventory/provenanceUtils.d.ts +98 -0
- package/types/lib/inventory/provenanceUtils.d.ts.map +1 -0
- package/types/lib/inventory/purl.d.ts +313 -0
- package/types/lib/inventory/purl.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +17 -0
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/sbomDocument.d.ts +59 -0
- package/types/lib/inventory/sbomDocument.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +163 -0
- package/types/lib/inventory/source.d.ts.map +1 -0
- package/types/lib/inventory/spdx.d.ts +66 -0
- package/types/lib/inventory/spdx.d.ts.map +1 -0
- package/types/lib/inventory/spdxExpression.d.ts +58 -0
- package/types/lib/inventory/spdxExpression.d.ts.map +1 -0
- package/types/lib/inventory/spdxUtils.d.ts +12 -0
- package/types/lib/inventory/spdxUtils.d.ts.map +1 -0
- package/types/lib/inventory/table.d.ts +19 -0
- package/types/lib/inventory/table.d.ts.map +1 -0
- package/types/lib/inventory/traceRunner.d.ts +80 -0
- package/types/lib/inventory/traceRunner.d.ts.map +1 -0
- package/types/lib/inventory/unicodeScan.d.ts +46 -0
- package/types/lib/inventory/unicodeScan.d.ts.map +1 -0
- package/types/lib/managers/binary.d.ts +76 -0
- package/types/lib/managers/binary.d.ts.map +1 -0
- package/types/lib/managers/containerutils.d.ts +30 -0
- package/types/lib/managers/containerutils.d.ts.map +1 -0
- package/types/lib/managers/docker.d.ts +157 -0
- package/types/lib/managers/docker.d.ts.map +1 -0
- package/types/lib/managers/dockerConnection.d.ts +42 -0
- package/types/lib/managers/dockerConnection.d.ts.map +1 -0
- package/types/lib/managers/oci.d.ts +21 -0
- package/types/lib/managers/oci.d.ts.map +1 -0
- package/types/lib/managers/piptree.d.ts +13 -0
- package/types/lib/managers/piptree.d.ts.map +1 -0
- package/types/lib/parsers/cmakeCache.d.ts +70 -0
- package/types/lib/parsers/cmakeCache.d.ts.map +1 -0
- package/types/lib/parsers/gguf.d.ts +39 -0
- package/types/lib/parsers/gguf.d.ts.map +1 -0
- package/types/lib/parsers/gitAiNotes.d.ts +15 -0
- package/types/lib/parsers/gitAiNotes.d.ts.map +1 -0
- package/types/lib/parsers/gitmodules.d.ts +88 -0
- package/types/lib/parsers/gitmodules.d.ts.map +1 -0
- package/types/lib/parsers/htmlExtract.d.ts +34 -0
- package/types/lib/parsers/htmlExtract.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts +153 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts +155 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -0
- package/types/lib/parsers/iri.d.ts +68 -0
- package/types/lib/parsers/iri.d.ts.map +1 -0
- package/types/lib/parsers/npmrc.d.ts +33 -0
- package/types/lib/parsers/npmrc.d.ts.map +1 -0
- package/types/lib/parsers/ollama.d.ts +22 -0
- package/types/lib/parsers/ollama.d.ts.map +1 -0
- package/types/lib/parsers/xml.d.ts +47 -0
- package/types/lib/parsers/xml.d.ts.map +1 -0
- package/types/lib/server/server.d.ts +51 -0
- package/types/lib/server/server.d.ts.map +1 -0
- package/types/lib/stages/postgen/annotator.d.ts +36 -0
- package/types/lib/stages/postgen/annotator.d.ts.map +1 -0
- package/types/lib/stages/postgen/auditBom.d.ts +92 -0
- package/types/lib/stages/postgen/auditBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/postgen.d.ts +59 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts +18 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -0
- package/types/lib/stages/postgen/sortBom.d.ts +34 -0
- package/types/lib/stages/postgen/sortBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts +11 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts.map +1 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts +71 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -0
- package/types/lib/stages/pregen/envAudit.d.ts +14 -0
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -0
- package/types/lib/stages/pregen/pregen.d.ts +59 -0
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts +47 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts +9 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts +46 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/index.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts +14 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/link.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/link.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/node.d.ts +112 -0
- package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts +27 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts +36 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts +20 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts +54 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts +13 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts +6 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts +35 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts.map +1 -0
- package/types/lib/validator/bomValidator.d.ts +40 -0
- package/types/lib/validator/bomValidator.d.ts.map +1 -0
- package/types/lib/validator/complianceEngine.d.ts +72 -0
- package/types/lib/validator/complianceEngine.d.ts.map +1 -0
- package/types/lib/validator/complianceRules.d.ts +61 -0
- package/types/lib/validator/complianceRules.d.ts.map +1 -0
- package/types/lib/validator/index.d.ts +101 -0
- package/types/lib/validator/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/annotations.d.ts +37 -0
- package/types/lib/validator/reporters/annotations.d.ts.map +1 -0
- package/types/lib/validator/reporters/console.d.ts +34 -0
- package/types/lib/validator/reporters/console.d.ts.map +1 -0
- package/types/lib/validator/reporters/index.d.ts +30 -0
- package/types/lib/validator/reporters/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/json.d.ts +11 -0
- package/types/lib/validator/reporters/json.d.ts.map +1 -0
- package/types/lib/validator/reporters/sarif.d.ts +22 -0
- package/types/lib/validator/reporters/sarif.d.ts.map +1 -0
- package/mod.d.ts +0 -7
- package/mod.js +0 -22
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
// OWASP Transparency Exchange API (TEA) client — ECMA TC54 TG1.
|
|
2
|
+
//
|
|
3
|
+
// Two surfaces exist in the spec repository:
|
|
4
|
+
// - The **consumer** API (spec/openapi.yaml, spec version 0.4.0, "Beta 2")
|
|
5
|
+
// is the conformance base: discovery via `/.well-known/tea`, TEI
|
|
6
|
+
// resolution, and retrieval of Collections and Artifacts.
|
|
7
|
+
// - The **publisher** API (spec/publisher/openapi.json, "This specification
|
|
8
|
+
// will be a recommended TEA publisher API") is a draft recommendation,
|
|
9
|
+
// NOT part of the conformance spec. `publishTeaCollection` targets that
|
|
10
|
+
// draft's POST /collection shape (snake_case fields) and is subject to
|
|
11
|
+
// change until the publisher API is standardised.
|
|
12
|
+
//
|
|
13
|
+
// References: https://github.com/CycloneDX/transparency-exchange-api
|
|
14
|
+
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
|
|
17
|
+
import { cdxgenAgent, readEnvironmentVariable } from "../core/activity.js";
|
|
18
|
+
import {
|
|
19
|
+
createCitation,
|
|
20
|
+
findCdxgenToolBomRef,
|
|
21
|
+
} from "../inventory/citations.js";
|
|
22
|
+
import { mergeDependencies, trimComponents } from "../inventory/depsUtils.js";
|
|
23
|
+
import {
|
|
24
|
+
MAX_SBOM_DOCUMENT_BYTES,
|
|
25
|
+
parseSbomDocument,
|
|
26
|
+
tagSbomComponents,
|
|
27
|
+
} from "../inventory/sbomDocument.js";
|
|
28
|
+
|
|
29
|
+
// The TEA API version this client implements, per spec/openapi.yaml.
|
|
30
|
+
const SUPPORTED_TEA_VERSIONS = ["0.4.0"];
|
|
31
|
+
|
|
32
|
+
const TEI_PATTERN = /^urn:tei:([a-z0-9]+):([^:]+):(.+)$/i;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Parse a Transparency Exchange Identifier (TEI) URN.
|
|
36
|
+
*
|
|
37
|
+
* Syntax: `urn:tei:<type>:<domain-name>:<unique-identifier>` where
|
|
38
|
+
* `<domain-name>` is used for `/.well-known/tea` discovery.
|
|
39
|
+
*
|
|
40
|
+
* @param {string} tei TEI URN string
|
|
41
|
+
* @returns {{type: string, domain: string, id: string}|null} Parsed parts
|
|
42
|
+
*/
|
|
43
|
+
export function parseTei(tei) {
|
|
44
|
+
const match = TEI_PATTERN.exec(String(tei || "").trim());
|
|
45
|
+
if (!match) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return { type: match[1], domain: match[2], id: match[3] };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Compare two semver strings (major.minor.patch with optional prerelease).
|
|
53
|
+
* Returns 1 when a > b, -1 when a < b, 0 when equal.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} a Version string
|
|
56
|
+
* @param {string} b Version string
|
|
57
|
+
* @returns {number} Comparison result
|
|
58
|
+
*/
|
|
59
|
+
export function compareTeaVersions(a, b) {
|
|
60
|
+
const parse = (value) => {
|
|
61
|
+
const [core, prerelease] = String(value).split("-", 2);
|
|
62
|
+
const parts = core.split(".").map((part) => Number.parseInt(part, 10) || 0);
|
|
63
|
+
return { parts, prerelease };
|
|
64
|
+
};
|
|
65
|
+
const left = parse(a);
|
|
66
|
+
const right = parse(b);
|
|
67
|
+
for (let index = 0; index < 3; index += 1) {
|
|
68
|
+
const leftPart = left.parts[index] || 0;
|
|
69
|
+
const rightPart = right.parts[index] || 0;
|
|
70
|
+
if (leftPart !== rightPart) {
|
|
71
|
+
return leftPart > rightPart ? 1 : -1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// A release beats a prerelease at the same core version.
|
|
75
|
+
if (left.prerelease === right.prerelease) {
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
if (!left.prerelease) {
|
|
79
|
+
return 1;
|
|
80
|
+
}
|
|
81
|
+
if (!right.prerelease) {
|
|
82
|
+
return -1;
|
|
83
|
+
}
|
|
84
|
+
return left.prerelease.localeCompare(right.prerelease);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Pick the endpoint and API version to use, per the discovery spec: the client
|
|
89
|
+
* MUST pick the endpoint with the highest matching version supported by both
|
|
90
|
+
* the client and the endpoint (SemVer comparison), preferring the highest
|
|
91
|
+
* `priority` when several tie. Returns the best-effort selection.
|
|
92
|
+
*
|
|
93
|
+
* @param {Object[]} endpoints Endpoints from the `.well-known/tea` document
|
|
94
|
+
* @param {string[]} [supported] Versions the client supports
|
|
95
|
+
* @returns {{url: string, version: string}|null} Selected endpoint
|
|
96
|
+
*/
|
|
97
|
+
export function selectTeaEndpoint(
|
|
98
|
+
endpoints,
|
|
99
|
+
supported = SUPPORTED_TEA_VERSIONS,
|
|
100
|
+
) {
|
|
101
|
+
if (!Array.isArray(endpoints) || !endpoints.length) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const candidates = [];
|
|
105
|
+
for (const endpoint of endpoints) {
|
|
106
|
+
const url = String(endpoint?.url || endpoint?.rootUrl || "").trim();
|
|
107
|
+
if (!url) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const versions = Array.isArray(endpoint?.versions) ? endpoint.versions : [];
|
|
111
|
+
// Highest common version; fall back to the endpoint's highest version so a
|
|
112
|
+
// server that has moved ahead of the client still works best-effort.
|
|
113
|
+
let version;
|
|
114
|
+
for (const candidate of supported) {
|
|
115
|
+
const match = versions.find(
|
|
116
|
+
(v) => compareTeaVersions(v, candidate) === 0,
|
|
117
|
+
);
|
|
118
|
+
if (match) {
|
|
119
|
+
version = match;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (!version && versions.length) {
|
|
124
|
+
version = versions.reduce((best, v) =>
|
|
125
|
+
compareTeaVersions(v, best) > 0 ? v : best,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
if (version) {
|
|
129
|
+
candidates.push({
|
|
130
|
+
url,
|
|
131
|
+
version,
|
|
132
|
+
priority: Number(endpoint?.priority) || 0,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
candidates.sort((a, b) => {
|
|
137
|
+
if (b.priority !== a.priority) {
|
|
138
|
+
return b.priority - a.priority;
|
|
139
|
+
}
|
|
140
|
+
return compareTeaVersions(b.version, a.version);
|
|
141
|
+
});
|
|
142
|
+
return candidates[0] || null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function teaRequestHeaders(options = {}) {
|
|
146
|
+
// Credentials are supplied via --tea-token / TEA_TOKEN and are sent only as
|
|
147
|
+
// an Authorization header. They are never logged and never reach the BOM.
|
|
148
|
+
const token =
|
|
149
|
+
options?.teaToken || readEnvironmentVariable("TEA_TOKEN") || undefined;
|
|
150
|
+
const headers = {};
|
|
151
|
+
if (token) {
|
|
152
|
+
headers.Authorization = `Bearer ${token}`;
|
|
153
|
+
}
|
|
154
|
+
return { headers, token };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async function teaJsonGet(url, options = {}) {
|
|
158
|
+
const { headers, token } = teaRequestHeaders(options);
|
|
159
|
+
const response = await cdxgenAgent(url, {
|
|
160
|
+
method: "GET",
|
|
161
|
+
headers,
|
|
162
|
+
responseType: "json",
|
|
163
|
+
throwHttpErrors: true,
|
|
164
|
+
context: {
|
|
165
|
+
activityIntent: "tea-fetch",
|
|
166
|
+
...(token ? { credentialPresent: true } : {}),
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
return response.body ?? response;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Discover TEA endpoints for a domain via `https://<domain>/.well-known/tea`.
|
|
174
|
+
* The well-known document must conform to the TEA Well-Known schema.
|
|
175
|
+
*
|
|
176
|
+
* @param {string} domain Domain name from the TEI
|
|
177
|
+
* @param {Object} [options] CLI options
|
|
178
|
+
* @returns {Promise<Object|null>} Parsed well-known document
|
|
179
|
+
*/
|
|
180
|
+
export async function discoverTeaEndpoints(domain, options = {}) {
|
|
181
|
+
const wellKnownUrl = `https://${domain}/.well-known/tea`;
|
|
182
|
+
const doc = await teaJsonGet(wellKnownUrl, options);
|
|
183
|
+
if (!doc || !Array.isArray(doc.endpoints)) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
return doc;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Resolve a TEI to a product release UUID and a selected TEA server.
|
|
191
|
+
*
|
|
192
|
+
* @param {string} tei TEI URN string
|
|
193
|
+
* @param {Object} [options] CLI options
|
|
194
|
+
* @returns {Promise<{productReleaseUuid: string, server: {url: string, version: string}}|null>}
|
|
195
|
+
*/
|
|
196
|
+
export async function resolveTei(tei, options = {}) {
|
|
197
|
+
const parsed = parseTei(tei);
|
|
198
|
+
if (!parsed) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
const wellKnown = await discoverTeaEndpoints(parsed.domain, options);
|
|
202
|
+
if (!wellKnown) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
// Servers listed by the discovery endpoint override well-known endpoints.
|
|
206
|
+
let server = selectTeaEndpoint(wellKnown.endpoints, SUPPORTED_TEA_VERSIONS);
|
|
207
|
+
if (!server) {
|
|
208
|
+
console.warn(
|
|
209
|
+
`cdxgen: no usable TEA endpoint advertised by ${parsed.domain}.`,
|
|
210
|
+
);
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
const discoveryUrl = `${server.url}/v${server.version}/discovery?tei=${encodeURIComponent(tei)}`;
|
|
214
|
+
const discovery = await teaJsonGet(discoveryUrl, options);
|
|
215
|
+
if (!discovery?.productReleaseUuid) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
if (Array.isArray(discovery.servers) && discovery.servers.length) {
|
|
219
|
+
const preferred = selectTeaEndpoint(
|
|
220
|
+
discovery.servers.map((entry) => ({
|
|
221
|
+
url: entry.rootUrl,
|
|
222
|
+
versions: entry.versions,
|
|
223
|
+
priority: entry.priority,
|
|
224
|
+
})),
|
|
225
|
+
SUPPORTED_TEA_VERSIONS,
|
|
226
|
+
);
|
|
227
|
+
if (preferred) {
|
|
228
|
+
server = preferred;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
productReleaseUuid: discovery.productReleaseUuid,
|
|
233
|
+
server,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Fetch the latest TEA Collection for a product (or component) release.
|
|
239
|
+
*
|
|
240
|
+
* @param {Object} input Fetch inputs
|
|
241
|
+
* @param {string} input.rootUrl TEA server root URL
|
|
242
|
+
* @param {string} input.version TEA API version
|
|
243
|
+
* @param {string} input.releaseUuid Product or component release UUID
|
|
244
|
+
* @param {string} [input.scope] `productRelease` (default) or `componentRelease`
|
|
245
|
+
* @param {Object} [input.options] CLI options
|
|
246
|
+
* @returns {Promise<Object|null>} TEA Collection object
|
|
247
|
+
*/
|
|
248
|
+
export async function fetchLatestCollection({
|
|
249
|
+
rootUrl,
|
|
250
|
+
version,
|
|
251
|
+
releaseUuid,
|
|
252
|
+
scope = "productRelease",
|
|
253
|
+
options = {},
|
|
254
|
+
} = {}) {
|
|
255
|
+
const url = `${rootUrl}/v${version}/${scope}/${releaseUuid}/collection/latest`;
|
|
256
|
+
return teaJsonGet(url, options);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function normalizeChecksumType(algType) {
|
|
260
|
+
const normalized = String(algType || "")
|
|
261
|
+
.toUpperCase()
|
|
262
|
+
.replace(/[^A-Z0-9]/g, "");
|
|
263
|
+
const mapping = {
|
|
264
|
+
SHA256: "sha256",
|
|
265
|
+
SHA384: "sha384",
|
|
266
|
+
SHA512: "sha512",
|
|
267
|
+
SHA224: "sha224",
|
|
268
|
+
SHA1: "sha1",
|
|
269
|
+
MD5: "md5",
|
|
270
|
+
BLAKE2B512: "blake2b512",
|
|
271
|
+
BLAKE2S256: "blake2s256",
|
|
272
|
+
};
|
|
273
|
+
return mapping[normalized];
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function computeChecksum(content, algType) {
|
|
277
|
+
const algorithm = normalizeChecksumType(algType);
|
|
278
|
+
if (!algorithm) {
|
|
279
|
+
return undefined;
|
|
280
|
+
}
|
|
281
|
+
return createHash(algorithm).update(content).digest("hex");
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Check downloaded content against the checksums a Collection declares for it.
|
|
286
|
+
*
|
|
287
|
+
* Every checksum whose algorithm this client can compute must match. When the
|
|
288
|
+
* artifact declares checksums but none of them uses an algorithm we support,
|
|
289
|
+
* the content is rejected: accepting it would mean merging remote data whose
|
|
290
|
+
* integrity was asserted and then not checked, which is worse than fetching
|
|
291
|
+
* nothing. An artifact that declares no checksums at all is a publisher
|
|
292
|
+
* decision, and is accepted with a warning.
|
|
293
|
+
*
|
|
294
|
+
* @param {string} content Downloaded artifact content
|
|
295
|
+
* @param {Object[]} checksums Checksum entries (`{algType, algValue}`)
|
|
296
|
+
* @param {string} source URL used in warnings
|
|
297
|
+
* @returns {boolean} true when the content may be used
|
|
298
|
+
*/
|
|
299
|
+
function checksumsVerified(content, checksums, source) {
|
|
300
|
+
const declared = Array.isArray(checksums) ? checksums : [];
|
|
301
|
+
if (!declared.length) {
|
|
302
|
+
console.warn(
|
|
303
|
+
`cdxgen: TEA artifact ${source} declares no checksum; merging unverified content.`,
|
|
304
|
+
);
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
let verifiedAny = false;
|
|
308
|
+
for (const checksum of declared) {
|
|
309
|
+
const computed = computeChecksum(content, checksum?.algType);
|
|
310
|
+
if (!computed) {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const expected = String(checksum?.algValue || "")
|
|
314
|
+
.trim()
|
|
315
|
+
.toLowerCase();
|
|
316
|
+
if (!expected) {
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (computed !== expected) {
|
|
320
|
+
console.warn(
|
|
321
|
+
`cdxgen: TEA artifact ${source} failed its ${checksum.algType} checksum; skipping.`,
|
|
322
|
+
);
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
verifiedAny = true;
|
|
326
|
+
}
|
|
327
|
+
if (!verifiedAny) {
|
|
328
|
+
console.warn(
|
|
329
|
+
`cdxgen: TEA artifact ${source} declares only checksum algorithms this client cannot compute; skipping.`,
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
return verifiedAny;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Download the BOM artifacts of a TEA Collection and verify their checksums.
|
|
337
|
+
* Only artifacts whose format is a CycloneDX or SPDX JSON media type are
|
|
338
|
+
* downloaded; other formats (XML, signatures) are skipped. A checksum mismatch
|
|
339
|
+
* rejects the artifact rather than merging untrusted content.
|
|
340
|
+
*
|
|
341
|
+
* @param {Object} collection TEA Collection object
|
|
342
|
+
* @param {Object} [options] CLI options
|
|
343
|
+
* @returns {Promise<Array<{name: string, url: string, content: string, format: Object}>>}
|
|
344
|
+
*/
|
|
345
|
+
export async function fetchBomArtifacts(collection, options = {}) {
|
|
346
|
+
const artifacts = [];
|
|
347
|
+
for (const artifact of Array.isArray(collection?.artifacts)
|
|
348
|
+
? collection.artifacts
|
|
349
|
+
: []) {
|
|
350
|
+
if (String(artifact?.type || "").toUpperCase() !== "BOM") {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
for (const format of Array.isArray(artifact?.formats)
|
|
354
|
+
? artifact.formats
|
|
355
|
+
: []) {
|
|
356
|
+
const mediaType = String(format?.mediaType || "").toLowerCase();
|
|
357
|
+
const isJsonBom =
|
|
358
|
+
(mediaType.includes("cyclonedx") && mediaType.includes("json")) ||
|
|
359
|
+
(mediaType.includes("spdx") && mediaType.includes("json")) ||
|
|
360
|
+
mediaType === "application/json";
|
|
361
|
+
if (!isJsonBom || !format?.url) {
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
const { headers } = teaRequestHeaders(options);
|
|
365
|
+
const response = await cdxgenAgent(format.url, {
|
|
366
|
+
method: "GET",
|
|
367
|
+
headers,
|
|
368
|
+
responseType: "text",
|
|
369
|
+
context: { activityIntent: "tea-fetch" },
|
|
370
|
+
});
|
|
371
|
+
const content = response.body ?? response;
|
|
372
|
+
if (
|
|
373
|
+
typeof content !== "string" ||
|
|
374
|
+
Buffer.byteLength(content) > MAX_SBOM_DOCUMENT_BYTES
|
|
375
|
+
) {
|
|
376
|
+
console.warn(
|
|
377
|
+
`cdxgen: TEA artifact ${format.url} is not usable text within ${MAX_SBOM_DOCUMENT_BYTES} bytes; skipping.`,
|
|
378
|
+
);
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
if (!checksumsVerified(content, format.checksums, format.url)) {
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
artifacts.push({ name: artifact.name, url: format.url, content, format });
|
|
385
|
+
break; // one JSON format per artifact is enough
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return artifacts;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Build the POST /collection payload per the draft TEA publisher API.
|
|
393
|
+
*
|
|
394
|
+
* Collection versioning is owned by the server: the client publishes with a
|
|
395
|
+
* reason (INITIAL_RELEASE for the first collection, ARTIFACT_UPDATED /
|
|
396
|
+
* ARTIFACT_ADDED / VEX_UPDATED for updates) and the server increments the
|
|
397
|
+
* collection `version` counter.
|
|
398
|
+
*
|
|
399
|
+
* @param {Object} input Payload inputs
|
|
400
|
+
* @param {string} input.leafIdentifier UUID of the release/leaf this collection belongs to
|
|
401
|
+
* @param {string} input.productName Product name
|
|
402
|
+
* @param {string} input.productVersion Product version
|
|
403
|
+
* @param {string} input.authorName Author name
|
|
404
|
+
* @param {string} [input.authorEmail] Author email
|
|
405
|
+
* @param {string} [input.reasonType] Collection update reason enum value
|
|
406
|
+
* @param {string} [input.reasonComment] Free-text reason comment
|
|
407
|
+
* @param {string} input.artifactName Artifact name
|
|
408
|
+
* @param {string} input.artifactUrl Hosted URL of the BOM artifact
|
|
409
|
+
* @param {string} input.artifactContent BOM content used for checksum/size
|
|
410
|
+
* @param {string} [input.artifactMediaType] Media type of the BOM
|
|
411
|
+
* @param {string} [input.artifactDescription] Description of the artifact
|
|
412
|
+
* @returns {Object} Publish payload
|
|
413
|
+
*/
|
|
414
|
+
export function buildPublishCollectionPayload({
|
|
415
|
+
leafIdentifier,
|
|
416
|
+
productName,
|
|
417
|
+
productVersion,
|
|
418
|
+
authorName,
|
|
419
|
+
authorEmail,
|
|
420
|
+
reasonType = "INITIAL_RELEASE",
|
|
421
|
+
reasonComment,
|
|
422
|
+
artifactName,
|
|
423
|
+
artifactUrl,
|
|
424
|
+
artifactContent,
|
|
425
|
+
artifactMediaType = "application/vnd.cyclonedx+json",
|
|
426
|
+
artifactDescription,
|
|
427
|
+
}) {
|
|
428
|
+
const checksumType = "SHA256";
|
|
429
|
+
return {
|
|
430
|
+
tea_leaf_identifier: leafIdentifier,
|
|
431
|
+
product_name: productName,
|
|
432
|
+
product_version: productVersion,
|
|
433
|
+
release_date: new Date().toISOString(),
|
|
434
|
+
author: {
|
|
435
|
+
name: authorName,
|
|
436
|
+
...(authorEmail ? { email: authorEmail } : {}),
|
|
437
|
+
},
|
|
438
|
+
reason: {
|
|
439
|
+
type: reasonType,
|
|
440
|
+
...(reasonComment ? { comment: reasonComment } : {}),
|
|
441
|
+
},
|
|
442
|
+
artifacts: [
|
|
443
|
+
{
|
|
444
|
+
name: artifactName,
|
|
445
|
+
type: "BOM",
|
|
446
|
+
author: { name: authorName },
|
|
447
|
+
objects: [
|
|
448
|
+
{
|
|
449
|
+
description: artifactDescription || `${artifactName} SBOM`,
|
|
450
|
+
media_type: artifactMediaType,
|
|
451
|
+
artifact_url: artifactUrl,
|
|
452
|
+
artifact_size_in_bytes: Buffer.byteLength(artifactContent),
|
|
453
|
+
artifact_checksum: computeChecksum(artifactContent, checksumType),
|
|
454
|
+
artifact_checksum_type: checksumType,
|
|
455
|
+
},
|
|
456
|
+
],
|
|
457
|
+
},
|
|
458
|
+
],
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Publish a TEA Collection via the draft publisher API's POST /collection.
|
|
464
|
+
*
|
|
465
|
+
* A publish failure is reported as an error to the caller; it never deletes or
|
|
466
|
+
* rewrites the locally written BOM. The caller decides the exit status.
|
|
467
|
+
*
|
|
468
|
+
* @param {string} serverUrl TEA server base URL (e.g. https://tea.example.com)
|
|
469
|
+
* @param {Object} payload POST /collection payload
|
|
470
|
+
* @param {Object} [options] CLI options
|
|
471
|
+
* @returns {Promise<{status: number, body: Object}>} Server response
|
|
472
|
+
*/
|
|
473
|
+
export async function publishTeaCollection(serverUrl, payload, options = {}) {
|
|
474
|
+
const { headers, token } = teaRequestHeaders(options);
|
|
475
|
+
const response = await cdxgenAgent(`${serverUrl}/collection`, {
|
|
476
|
+
method: "POST",
|
|
477
|
+
headers: {
|
|
478
|
+
...headers,
|
|
479
|
+
"Content-Type": "application/json",
|
|
480
|
+
},
|
|
481
|
+
json: payload,
|
|
482
|
+
responseType: "json",
|
|
483
|
+
throwHttpErrors: true,
|
|
484
|
+
context: {
|
|
485
|
+
activityIntent: "tea-publish",
|
|
486
|
+
...(token ? { credentialPresent: true } : {}),
|
|
487
|
+
},
|
|
488
|
+
});
|
|
489
|
+
return {
|
|
490
|
+
status: response.statusCode || 201,
|
|
491
|
+
body: response.body ?? response,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Merge fetched TEA SBOM documents into the generated BOM with the same rule
|
|
497
|
+
* PEP 770 embedded SBOMs follow: an upstream document is a stronger assertion
|
|
498
|
+
* than cdxgen's inference, so its components win on conflict and the conflict
|
|
499
|
+
* is recorded by the property union rather than discarded. Returns the
|
|
500
|
+
* components, dependencies, and citations; the caller merges them.
|
|
501
|
+
*
|
|
502
|
+
* @param {Object[]} artifacts Fetched artifacts (`{name, url, content}`)
|
|
503
|
+
* @param {Object} [context] Merge context
|
|
504
|
+
* @param {string} [context.collectionUuid] UUID of the TEA collection
|
|
505
|
+
* @param {string} [context.attributedTo] bom-ref to attribute the fetched data to
|
|
506
|
+
* @returns {{components: Object[], dependencies: Object[], citations: Object[]}}
|
|
507
|
+
*/
|
|
508
|
+
export function mergeTeaBom(artifacts, context = {}) {
|
|
509
|
+
const components = [];
|
|
510
|
+
const dependencies = [];
|
|
511
|
+
const citations = [];
|
|
512
|
+
for (const artifact of Array.isArray(artifacts) ? artifacts : []) {
|
|
513
|
+
const source = artifact?.url || artifact?.name || "unknown";
|
|
514
|
+
const parsed = parseSbomDocument(artifact?.content, { source });
|
|
515
|
+
if (!parsed) {
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
518
|
+
tagSbomComponents(parsed.components, [
|
|
519
|
+
{ name: "cdx:tea:source", value: source },
|
|
520
|
+
{ name: "cdx:tea:collection", value: context.collectionUuid },
|
|
521
|
+
]);
|
|
522
|
+
components.push(...parsed.components);
|
|
523
|
+
dependencies.push(...parsed.dependencies);
|
|
524
|
+
// Attribution needs a bom-ref that exists in the BOM. The TEA server is not
|
|
525
|
+
// a BOM object, so the claim is attributed to the cdxgen tool component that
|
|
526
|
+
// performed the retrieval; with no such ref the citation is dropped rather
|
|
527
|
+
// than pointed at something invented.
|
|
528
|
+
const citation = createCitation({
|
|
529
|
+
expressions: [
|
|
530
|
+
`$.components[?(@.properties[?(@.name == 'cdx:tea:source' && @.value == '${source.replace(/'/g, "")}')])]`,
|
|
531
|
+
],
|
|
532
|
+
attributedTo: context.attributedTo,
|
|
533
|
+
note: `Components retrieved over the Transparency Exchange API from ${source} (collection ${context.collectionUuid || "unknown"}).`,
|
|
534
|
+
});
|
|
535
|
+
if (citation) {
|
|
536
|
+
citations.push(citation);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
return { components, dependencies, citations };
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Resolve a TEI, retrieve the latest Collection's BOM artifacts, and merge them
|
|
544
|
+
* into a generated BOM in place.
|
|
545
|
+
*
|
|
546
|
+
* Retrieval is an enrichment, never a precondition: any failure is reported and
|
|
547
|
+
* the locally generated BOM is left as it stands.
|
|
548
|
+
*
|
|
549
|
+
* @param {Object} bomNSData BOM namespace data (`bomJson`, `parentComponent`, `citations`)
|
|
550
|
+
* @param {Object} options CLI options carrying `teaFetch` and credentials
|
|
551
|
+
* @returns {Promise<Object>} The same `bomNSData`, enriched where possible
|
|
552
|
+
*/
|
|
553
|
+
export async function applyTeaFetch(bomNSData, options = {}) {
|
|
554
|
+
const bomJson = bomNSData?.bomJson;
|
|
555
|
+
if (!options?.teaFetch || !bomJson) {
|
|
556
|
+
return bomNSData;
|
|
557
|
+
}
|
|
558
|
+
try {
|
|
559
|
+
const resolved = await resolveTei(options.teaFetch, options);
|
|
560
|
+
if (!resolved) {
|
|
561
|
+
console.warn(
|
|
562
|
+
`cdxgen: TEA fetch could not resolve ${options.teaFetch}. Continuing with the locally generated BOM.`,
|
|
563
|
+
);
|
|
564
|
+
return bomNSData;
|
|
565
|
+
}
|
|
566
|
+
const collection = await fetchLatestCollection({
|
|
567
|
+
rootUrl: resolved.server.url,
|
|
568
|
+
version: resolved.server.version,
|
|
569
|
+
releaseUuid: resolved.productReleaseUuid,
|
|
570
|
+
options,
|
|
571
|
+
});
|
|
572
|
+
if (!collection) {
|
|
573
|
+
return bomNSData;
|
|
574
|
+
}
|
|
575
|
+
const artifacts = await fetchBomArtifacts(collection, options);
|
|
576
|
+
const merged = mergeTeaBom(artifacts, {
|
|
577
|
+
collectionUuid: collection.uuid,
|
|
578
|
+
attributedTo: findCdxgenToolBomRef(bomJson),
|
|
579
|
+
});
|
|
580
|
+
if (merged.components.length) {
|
|
581
|
+
// Upstream components are placed first so the dedupe keeps them when they
|
|
582
|
+
// collide with an inferred component.
|
|
583
|
+
bomJson.components = trimComponents([
|
|
584
|
+
...merged.components,
|
|
585
|
+
...(bomJson.components || []),
|
|
586
|
+
]);
|
|
587
|
+
}
|
|
588
|
+
if (merged.dependencies.length) {
|
|
589
|
+
bomJson.dependencies = mergeDependencies(
|
|
590
|
+
bomJson.dependencies || [],
|
|
591
|
+
merged.dependencies,
|
|
592
|
+
bomNSData.parentComponent,
|
|
593
|
+
);
|
|
594
|
+
}
|
|
595
|
+
if (merged.citations.length) {
|
|
596
|
+
bomNSData.citations = [
|
|
597
|
+
...(bomNSData.citations || []),
|
|
598
|
+
...merged.citations,
|
|
599
|
+
];
|
|
600
|
+
}
|
|
601
|
+
} catch (err) {
|
|
602
|
+
console.error(
|
|
603
|
+
`cdxgen: TEA fetch failed: ${err?.message || err}. Continuing with the locally generated BOM.`,
|
|
604
|
+
);
|
|
605
|
+
}
|
|
606
|
+
return bomNSData;
|
|
607
|
+
}
|