@cdxgen/cdxgen 0.0.1 → 13.0.1
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 +2335 -0
- package/bin/convert.js +220 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +504 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +303 -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 +1882 -0
- package/lib/cli/cliOptions.js +543 -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 +280 -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 +920 -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 +583 -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 +1793 -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 +383 -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 +267 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3459 -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 +329 -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 +50 -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 +201 -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 +22 -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 +147 -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,1239 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { basename, join, relative, sep } from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
|
|
5
|
+
import { Purl } from "@cdxgen/cdx-purl";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
DEBUG_MODE,
|
|
9
|
+
isDryRun,
|
|
10
|
+
readEnvironmentVariable,
|
|
11
|
+
resetActivityContext,
|
|
12
|
+
setActivityContext,
|
|
13
|
+
} from "../../core/activity.js";
|
|
14
|
+
import { hasAnyProjectType } from "../../core/env.js";
|
|
15
|
+
import {
|
|
16
|
+
getTimestamp,
|
|
17
|
+
getTmpDir,
|
|
18
|
+
safeExistsSync,
|
|
19
|
+
safeRmSync,
|
|
20
|
+
} from "../../core/fs.js";
|
|
21
|
+
import { thoughtLog } from "../../core/logger.js";
|
|
22
|
+
import { dirNameStr } from "../../core/paths.js";
|
|
23
|
+
import { CDXGEN_TOOL_GROUP, CDXGEN_TOOL_NAME } from "../../core/state.js";
|
|
24
|
+
import {
|
|
25
|
+
AI_INVENTORY_PROJECT_TYPES,
|
|
26
|
+
matchesAiInventoryExcludeType,
|
|
27
|
+
optionIncludesAiInventoryProjectType,
|
|
28
|
+
} from "../../inventory/aiInventory.js";
|
|
29
|
+
import {
|
|
30
|
+
DEFAULT_CDX_SPEC_VERSION,
|
|
31
|
+
normalizeCycloneDxComponentTypeFilter,
|
|
32
|
+
normalizeCycloneDxSpecVersion,
|
|
33
|
+
} from "../../inventory/bomUtils.js";
|
|
34
|
+
import {
|
|
35
|
+
attachCitations,
|
|
36
|
+
buildInventoryCitation,
|
|
37
|
+
createCitation,
|
|
38
|
+
findCdxgenToolBomRef,
|
|
39
|
+
} from "../../inventory/citations.js";
|
|
40
|
+
import { mergeDependencies, mergeServices } from "../../inventory/depsUtils.js";
|
|
41
|
+
import { addFormulationSection } from "../../inventory/formulationParsers.js";
|
|
42
|
+
import { getContainerFileInventoryStats } from "../../inventory/inventoryStats.js";
|
|
43
|
+
import { enhanceBom } from "../../inventory/licenseEnhancer.js";
|
|
44
|
+
import { applyMcpPinningState } from "../../inventory/mcpPinning.js";
|
|
45
|
+
import { buildReleaseNotesFromGit } from "../../inventory/source.js";
|
|
46
|
+
import { extractTags, findBomType, textualMetadata } from "./annotator.js";
|
|
47
|
+
import { sortBomCollections } from "./sortBom.js";
|
|
48
|
+
import {
|
|
49
|
+
applyComponentTypeFilter,
|
|
50
|
+
applySpecVersionCompatibility,
|
|
51
|
+
} from "./specVersionCompat.js";
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Convert directories to relative dir format carefully avoiding arbitrary relativization for unrelated directories.
|
|
55
|
+
*
|
|
56
|
+
* @param d Directory to convert
|
|
57
|
+
* @param options CLI options
|
|
58
|
+
*
|
|
59
|
+
* @returns {string} Relative directory
|
|
60
|
+
*/
|
|
61
|
+
function relativeDir(d, options) {
|
|
62
|
+
// Container images might have such directories
|
|
63
|
+
if (/^\/(usr|lib|root|bin)/.test(d)) {
|
|
64
|
+
return d;
|
|
65
|
+
}
|
|
66
|
+
const tmpDir = getTmpDir();
|
|
67
|
+
if (d.startsWith(tmpDir)) {
|
|
68
|
+
const rd = relative(tmpDir, d);
|
|
69
|
+
return rd.includes("all-layers") ? rd.split("all-layers").pop() : rd;
|
|
70
|
+
}
|
|
71
|
+
const baseDir = options.filePath || process.cwd();
|
|
72
|
+
if (safeExistsSync(baseDir)) {
|
|
73
|
+
const rdir = relative(baseDir, d);
|
|
74
|
+
return rdir.startsWith(join("..", "..")) ? d : rdir;
|
|
75
|
+
}
|
|
76
|
+
return d;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Attach the CycloneDX formulation section to an already-built BOM JSON object.
|
|
81
|
+
*
|
|
82
|
+
* This is intentionally called once, from {@link postProcess}, so that the
|
|
83
|
+
* formulation section is added exactly once regardless of how many per-language
|
|
84
|
+
* `buildBomNSData` calls were made during BOM generation.
|
|
85
|
+
*
|
|
86
|
+
* @param {Object} bomJson The assembled BOM JSON object (mutated in place).
|
|
87
|
+
* @param {Object} options CLI options.
|
|
88
|
+
* @param {string} filePath File path.
|
|
89
|
+
* @param {Array} [formulationList] Optional language-specific formulation
|
|
90
|
+
* data (e.g. from Pixi) carried on `bomNSData`.
|
|
91
|
+
* @returns {Object} The same `bomJson` with `formulation` populated.
|
|
92
|
+
*/
|
|
93
|
+
function applyFormulation(bomJson, options, filePath, formulationList) {
|
|
94
|
+
if (
|
|
95
|
+
!options.includeFormulation ||
|
|
96
|
+
options.specVersion < 1.5 ||
|
|
97
|
+
!bomJson ||
|
|
98
|
+
bomJson.formulation !== undefined
|
|
99
|
+
) {
|
|
100
|
+
return bomJson;
|
|
101
|
+
}
|
|
102
|
+
const context = formulationList?.length ? { formulationList } : {};
|
|
103
|
+
context.executeOsQuery = options.executeOsQuery;
|
|
104
|
+
setActivityContext({
|
|
105
|
+
bomMutation: "formulation",
|
|
106
|
+
capability: "bom-mutation",
|
|
107
|
+
projectType: "Formulation",
|
|
108
|
+
sourcePath: filePath || options.filePath || process.cwd(),
|
|
109
|
+
});
|
|
110
|
+
let formulationData;
|
|
111
|
+
try {
|
|
112
|
+
formulationData = addFormulationSection(filePath, options, context);
|
|
113
|
+
} finally {
|
|
114
|
+
resetActivityContext();
|
|
115
|
+
}
|
|
116
|
+
if (!formulationData) {
|
|
117
|
+
return bomJson;
|
|
118
|
+
}
|
|
119
|
+
bomJson.formulation = formulationData.formulation;
|
|
120
|
+
const formulationServices = formulationData.formulation.flatMap(
|
|
121
|
+
(entry) => entry?.services || [],
|
|
122
|
+
);
|
|
123
|
+
if (formulationServices.length) {
|
|
124
|
+
bomJson.services = mergeServices(
|
|
125
|
+
bomJson.services || [],
|
|
126
|
+
formulationServices,
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
if (formulationData.dependencies?.length) {
|
|
130
|
+
bomJson.dependencies = mergeDependencies(
|
|
131
|
+
bomJson.dependencies || [],
|
|
132
|
+
formulationData.dependencies,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
return bomJson;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const WEAK_TLP_CLASSIFICATIONS = new Set(["CLEAR", "GREEN", "AMBER"]);
|
|
139
|
+
const SENSITIVE_PROPERTY_NAMES = new Set([
|
|
140
|
+
"cdx:agent:description",
|
|
141
|
+
"cdx:agent:hiddenMcpUrls",
|
|
142
|
+
"cdx:agent:permission",
|
|
143
|
+
"cdx:mcp:command",
|
|
144
|
+
"cdx:mcp:configuredEndpoints",
|
|
145
|
+
"cdx:mcp:description",
|
|
146
|
+
"cdx:mcp:resourceUri",
|
|
147
|
+
"cdx:skill:metadata",
|
|
148
|
+
]);
|
|
149
|
+
const SENSITIVE_PROPERTY_PREFIXES = ["cdx:crewai:", "cdx:mcp:auth:"];
|
|
150
|
+
const SECRET_ASSIGNMENT_PATTERN =
|
|
151
|
+
/(?:^|[\s,{\[])(?:authorization|password|passwd|pwd|token|access[_-]?token|id[_-]?token|refresh[_-]?token|api[_-]?key|client[_-]?secret|secret|session(?:id)?|cookie)\s*(?:[:=]|=>)\s*["'`]?[^"'`\s,}\]]{4,}/iu;
|
|
152
|
+
const ENV_SECRET_PATTERN =
|
|
153
|
+
/\b[A-Z0-9_]*(?:TOKEN|PASSWORD|SECRET|API_KEY|CLIENT_SECRET|SESSION|COOKIE)[A-Z0-9_]*=\S+/u;
|
|
154
|
+
const AUTH_HEADER_PATTERN =
|
|
155
|
+
/\bAuthorization\s*:\s*(?:Bearer|Basic)\s+[A-Za-z0-9._~+/=-]{8,}/iu;
|
|
156
|
+
const BEARER_TOKEN_PATTERN = /\b(?:Bearer|Basic)\s+[A-Za-z0-9._~+/=-]{12,}/u;
|
|
157
|
+
const PRIVATE_KEY_PATTERN =
|
|
158
|
+
/-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/u;
|
|
159
|
+
const SIGNED_URL_PARAM_NAMES = new Set([
|
|
160
|
+
"access_token",
|
|
161
|
+
"api_key",
|
|
162
|
+
"client_secret",
|
|
163
|
+
"id_token",
|
|
164
|
+
"signature",
|
|
165
|
+
"sig",
|
|
166
|
+
"token",
|
|
167
|
+
"x-amz-signature",
|
|
168
|
+
"x-goog-signature",
|
|
169
|
+
]);
|
|
170
|
+
|
|
171
|
+
function normalizeTlpClassification(tlpClassification) {
|
|
172
|
+
return String(tlpClassification || "")
|
|
173
|
+
.trim()
|
|
174
|
+
.toUpperCase();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function hasSensitivePropertyName(propertyName) {
|
|
178
|
+
if (SENSITIVE_PROPERTY_NAMES.has(propertyName)) {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
return SENSITIVE_PROPERTY_PREFIXES.some((prefix) =>
|
|
182
|
+
propertyName.startsWith(prefix),
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function extractUrlCandidates(value) {
|
|
187
|
+
return Array.from(value.matchAll(/https?:\/\/[^\s]+/gu), (match) =>
|
|
188
|
+
match[0].replace(/[),.;]+$/u, ""),
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function hasSensitiveUrlValue(value) {
|
|
193
|
+
for (const candidate of extractUrlCandidates(value)) {
|
|
194
|
+
if (!URL.canParse(candidate)) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const parsedUrl = new URL(candidate);
|
|
198
|
+
if (parsedUrl.username || parsedUrl.password || parsedUrl.hash) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
for (const [paramName] of parsedUrl.searchParams) {
|
|
202
|
+
if (SIGNED_URL_PARAM_NAMES.has(paramName.toLowerCase())) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function hasKnownSensitiveText(value) {
|
|
211
|
+
return (
|
|
212
|
+
SECRET_ASSIGNMENT_PATTERN.test(value) ||
|
|
213
|
+
ENV_SECRET_PATTERN.test(value) ||
|
|
214
|
+
AUTH_HEADER_PATTERN.test(value) ||
|
|
215
|
+
BEARER_TOKEN_PATTERN.test(value) ||
|
|
216
|
+
PRIVATE_KEY_PATTERN.test(value)
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function propertyContainsSensitiveValue(propertyName, propertyValue) {
|
|
221
|
+
if (!hasSensitivePropertyName(propertyName) || !propertyValue?.trim()) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
return (
|
|
225
|
+
hasSensitiveUrlValue(propertyValue) || hasKnownSensitiveText(propertyValue)
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function collectSensitivePropertyViolations(
|
|
230
|
+
subject,
|
|
231
|
+
violations = [],
|
|
232
|
+
location = "bom",
|
|
233
|
+
seen = new Set(),
|
|
234
|
+
) {
|
|
235
|
+
if (!subject || typeof subject !== "object" || seen.has(subject)) {
|
|
236
|
+
return violations;
|
|
237
|
+
}
|
|
238
|
+
seen.add(subject);
|
|
239
|
+
if (Array.isArray(subject.properties)) {
|
|
240
|
+
const subjectLabel = subject["bom-ref"] || subject.name || location;
|
|
241
|
+
for (const property of subject.properties) {
|
|
242
|
+
if (
|
|
243
|
+
typeof property?.name === "string" &&
|
|
244
|
+
typeof property?.value === "string" &&
|
|
245
|
+
propertyContainsSensitiveValue(property.name, property.value)
|
|
246
|
+
) {
|
|
247
|
+
violations.push({
|
|
248
|
+
propertyName: property.name,
|
|
249
|
+
subjectLabel,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (Array.isArray(subject)) {
|
|
255
|
+
subject.forEach((entry, index) => {
|
|
256
|
+
collectSensitivePropertyViolations(
|
|
257
|
+
entry,
|
|
258
|
+
violations,
|
|
259
|
+
`${location}[${index}]`,
|
|
260
|
+
seen,
|
|
261
|
+
);
|
|
262
|
+
});
|
|
263
|
+
return violations;
|
|
264
|
+
}
|
|
265
|
+
for (const [key, value] of Object.entries(subject)) {
|
|
266
|
+
if (key === "properties") {
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
collectSensitivePropertyViolations(
|
|
270
|
+
value,
|
|
271
|
+
violations,
|
|
272
|
+
`${location}.${key}`,
|
|
273
|
+
seen,
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
return violations;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function validateTlpClassification(bomJson, options) {
|
|
280
|
+
const specVersion =
|
|
281
|
+
normalizeCycloneDxSpecVersion(
|
|
282
|
+
bomJson?.specVersion || options?.specVersion,
|
|
283
|
+
) || 0;
|
|
284
|
+
if (specVersion < 1.7) {
|
|
285
|
+
return bomJson;
|
|
286
|
+
}
|
|
287
|
+
const tlpClassification = normalizeTlpClassification(
|
|
288
|
+
bomJson?.metadata?.distributionConstraints?.tlp ||
|
|
289
|
+
bomJson?.metadata?.distribution ||
|
|
290
|
+
options?.tlpClassification,
|
|
291
|
+
);
|
|
292
|
+
if (!WEAK_TLP_CLASSIFICATIONS.has(tlpClassification)) {
|
|
293
|
+
return bomJson;
|
|
294
|
+
}
|
|
295
|
+
const violations = collectSensitivePropertyViolations(bomJson);
|
|
296
|
+
if (!violations.length) {
|
|
297
|
+
return bomJson;
|
|
298
|
+
}
|
|
299
|
+
const uniqueViolations = [
|
|
300
|
+
...new Set(
|
|
301
|
+
violations.map(
|
|
302
|
+
({ propertyName, subjectLabel }) =>
|
|
303
|
+
`${propertyName} on ${subjectLabel}`,
|
|
304
|
+
),
|
|
305
|
+
),
|
|
306
|
+
];
|
|
307
|
+
const errorMessage =
|
|
308
|
+
`CycloneDX 1.7+ BOMs with TLP classification '${tlpClassification}' must not include known sensitive property values. ` +
|
|
309
|
+
"Redact the values or raise the TLP classification to AMBER_AND_STRICT or RED. " +
|
|
310
|
+
`Found: ${uniqueViolations.slice(0, 5).join("; ")}${uniqueViolations.length > 5 ? `; and ${uniqueViolations.length - 5} more` : ""}`;
|
|
311
|
+
if (options?.failOnError) {
|
|
312
|
+
throw new Error(errorMessage);
|
|
313
|
+
}
|
|
314
|
+
console.warn(errorMessage);
|
|
315
|
+
return bomJson;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function applyContainerInventoryMetadata(bomJson) {
|
|
319
|
+
if (!bomJson?.metadata) {
|
|
320
|
+
return bomJson;
|
|
321
|
+
}
|
|
322
|
+
const { unpackagedExecutableCount, unpackagedSharedLibraryCount } =
|
|
323
|
+
getContainerFileInventoryStats(bomJson.components);
|
|
324
|
+
const metadataProperties = Array.isArray(bomJson.metadata.properties)
|
|
325
|
+
? [...bomJson.metadata.properties]
|
|
326
|
+
: [];
|
|
327
|
+
const propertyNamesToReplace = new Set([
|
|
328
|
+
"cdx:container:unpackagedExecutableCount",
|
|
329
|
+
"cdx:container:unpackagedSharedLibraryCount",
|
|
330
|
+
]);
|
|
331
|
+
const retainedProperties = metadataProperties.filter(
|
|
332
|
+
(property) => !propertyNamesToReplace.has(property?.name),
|
|
333
|
+
);
|
|
334
|
+
if (
|
|
335
|
+
unpackagedExecutableCount ||
|
|
336
|
+
metadataProperties.some(
|
|
337
|
+
(property) =>
|
|
338
|
+
property?.name === "cdx:container:unpackagedExecutableCount",
|
|
339
|
+
)
|
|
340
|
+
) {
|
|
341
|
+
retainedProperties.push({
|
|
342
|
+
name: "cdx:container:unpackagedExecutableCount",
|
|
343
|
+
value: String(unpackagedExecutableCount),
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
if (
|
|
347
|
+
unpackagedSharedLibraryCount ||
|
|
348
|
+
metadataProperties.some(
|
|
349
|
+
(property) =>
|
|
350
|
+
property?.name === "cdx:container:unpackagedSharedLibraryCount",
|
|
351
|
+
)
|
|
352
|
+
) {
|
|
353
|
+
retainedProperties.push({
|
|
354
|
+
name: "cdx:container:unpackagedSharedLibraryCount",
|
|
355
|
+
value: String(unpackagedSharedLibraryCount),
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
if (retainedProperties.length) {
|
|
359
|
+
bomJson.metadata.properties = retainedProperties;
|
|
360
|
+
}
|
|
361
|
+
return bomJson;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Assemble CycloneDX 1.7 citations from the provenance that cdxgen already
|
|
366
|
+
* holds. Citations are emitted only at spec version 1.7 and above; the
|
|
367
|
+
* downgrade path strips them for older documents.
|
|
368
|
+
*
|
|
369
|
+
* Two honest attribution sources are wired here:
|
|
370
|
+
* - the component inventory is attributed to the cdxgen tool component, and
|
|
371
|
+
* - when `--bom-audit` produced findings, the audit properties are attributed
|
|
372
|
+
* to the cdxgen tool with a note naming the rule engine.
|
|
373
|
+
*
|
|
374
|
+
* Additional provenance (embedded SBOMs, TEA collections, MCP server artefacts)
|
|
375
|
+
* is appended via the per-stage `bomNSData.citations` channel by collectors.
|
|
376
|
+
*
|
|
377
|
+
* @param {Object} bomJson CycloneDX BOM
|
|
378
|
+
* @param {Object} options CLI options
|
|
379
|
+
* @param {Object[]} [extraCitations] Citations produced by per-stage collectors
|
|
380
|
+
* @returns {Object} The mutated BOM
|
|
381
|
+
*/
|
|
382
|
+
function applyCitations(bomJson, options = {}, extraCitations = []) {
|
|
383
|
+
if (!bomJson) {
|
|
384
|
+
return bomJson;
|
|
385
|
+
}
|
|
386
|
+
const specVersion = options.specVersion || bomJson.specVersion;
|
|
387
|
+
if (!specVersion || Number(specVersion) < 1.7) {
|
|
388
|
+
return bomJson;
|
|
389
|
+
}
|
|
390
|
+
const citations = [];
|
|
391
|
+
const inventoryCitation = buildInventoryCitation(bomJson);
|
|
392
|
+
if (inventoryCitation) {
|
|
393
|
+
citations.push(inventoryCitation);
|
|
394
|
+
}
|
|
395
|
+
const auditCitation = buildAuditFindingsCitation(bomJson);
|
|
396
|
+
if (auditCitation) {
|
|
397
|
+
citations.push(auditCitation);
|
|
398
|
+
}
|
|
399
|
+
for (const citation of Array.isArray(extraCitations) ? extraCitations : []) {
|
|
400
|
+
if (citation) {
|
|
401
|
+
citations.push(citation);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return attachCitations(bomJson, citations, options);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Build a citation for the `cdx:audit:*` properties emitted by the BOM audit
|
|
409
|
+
* rule engine. The data source is cdxgen's own rule packs under data/rules.
|
|
410
|
+
*
|
|
411
|
+
* @param {Object} bomJson CycloneDX BOM
|
|
412
|
+
* @returns {Object|null} A citation, or null when no audit properties are present
|
|
413
|
+
*/
|
|
414
|
+
function buildAuditFindingsCitation(bomJson) {
|
|
415
|
+
const hasAuditProperties =
|
|
416
|
+
Array.isArray(bomJson.components) &&
|
|
417
|
+
bomJson.components.some(
|
|
418
|
+
(component) =>
|
|
419
|
+
Array.isArray(component?.properties) &&
|
|
420
|
+
component.properties.some((property) =>
|
|
421
|
+
property?.name?.startsWith("cdx:audit:"),
|
|
422
|
+
),
|
|
423
|
+
);
|
|
424
|
+
if (!hasAuditProperties) {
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
const attributedTo = findCdxgenToolBomRef(bomJson);
|
|
428
|
+
if (!attributedTo) {
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
431
|
+
return createCitation({
|
|
432
|
+
expressions: ["$.components[*].properties[?(@.name =~ /^cdx:audit:/)]"],
|
|
433
|
+
attributedTo,
|
|
434
|
+
note: "Audit findings attributed to the cdxgen BOM audit rule engine.",
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Filter and enhance BOM post generation.
|
|
440
|
+
*
|
|
441
|
+
* @param {Object} bomNSData BOM with namespaces object
|
|
442
|
+
* @param {Object} options CLI options
|
|
443
|
+
* @param {string} [filePath] Source path used for formulation and metadata context
|
|
444
|
+
*
|
|
445
|
+
* @returns {Object} Modified bomNSData
|
|
446
|
+
*/
|
|
447
|
+
export function postProcess(bomNSData, options, filePath) {
|
|
448
|
+
let jsonPayload = bomNSData.bomJson;
|
|
449
|
+
if (
|
|
450
|
+
typeof bomNSData.bomJson === "string" ||
|
|
451
|
+
bomNSData.bomJson instanceof String
|
|
452
|
+
) {
|
|
453
|
+
jsonPayload = JSON.parse(bomNSData.bomJson);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
bomNSData.bomJson = filterBom(jsonPayload, options);
|
|
457
|
+
bomNSData.bomJson = applyStandards(bomNSData.bomJson, options);
|
|
458
|
+
bomNSData.bomJson = applyMetadata(bomNSData.bomJson, options);
|
|
459
|
+
bomNSData.bomJson = applyLicenseEnhancement(bomNSData.bomJson, options);
|
|
460
|
+
bomNSData.bomJson = applyContainerInventoryMetadata(bomNSData.bomJson);
|
|
461
|
+
bomNSData.bomJson = applyFormulation(
|
|
462
|
+
bomNSData.bomJson,
|
|
463
|
+
options,
|
|
464
|
+
filePath,
|
|
465
|
+
bomNSData.formulationList,
|
|
466
|
+
);
|
|
467
|
+
bomNSData.bomJson = applyReleaseNotes(bomNSData.bomJson, options, filePath);
|
|
468
|
+
bomNSData.bomJson = applyComponentTypeFilter(bomNSData.bomJson, options);
|
|
469
|
+
bomNSData.bomJson = applySpecVersionCompatibility(bomNSData.bomJson, options);
|
|
470
|
+
bomNSData.bomJson = validateTlpClassification(bomNSData.bomJson, options);
|
|
471
|
+
// Support for automatic annotations
|
|
472
|
+
if (options.specVersion >= 1.6) {
|
|
473
|
+
setActivityContext({
|
|
474
|
+
bomMutation: "annotations",
|
|
475
|
+
capability: "bom-mutation",
|
|
476
|
+
projectType: "Annotations",
|
|
477
|
+
sourcePath: filePath || options.filePath || process.cwd(),
|
|
478
|
+
});
|
|
479
|
+
try {
|
|
480
|
+
bomNSData.bomJson = annotate(bomNSData.bomJson, options);
|
|
481
|
+
} finally {
|
|
482
|
+
resetActivityContext();
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
// Experimental MCP server pinning/composition enrichment. Gated by an
|
|
486
|
+
// off-by-default flag; returns citation hints that applyCitations merges in.
|
|
487
|
+
const mcpPinningCitations = applyMcpPinningState(bomNSData.bomJson, options);
|
|
488
|
+
// CycloneDX 1.7 citations record where each attributed assertion came from.
|
|
489
|
+
// Attached after spec-version compatibility so a 1.6 downgrade never carries
|
|
490
|
+
// a 1.7-only root element, and after annotations so audit findings can be cited.
|
|
491
|
+
bomNSData.bomJson = applyCitations(bomNSData.bomJson, options, [
|
|
492
|
+
...(mcpPinningCitations || []),
|
|
493
|
+
...(bomNSData.citations || []),
|
|
494
|
+
]);
|
|
495
|
+
cleanupEnv(options);
|
|
496
|
+
cleanupTmpDir();
|
|
497
|
+
sortBomCollections(bomNSData.bomJson);
|
|
498
|
+
return bomNSData;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
function applyLicenseEnhancement(bomJson, options) {
|
|
502
|
+
const licenseEnhance =
|
|
503
|
+
options?.licenseEnhance !== false &&
|
|
504
|
+
readEnvironmentVariable("CDXGEN_LICENSE_ENHANCE") !== "false";
|
|
505
|
+
if (!licenseEnhance || !bomJson) {
|
|
506
|
+
return bomJson;
|
|
507
|
+
}
|
|
508
|
+
const licensePolicy =
|
|
509
|
+
options?.licensePolicy || readEnvironmentVariable("CDXGEN_LICENSE_POLICY");
|
|
510
|
+
enhanceBom(bomJson, {
|
|
511
|
+
licenseEnrich:
|
|
512
|
+
options?.licenseEnrich !== false &&
|
|
513
|
+
readEnvironmentVariable("CDXGEN_LICENSE_ENRICH") !== "false",
|
|
514
|
+
licensePolicy,
|
|
515
|
+
licenseRef:
|
|
516
|
+
options?.licenseRef ||
|
|
517
|
+
readEnvironmentVariable("CDXGEN_LICENSE_REF") === "true",
|
|
518
|
+
specVersion: options?.specVersion || bomJson.specVersion,
|
|
519
|
+
});
|
|
520
|
+
// When a policy is supplied, surface any prohibited (error-level) licenses.
|
|
521
|
+
// With --fail-on-error this aborts BOM generation; otherwise it warns.
|
|
522
|
+
if (licensePolicy) {
|
|
523
|
+
const violations = collectLicensePolicyViolations(bomJson);
|
|
524
|
+
if (violations.length) {
|
|
525
|
+
const shown = violations.slice(0, 5).join("; ");
|
|
526
|
+
const errorMessage =
|
|
527
|
+
`License policy violation: ${violations.length} component(s) use a prohibited license. ` +
|
|
528
|
+
`Found: ${shown}${violations.length > 5 ? `; and ${violations.length - 5} more` : ""}`;
|
|
529
|
+
if (options?.failOnError) {
|
|
530
|
+
throw new Error(errorMessage);
|
|
531
|
+
}
|
|
532
|
+
console.warn(errorMessage);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
return bomJson;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Collects the identifiers of components whose licenses violate the configured
|
|
540
|
+
* policy, i.e. carry a `cdx:license:complianceAlert` property set to `error`.
|
|
541
|
+
*
|
|
542
|
+
* @param {Object} bomJson CycloneDX BOM
|
|
543
|
+
* @returns {string[]} Sorted, de-duplicated component identifiers
|
|
544
|
+
*/
|
|
545
|
+
function collectLicensePolicyViolations(bomJson) {
|
|
546
|
+
const violations = new Set();
|
|
547
|
+
const hasErrorAlert = (properties) =>
|
|
548
|
+
Array.isArray(properties) &&
|
|
549
|
+
properties.some(
|
|
550
|
+
(p) => p.name === "cdx:license:complianceAlert" && p.value === "error",
|
|
551
|
+
);
|
|
552
|
+
const visit = (component) => {
|
|
553
|
+
if (!component) {
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
if (hasErrorAlert(component.properties)) {
|
|
557
|
+
violations.add(
|
|
558
|
+
component.purl || component["bom-ref"] || component.name || "unknown",
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
for (const sub of component.components || []) {
|
|
562
|
+
visit(sub);
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
visit(bomJson?.metadata?.component);
|
|
566
|
+
for (const component of bomJson?.components || []) {
|
|
567
|
+
visit(component);
|
|
568
|
+
}
|
|
569
|
+
return [...violations].sort();
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
function applyReleaseNotes(bomJson, options, filePath) {
|
|
573
|
+
if (!options?.includeReleaseNotes) {
|
|
574
|
+
return bomJson;
|
|
575
|
+
}
|
|
576
|
+
const specVersion = Number(options.specVersion || DEFAULT_CDX_SPEC_VERSION);
|
|
577
|
+
if (specVersion < 1.6) {
|
|
578
|
+
const errorMessage =
|
|
579
|
+
"releaseNotes in metadata.tools.components requires CycloneDX spec version 1.6 or above.";
|
|
580
|
+
if (options.failOnError) {
|
|
581
|
+
throw new Error(errorMessage);
|
|
582
|
+
}
|
|
583
|
+
console.warn(errorMessage);
|
|
584
|
+
return bomJson;
|
|
585
|
+
}
|
|
586
|
+
const toolComponents = bomJson?.metadata?.tools?.components;
|
|
587
|
+
if (!Array.isArray(toolComponents) || !toolComponents.length) {
|
|
588
|
+
return bomJson;
|
|
589
|
+
}
|
|
590
|
+
const cdxgenToolComponent = toolComponents.find(
|
|
591
|
+
(comp) =>
|
|
592
|
+
comp?.group === CDXGEN_TOOL_GROUP && comp?.name === CDXGEN_TOOL_NAME,
|
|
593
|
+
);
|
|
594
|
+
if (!cdxgenToolComponent) {
|
|
595
|
+
return bomJson;
|
|
596
|
+
}
|
|
597
|
+
const releaseNotes = buildReleaseNotesFromGit(filePath, options);
|
|
598
|
+
if (!releaseNotes) {
|
|
599
|
+
const errorMessage =
|
|
600
|
+
"Unable to compute release notes. Provide --release-notes-current-tag and optionally --release-notes-previous-tag.";
|
|
601
|
+
if (options.failOnError) {
|
|
602
|
+
throw new Error(errorMessage);
|
|
603
|
+
}
|
|
604
|
+
console.warn(errorMessage);
|
|
605
|
+
return bomJson;
|
|
606
|
+
}
|
|
607
|
+
cdxgenToolComponent.releaseNotes = releaseNotes;
|
|
608
|
+
return bomJson;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Apply additional metadata based on components
|
|
613
|
+
*
|
|
614
|
+
* @param {Object} bomJson BOM JSON Object
|
|
615
|
+
* @param {Object} options CLI options
|
|
616
|
+
*
|
|
617
|
+
* @returns {Object} Filtered BOM JSON
|
|
618
|
+
*/
|
|
619
|
+
export function applyMetadata(bomJson, options) {
|
|
620
|
+
if (!bomJson?.components) {
|
|
621
|
+
return bomJson;
|
|
622
|
+
}
|
|
623
|
+
const bomPkgTypes = new Set();
|
|
624
|
+
const bomPkgNamespaces = new Set();
|
|
625
|
+
const bomSrcFiles = new Set();
|
|
626
|
+
for (const comp of bomJson.components) {
|
|
627
|
+
if (comp.purl) {
|
|
628
|
+
try {
|
|
629
|
+
const purlObj = Purl.parse(comp.purl);
|
|
630
|
+
if (purlObj?.type) {
|
|
631
|
+
bomPkgTypes.add(purlObj.type);
|
|
632
|
+
}
|
|
633
|
+
if (purlObj?.namespace) {
|
|
634
|
+
bomPkgNamespaces.add(purlObj.namespace);
|
|
635
|
+
}
|
|
636
|
+
} catch (_e) {
|
|
637
|
+
// ignore
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
if (comp.properties) {
|
|
641
|
+
for (const aprop of comp.properties) {
|
|
642
|
+
if (aprop.name === "internal:SrcFile" && aprop.value) {
|
|
643
|
+
const rdir = relativeDir(aprop.value, options);
|
|
644
|
+
if (comp.type !== "file") {
|
|
645
|
+
bomSrcFiles.add(rdir);
|
|
646
|
+
}
|
|
647
|
+
// Fix the filename to use relative directory
|
|
648
|
+
if (rdir !== aprop.value) {
|
|
649
|
+
aprop.value = rdir;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
if (comp?.evidence?.identity && Array.isArray(comp.evidence.identity)) {
|
|
655
|
+
for (const aidentityEvidence of comp.evidence.identity) {
|
|
656
|
+
if (aidentityEvidence.concludedValue) {
|
|
657
|
+
const rdir = relativeDir(aidentityEvidence.concludedValue, options);
|
|
658
|
+
if (comp.type !== "file") {
|
|
659
|
+
bomSrcFiles.add(rdir);
|
|
660
|
+
}
|
|
661
|
+
if (rdir !== aidentityEvidence.concludedValue) {
|
|
662
|
+
aidentityEvidence.concludedValue = rdir;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
if (
|
|
666
|
+
aidentityEvidence.methods &&
|
|
667
|
+
Array.isArray(aidentityEvidence.methods)
|
|
668
|
+
) {
|
|
669
|
+
for (const amethod of aidentityEvidence.methods) {
|
|
670
|
+
const rdir = relativeDir(amethod.value, options);
|
|
671
|
+
if (
|
|
672
|
+
comp.type !== "file" &&
|
|
673
|
+
["manifest-analysis"].includes(amethod.technique) &&
|
|
674
|
+
amethod.value
|
|
675
|
+
) {
|
|
676
|
+
bomSrcFiles.add(rdir);
|
|
677
|
+
}
|
|
678
|
+
// Fix the filename to use relative directory
|
|
679
|
+
if (rdir !== amethod.value) {
|
|
680
|
+
amethod.value = rdir;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
if (!bomJson.metadata.properties) {
|
|
688
|
+
bomJson.metadata.properties = [];
|
|
689
|
+
}
|
|
690
|
+
if (bomPkgTypes.size) {
|
|
691
|
+
const componentTypesArray = Array.from(bomPkgTypes).sort();
|
|
692
|
+
// Check if cdx:bom:componentTypes property already exists
|
|
693
|
+
const existingTypesProperty = bomJson.metadata.properties.find(
|
|
694
|
+
(p) => p.name === "cdx:bom:componentTypes",
|
|
695
|
+
);
|
|
696
|
+
if (!existingTypesProperty) {
|
|
697
|
+
bomJson.metadata.properties.push({
|
|
698
|
+
name: "cdx:bom:componentTypes",
|
|
699
|
+
value: componentTypesArray.join("\\n"),
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
if (componentTypesArray.length > 1) {
|
|
703
|
+
thoughtLog(
|
|
704
|
+
`BOM includes the ${componentTypesArray.length} component types: ${componentTypesArray.join(", ")}`,
|
|
705
|
+
);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
if (bomPkgNamespaces.size) {
|
|
709
|
+
// Check if cdx:bom:componentNamespaces property already exists
|
|
710
|
+
const existingNamespacesProperty = bomJson.metadata.properties.find(
|
|
711
|
+
(p) => p.name === "cdx:bom:componentNamespaces",
|
|
712
|
+
);
|
|
713
|
+
if (!existingNamespacesProperty) {
|
|
714
|
+
bomJson.metadata.properties.push({
|
|
715
|
+
name: "cdx:bom:componentNamespaces",
|
|
716
|
+
value: Array.from(bomPkgNamespaces).sort().join("\\n"),
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
if (bomSrcFiles.size) {
|
|
721
|
+
const bomSrcFilesArray = Array.from(bomSrcFiles).sort();
|
|
722
|
+
// Check if cdx:bom:componentSrcFiles property already exists
|
|
723
|
+
const existingSrcFilesProperty = bomJson.metadata.properties.find(
|
|
724
|
+
(p) => p.name === "cdx:bom:componentSrcFiles",
|
|
725
|
+
);
|
|
726
|
+
if (!existingSrcFilesProperty) {
|
|
727
|
+
bomJson.metadata.properties.push({
|
|
728
|
+
name: "cdx:bom:componentSrcFiles",
|
|
729
|
+
value: bomSrcFilesArray.join("\\n"),
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
if (bomSrcFilesArray.length > 1 && bomSrcFilesArray.length < 5) {
|
|
733
|
+
thoughtLog(
|
|
734
|
+
`BOM includes information from ${bomSrcFilesArray.length} manifest files: ${bomSrcFilesArray.join(", ")}`,
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
} else {
|
|
738
|
+
if (!bomPkgTypes.has("oci")) {
|
|
739
|
+
thoughtLog("BOM lacks package manifest details. Please help us improve!");
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
return bomJson;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Apply definitions.standards based on options
|
|
747
|
+
*
|
|
748
|
+
* @param {Object} bomJson BOM JSON Object
|
|
749
|
+
* @param {Object} options CLI options
|
|
750
|
+
*
|
|
751
|
+
* @returns {Object} Filtered BOM JSON
|
|
752
|
+
*/
|
|
753
|
+
export function applyStandards(bomJson, options) {
|
|
754
|
+
if (options.standard && Array.isArray(options.standard)) {
|
|
755
|
+
for (let astandard of options.standard) {
|
|
756
|
+
// See issue: #1953
|
|
757
|
+
if (astandard.includes(sep)) {
|
|
758
|
+
astandard = basename(astandard);
|
|
759
|
+
}
|
|
760
|
+
const templateFile = join(
|
|
761
|
+
dirNameStr,
|
|
762
|
+
"data",
|
|
763
|
+
"templates",
|
|
764
|
+
`${astandard}.cdx.json`,
|
|
765
|
+
);
|
|
766
|
+
if (safeExistsSync(templateFile)) {
|
|
767
|
+
const templateData = JSON.parse(readFileSync(templateFile, "utf-8"));
|
|
768
|
+
if (templateData?.metadata?.licenses) {
|
|
769
|
+
if (!bomJson.metadata.licenses) {
|
|
770
|
+
bomJson.metadata.licenses = [];
|
|
771
|
+
}
|
|
772
|
+
bomJson.metadata.licenses = bomJson.metadata.licenses.concat(
|
|
773
|
+
templateData.metadata.licenses,
|
|
774
|
+
);
|
|
775
|
+
}
|
|
776
|
+
if (templateData?.definitions?.standards) {
|
|
777
|
+
if (!bomJson.definitions) {
|
|
778
|
+
bomJson.definitions = { standards: [] };
|
|
779
|
+
}
|
|
780
|
+
bomJson.definitions.standards = bomJson.definitions.standards.concat(
|
|
781
|
+
templateData.definitions.standards,
|
|
782
|
+
);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
return bomJson;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* Method to normalize the identity field from a component's evidence block.
|
|
792
|
+
*
|
|
793
|
+
* In different versions of CycloneDX, the `identity` field can be either a single object or an array of objects.
|
|
794
|
+
* This function ensures that the result is always an array for consistent processing.
|
|
795
|
+
*
|
|
796
|
+
* @param {Object} comp - The component object potentially containing evidence.identity.
|
|
797
|
+
* @returns {Array} An array of identity objects (empty if none are present).
|
|
798
|
+
*/
|
|
799
|
+
function normalizeIdentities(comp) {
|
|
800
|
+
const identity = comp?.evidence?.identity;
|
|
801
|
+
if (Array.isArray(identity)) {
|
|
802
|
+
return identity;
|
|
803
|
+
}
|
|
804
|
+
if (identity) {
|
|
805
|
+
return [identity];
|
|
806
|
+
}
|
|
807
|
+
return [];
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* Method to get the purl identity confidence.
|
|
812
|
+
*
|
|
813
|
+
* @param comp Component
|
|
814
|
+
* @returns {undefined|number} Max of all the available purl identity confidence or undefined
|
|
815
|
+
*/
|
|
816
|
+
function getIdentityConfidence(comp) {
|
|
817
|
+
if (!comp.evidence) {
|
|
818
|
+
return undefined;
|
|
819
|
+
}
|
|
820
|
+
let confidence;
|
|
821
|
+
for (const aidentity of normalizeIdentities(comp)) {
|
|
822
|
+
if (aidentity?.field === "purl") {
|
|
823
|
+
if (confidence === undefined) {
|
|
824
|
+
confidence = aidentity.confidence || 0;
|
|
825
|
+
} else {
|
|
826
|
+
confidence = Math.max(aidentity.confidence, confidence);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
return confidence;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
/**
|
|
834
|
+
* Method to get the list of techniques used for identity.
|
|
835
|
+
*
|
|
836
|
+
* @param comp Component
|
|
837
|
+
* @returns {Set|undefined} Set of technique. evidence.identity.methods.technique
|
|
838
|
+
*/
|
|
839
|
+
function getIdentityTechniques(comp) {
|
|
840
|
+
if (!comp.evidence) {
|
|
841
|
+
return undefined;
|
|
842
|
+
}
|
|
843
|
+
const techniques = new Set();
|
|
844
|
+
for (const aidentity of normalizeIdentities(comp)) {
|
|
845
|
+
if (aidentity?.field === "purl") {
|
|
846
|
+
for (const amethod of aidentity.methods || []) {
|
|
847
|
+
techniques.add(amethod?.technique);
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
return techniques;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/**
|
|
855
|
+
* Filter BOM based on options
|
|
856
|
+
*
|
|
857
|
+
* @param {Object} bomJson BOM JSON Object
|
|
858
|
+
* @param {Object} options CLI options
|
|
859
|
+
*
|
|
860
|
+
* @returns {Object} Filtered BOM JSON
|
|
861
|
+
*/
|
|
862
|
+
export function filterBom(bomJson, options) {
|
|
863
|
+
const newPkgMap = {};
|
|
864
|
+
const newServices = [];
|
|
865
|
+
let filtered = false;
|
|
866
|
+
let anyFiltered = false;
|
|
867
|
+
if (!bomJson?.components) {
|
|
868
|
+
return bomJson;
|
|
869
|
+
}
|
|
870
|
+
const allowedComponentTypes = new Set(
|
|
871
|
+
normalizeCycloneDxComponentTypeFilter(options?.componentType),
|
|
872
|
+
);
|
|
873
|
+
for (const comp of bomJson.components) {
|
|
874
|
+
if (shouldExcludeInventoryType(comp, options)) {
|
|
875
|
+
filtered = true;
|
|
876
|
+
continue;
|
|
877
|
+
}
|
|
878
|
+
if (
|
|
879
|
+
allowedComponentTypes.size &&
|
|
880
|
+
(!comp.type || !allowedComponentTypes.has(comp.type))
|
|
881
|
+
) {
|
|
882
|
+
filtered = true;
|
|
883
|
+
continue;
|
|
884
|
+
}
|
|
885
|
+
// minimum confidence filter
|
|
886
|
+
if (options?.minConfidence > 0) {
|
|
887
|
+
const confidence = Math.min(options.minConfidence, 1);
|
|
888
|
+
const identityConfidence = getIdentityConfidence(comp);
|
|
889
|
+
if (identityConfidence !== undefined && identityConfidence < confidence) {
|
|
890
|
+
filtered = true;
|
|
891
|
+
continue;
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
// identity technique filter
|
|
895
|
+
if (options?.technique?.length && !options.technique.includes("auto")) {
|
|
896
|
+
const allowedTechniques = new Set(
|
|
897
|
+
Array.isArray(options.technique)
|
|
898
|
+
? options.technique
|
|
899
|
+
: [options.technique],
|
|
900
|
+
);
|
|
901
|
+
const usedTechniques = getIdentityTechniques(comp);
|
|
902
|
+
if (
|
|
903
|
+
usedTechniques &&
|
|
904
|
+
// `intersection` is a Set prototype method; there is no static
|
|
905
|
+
// `Set.intersection`, so the old form threw whenever `--technique` was
|
|
906
|
+
// passed with anything other than `auto`.
|
|
907
|
+
usedTechniques.intersection(allowedTechniques).size === 0
|
|
908
|
+
) {
|
|
909
|
+
filtered = true;
|
|
910
|
+
continue;
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
if (
|
|
914
|
+
options.requiredOnly &&
|
|
915
|
+
comp.scope &&
|
|
916
|
+
["optional", "excluded"].includes(comp.scope)
|
|
917
|
+
) {
|
|
918
|
+
filtered = true;
|
|
919
|
+
} else if (options.only?.length) {
|
|
920
|
+
const componentPurl = comp.purl?.toLowerCase?.() || "";
|
|
921
|
+
if (!Array.isArray(options.only)) {
|
|
922
|
+
options.only = [options.only];
|
|
923
|
+
}
|
|
924
|
+
// See issue: #1962
|
|
925
|
+
let purlfiltered = true;
|
|
926
|
+
for (const filterstr of options.only) {
|
|
927
|
+
if (
|
|
928
|
+
filterstr.length &&
|
|
929
|
+
componentPurl.includes(filterstr.toLowerCase())
|
|
930
|
+
) {
|
|
931
|
+
filtered = true;
|
|
932
|
+
purlfiltered = false;
|
|
933
|
+
break;
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
if (!purlfiltered) {
|
|
937
|
+
newPkgMap[comp["bom-ref"]] = comp;
|
|
938
|
+
}
|
|
939
|
+
} else if (options.filter?.length) {
|
|
940
|
+
if (!Array.isArray(options.filter)) {
|
|
941
|
+
options.filter = [options.filter];
|
|
942
|
+
}
|
|
943
|
+
let purlfiltered = false;
|
|
944
|
+
const componentPurl = comp.purl?.toLowerCase?.() || "";
|
|
945
|
+
for (const filterstr of options.filter) {
|
|
946
|
+
// Check the purl
|
|
947
|
+
if (
|
|
948
|
+
filterstr.length &&
|
|
949
|
+
componentPurl.includes(filterstr.toLowerCase())
|
|
950
|
+
) {
|
|
951
|
+
filtered = true;
|
|
952
|
+
purlfiltered = true;
|
|
953
|
+
continue;
|
|
954
|
+
}
|
|
955
|
+
// Look for any properties value matching the string
|
|
956
|
+
const properties = comp.properties || [];
|
|
957
|
+
for (const aprop of properties) {
|
|
958
|
+
if (
|
|
959
|
+
filterstr.length &&
|
|
960
|
+
aprop?.value?.toLowerCase().includes(filterstr.toLowerCase())
|
|
961
|
+
) {
|
|
962
|
+
filtered = true;
|
|
963
|
+
purlfiltered = true;
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
if (!purlfiltered) {
|
|
968
|
+
newPkgMap[comp["bom-ref"]] = comp;
|
|
969
|
+
}
|
|
970
|
+
} else {
|
|
971
|
+
newPkgMap[comp["bom-ref"]] = comp;
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
for (const service of bomJson.services || []) {
|
|
975
|
+
if (shouldExcludeInventoryType(service, options)) {
|
|
976
|
+
filtered = true;
|
|
977
|
+
continue;
|
|
978
|
+
}
|
|
979
|
+
newServices.push(service);
|
|
980
|
+
}
|
|
981
|
+
if (filtered) {
|
|
982
|
+
if (!anyFiltered) {
|
|
983
|
+
anyFiltered = true;
|
|
984
|
+
}
|
|
985
|
+
const newcomponents = [];
|
|
986
|
+
const newdependencies = [];
|
|
987
|
+
const retainedRefs = new Set();
|
|
988
|
+
for (const aref of Object.keys(newPkgMap).sort()) {
|
|
989
|
+
newcomponents.push(newPkgMap[aref]);
|
|
990
|
+
retainedRefs.add(aref);
|
|
991
|
+
}
|
|
992
|
+
for (const service of newServices) {
|
|
993
|
+
if (service?.["bom-ref"]) {
|
|
994
|
+
retainedRefs.add(service["bom-ref"]);
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
if (bomJson.metadata?.component?.["bom-ref"]) {
|
|
998
|
+
newPkgMap[bomJson.metadata.component["bom-ref"]] =
|
|
999
|
+
bomJson.metadata.component;
|
|
1000
|
+
retainedRefs.add(bomJson.metadata.component["bom-ref"]);
|
|
1001
|
+
}
|
|
1002
|
+
if (bomJson.metadata?.component?.components) {
|
|
1003
|
+
for (const comp of bomJson.metadata.component.components) {
|
|
1004
|
+
newPkgMap[comp["bom-ref"]] = comp;
|
|
1005
|
+
retainedRefs.add(comp["bom-ref"]);
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
for (const adep of bomJson.dependencies || []) {
|
|
1009
|
+
if (retainedRefs.has(adep.ref)) {
|
|
1010
|
+
const newdepson = (adep.dependsOn || []).filter((d) =>
|
|
1011
|
+
retainedRefs.has(d),
|
|
1012
|
+
);
|
|
1013
|
+
const obj = {
|
|
1014
|
+
ref: adep.ref,
|
|
1015
|
+
dependsOn: newdepson,
|
|
1016
|
+
};
|
|
1017
|
+
// Filter provides array if needed
|
|
1018
|
+
if (adep.provides?.length) {
|
|
1019
|
+
obj.provides = adep.provides.filter((d) => retainedRefs.has(d));
|
|
1020
|
+
}
|
|
1021
|
+
newdependencies.push(obj);
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
bomJson.components = newcomponents;
|
|
1025
|
+
bomJson.dependencies = newdependencies;
|
|
1026
|
+
bomJson.services = newServices;
|
|
1027
|
+
// We set the compositions.aggregate to incomplete by default
|
|
1028
|
+
if (
|
|
1029
|
+
options.specVersion >= 1.5 &&
|
|
1030
|
+
options.autoCompositions &&
|
|
1031
|
+
bomJson.metadata?.component
|
|
1032
|
+
) {
|
|
1033
|
+
if (!bomJson.compositions) {
|
|
1034
|
+
bomJson.compositions = [];
|
|
1035
|
+
}
|
|
1036
|
+
bomJson.compositions.push({
|
|
1037
|
+
"bom-ref": bomJson.metadata.component["bom-ref"],
|
|
1038
|
+
aggregate: options.only ? "incomplete_first_party_only" : "incomplete",
|
|
1039
|
+
});
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
if (!anyFiltered && DEBUG_MODE) {
|
|
1043
|
+
if (
|
|
1044
|
+
options.requiredOnly &&
|
|
1045
|
+
!options.deep &&
|
|
1046
|
+
hasAnyProjectType(["python"], options, false)
|
|
1047
|
+
) {
|
|
1048
|
+
console.log(
|
|
1049
|
+
"TIP: Try running cdxgen with --deep argument to identify component usages with atom.",
|
|
1050
|
+
);
|
|
1051
|
+
} else if (
|
|
1052
|
+
options.requiredOnly &&
|
|
1053
|
+
options.noBabel &&
|
|
1054
|
+
hasAnyProjectType(["js"], options, false)
|
|
1055
|
+
) {
|
|
1056
|
+
console.log(
|
|
1057
|
+
"Enable babel by removing the --no-babel argument to improve usage detection.",
|
|
1058
|
+
);
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
return bomJson;
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
function shouldExcludeInventoryType(subject, options) {
|
|
1065
|
+
return AI_INVENTORY_PROJECT_TYPES.some(
|
|
1066
|
+
(type) =>
|
|
1067
|
+
optionIncludesAiInventoryProjectType(options?.excludeType, type) &&
|
|
1068
|
+
matchesAiInventoryExcludeType(subject, type),
|
|
1069
|
+
);
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
/**
|
|
1073
|
+
* Clean up
|
|
1074
|
+
*/
|
|
1075
|
+
export function cleanupEnv(_options) {
|
|
1076
|
+
if (isDryRun) {
|
|
1077
|
+
return;
|
|
1078
|
+
}
|
|
1079
|
+
if (readEnvironmentVariable("PIP_TARGET")?.startsWith(getTmpDir())) {
|
|
1080
|
+
safeRmSync(readEnvironmentVariable("PIP_TARGET"), {
|
|
1081
|
+
recursive: true,
|
|
1082
|
+
force: true,
|
|
1083
|
+
});
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
/**
|
|
1088
|
+
* Removes the cdxgen temporary directory if it was created inside the system
|
|
1089
|
+
* temp directory (as indicated by `CDXGEN_TMP_DIR`). No-ops when the variable
|
|
1090
|
+
* is unset or points outside the system temp directory.
|
|
1091
|
+
*
|
|
1092
|
+
* @returns {void}
|
|
1093
|
+
*/
|
|
1094
|
+
export function cleanupTmpDir() {
|
|
1095
|
+
if (isDryRun) {
|
|
1096
|
+
return;
|
|
1097
|
+
}
|
|
1098
|
+
if (readEnvironmentVariable("CDXGEN_TMP_DIR")?.startsWith(getTmpDir())) {
|
|
1099
|
+
safeRmSync(readEnvironmentVariable("CDXGEN_TMP_DIR"), {
|
|
1100
|
+
recursive: true,
|
|
1101
|
+
force: true,
|
|
1102
|
+
});
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
function stripBomLink(serialNumber, version, ref) {
|
|
1107
|
+
return ref.replace(`${serialNumber}/${version - 1}/`, "");
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
/**
|
|
1111
|
+
* Annotate the document with annotator
|
|
1112
|
+
*
|
|
1113
|
+
* @param {Object} bomJson BOM JSON Object
|
|
1114
|
+
* @param {Object} options CLI options
|
|
1115
|
+
*
|
|
1116
|
+
* @returns {Object} Annotated BOM JSON
|
|
1117
|
+
*/
|
|
1118
|
+
export function annotate(bomJson, options) {
|
|
1119
|
+
if (!bomJson?.components) {
|
|
1120
|
+
return bomJson;
|
|
1121
|
+
}
|
|
1122
|
+
const bomAnnotations = bomJson?.annotations || [];
|
|
1123
|
+
const cdxgenAnnotator = (bomJson.metadata?.tools?.components || []).filter(
|
|
1124
|
+
(c) => c.name === "cdxgen",
|
|
1125
|
+
);
|
|
1126
|
+
if (!cdxgenAnnotator.length) {
|
|
1127
|
+
return bomJson;
|
|
1128
|
+
}
|
|
1129
|
+
const { bomType } = findBomType(bomJson);
|
|
1130
|
+
const requiresContextTuning = [
|
|
1131
|
+
"deep-learning",
|
|
1132
|
+
"machine-learning",
|
|
1133
|
+
"ml",
|
|
1134
|
+
"ml-deep",
|
|
1135
|
+
"ml-tiny",
|
|
1136
|
+
].includes(options?.profile);
|
|
1137
|
+
const requiresContextTrimming =
|
|
1138
|
+
(requiresContextTuning && ["saasbom"].includes(bomType.toLowerCase())) ||
|
|
1139
|
+
["ml-tiny"].includes(options?.profile);
|
|
1140
|
+
// Construct the bom-link prefix to use for context tuning
|
|
1141
|
+
const bomLinkPrefix = `${bomJson.serialNumber}/${bomJson.version}/`;
|
|
1142
|
+
const metadataAnnotations = textualMetadata(bomJson);
|
|
1143
|
+
let parentBomRef;
|
|
1144
|
+
if (bomJson.metadata?.component?.["bom-ref"]) {
|
|
1145
|
+
if (requiresContextTuning) {
|
|
1146
|
+
bomJson.metadata.component["bom-ref"] =
|
|
1147
|
+
`${bomLinkPrefix}${stripBomLink(bomJson.serialNumber, bomJson.version, bomJson.metadata.component["bom-ref"])}`;
|
|
1148
|
+
}
|
|
1149
|
+
parentBomRef = bomJson.metadata.component["bom-ref"];
|
|
1150
|
+
}
|
|
1151
|
+
if (metadataAnnotations) {
|
|
1152
|
+
bomAnnotations.push({
|
|
1153
|
+
"bom-ref": "metadata-annotations",
|
|
1154
|
+
subjects: parentBomRef ? [parentBomRef] : [bomJson.serialNumber],
|
|
1155
|
+
annotator: {
|
|
1156
|
+
component: cdxgenAnnotator[0],
|
|
1157
|
+
},
|
|
1158
|
+
// An annotation describes the document it is attached to, so it carries
|
|
1159
|
+
// that document's timestamp rather than the moment postgen ran.
|
|
1160
|
+
timestamp: bomJson.metadata?.timestamp || getTimestamp(),
|
|
1161
|
+
text: metadataAnnotations,
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1164
|
+
bomJson.annotations = bomAnnotations;
|
|
1165
|
+
// Shall we trim the metadata section
|
|
1166
|
+
if (requiresContextTrimming) {
|
|
1167
|
+
if (bomJson?.metadata?.component?.components) {
|
|
1168
|
+
bomJson.metadata.component.components = undefined;
|
|
1169
|
+
}
|
|
1170
|
+
if (bomJson?.metadata?.component?.["bom-ref"]) {
|
|
1171
|
+
bomJson.metadata.component["bom-ref"] = undefined;
|
|
1172
|
+
}
|
|
1173
|
+
if (bomJson?.metadata?.component?.properties) {
|
|
1174
|
+
bomJson.metadata.component.properties = undefined;
|
|
1175
|
+
}
|
|
1176
|
+
if (bomJson?.metadata?.properties) {
|
|
1177
|
+
bomJson.metadata.properties = undefined;
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
// Tag the components
|
|
1181
|
+
for (const comp of bomJson.components) {
|
|
1182
|
+
const tags = extractTags(comp, bomType, bomJson.metadata?.component?.type);
|
|
1183
|
+
if (tags?.length) {
|
|
1184
|
+
comp.tags = tags;
|
|
1185
|
+
}
|
|
1186
|
+
if (requiresContextTuning) {
|
|
1187
|
+
comp["bom-ref"] =
|
|
1188
|
+
`${bomLinkPrefix}${stripBomLink(bomJson.serialNumber, bomJson.version, comp["bom-ref"])}`;
|
|
1189
|
+
comp.description = undefined;
|
|
1190
|
+
comp.properties = undefined;
|
|
1191
|
+
comp.evidence = undefined;
|
|
1192
|
+
}
|
|
1193
|
+
if (requiresContextTrimming) {
|
|
1194
|
+
comp.authors = undefined;
|
|
1195
|
+
comp.supplier = undefined;
|
|
1196
|
+
comp.publisher = undefined;
|
|
1197
|
+
comp["bom-ref"] = undefined;
|
|
1198
|
+
comp.externalReferences = undefined;
|
|
1199
|
+
comp.description = undefined;
|
|
1200
|
+
comp.properties = undefined;
|
|
1201
|
+
comp.evidence = undefined;
|
|
1202
|
+
// We will lose information about nested components, such as the files in case of poetry.lock
|
|
1203
|
+
comp.components = undefined;
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
// For tiny models, we can remove the dependencies section
|
|
1207
|
+
if (requiresContextTrimming) {
|
|
1208
|
+
bomJson.dependencies = undefined;
|
|
1209
|
+
if (bomType.toLowerCase() === "saasbom") {
|
|
1210
|
+
bomJson.components = undefined;
|
|
1211
|
+
let i = 0;
|
|
1212
|
+
for (const aserv of bomJson.services) {
|
|
1213
|
+
aserv.name = `service-${i++}`;
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
// Problem: information such as the dependency tree are specific to an sbom
|
|
1218
|
+
// To prevent the models from incorrectly learning about the trees, we automatically convert all bom-ref
|
|
1219
|
+
// references to [bom-link](https://cyclonedx.org/capabilities/bomlink/) format
|
|
1220
|
+
if (requiresContextTuning && bomJson?.dependencies?.length) {
|
|
1221
|
+
const newDeps = [];
|
|
1222
|
+
for (const dep of bomJson.dependencies) {
|
|
1223
|
+
const newRef = `${bomLinkPrefix}${stripBomLink(bomJson.serialNumber, bomJson.version, dep.ref)}`;
|
|
1224
|
+
const newDependsOn = [];
|
|
1225
|
+
for (const adon of dep.dependsOn) {
|
|
1226
|
+
newDependsOn.push(
|
|
1227
|
+
`${bomLinkPrefix}${stripBomLink(bomJson.serialNumber, bomJson.version, adon)}`,
|
|
1228
|
+
);
|
|
1229
|
+
}
|
|
1230
|
+
newDeps.push({
|
|
1231
|
+
ref: newRef,
|
|
1232
|
+
dependsOn: newDependsOn.sort(),
|
|
1233
|
+
});
|
|
1234
|
+
}
|
|
1235
|
+
// Overwrite the dependencies
|
|
1236
|
+
bomJson.dependencies = newDeps;
|
|
1237
|
+
}
|
|
1238
|
+
return bomJson;
|
|
1239
|
+
}
|