@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,818 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
import { Purl } from "@cdxgen/cdx-purl";
|
|
6
|
+
|
|
7
|
+
import { DEBUG_MODE } from "../core/activity.js";
|
|
8
|
+
import { shouldFetchLicense, shouldFetchVCS } from "../core/env.js";
|
|
9
|
+
import { safeExistsSync } from "../core/fs.js";
|
|
10
|
+
import { applyPurl, tryBuildPurl, tryParsePurl } from "../inventory/purl.js";
|
|
11
|
+
import {
|
|
12
|
+
_clearMetadataCache,
|
|
13
|
+
getGoPkgLicense,
|
|
14
|
+
getGoPkgVCSUrl,
|
|
15
|
+
prefetchGoPkgMetadata,
|
|
16
|
+
} from "./ecosystems.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Method to encode hex string to base64 string
|
|
20
|
+
*
|
|
21
|
+
* @param {string} hexString hex string
|
|
22
|
+
* @returns {string} base64 encoded string
|
|
23
|
+
*/
|
|
24
|
+
function toBase64(hexString) {
|
|
25
|
+
return Buffer.from(hexString, "hex").toString("base64");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Builds a Go package component object containing purl, bom-ref, integrity hash,
|
|
30
|
+
* and optionally license and VCS external reference information.
|
|
31
|
+
*
|
|
32
|
+
* @param {string} group Package group (module path prefix, may be empty)
|
|
33
|
+
* @param {string} name Package name (full module path when group is empty)
|
|
34
|
+
* @param {string} version Package version string
|
|
35
|
+
* @param {string} hash Integrity hash (e.g. "sha256-…"), used as _integrity
|
|
36
|
+
* @returns {Promise<Object>} Component object ready for inclusion in a BOM package list
|
|
37
|
+
*/
|
|
38
|
+
export async function getGoPkgComponent(group, name, version, hash) {
|
|
39
|
+
let license;
|
|
40
|
+
if (shouldFetchLicense()) {
|
|
41
|
+
if (DEBUG_MODE) {
|
|
42
|
+
console.log(
|
|
43
|
+
`About to fetch go package license information for ${group}:${name}`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
license = await getGoPkgLicense({
|
|
47
|
+
group: group,
|
|
48
|
+
name: name,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// Split the full module path into namespace and name, since the caller
|
|
52
|
+
// normally passes the whole path in `name`:
|
|
53
|
+
// pkg:golang/github.com/foo/bar → namespace "github.com/foo", name "bar".
|
|
54
|
+
let purlNamespace = group;
|
|
55
|
+
let purlName = name;
|
|
56
|
+
if (!group && name.includes("/")) {
|
|
57
|
+
const slash = name.lastIndexOf("/");
|
|
58
|
+
purlNamespace = name.slice(0, slash);
|
|
59
|
+
purlName = name.slice(slash + 1);
|
|
60
|
+
}
|
|
61
|
+
// Single-segment module paths (`go4.org`, `go.opencensus.io`) are real Go
|
|
62
|
+
// modules with no namespace. cdx-purl 0.0.3 rejected them, which cost them
|
|
63
|
+
// their purl; 0.0.4 relaxed the golang namespace rule, so they are now built
|
|
64
|
+
// like any other module. Replacing %2F with / keeps the namespace readable as
|
|
65
|
+
// the spec intends.
|
|
66
|
+
const purlString =
|
|
67
|
+
tryBuildPurl({
|
|
68
|
+
type: "golang",
|
|
69
|
+
namespace: purlNamespace || null,
|
|
70
|
+
name: purlName,
|
|
71
|
+
version: version || null,
|
|
72
|
+
})?.replace(/%2F/g, "/") || null;
|
|
73
|
+
let vcs;
|
|
74
|
+
if (shouldFetchVCS()) {
|
|
75
|
+
vcs = await getGoPkgVCSUrl(group, name);
|
|
76
|
+
}
|
|
77
|
+
const packageInfo = {
|
|
78
|
+
group: group,
|
|
79
|
+
name: name,
|
|
80
|
+
version: version,
|
|
81
|
+
_integrity: hash,
|
|
82
|
+
license: license,
|
|
83
|
+
};
|
|
84
|
+
applyPurl(packageInfo, purlString);
|
|
85
|
+
if (vcs) {
|
|
86
|
+
packageInfo.externalReferences = [{ type: "vcs", url: vcs }];
|
|
87
|
+
}
|
|
88
|
+
return packageInfo;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Method to parse go.mod files
|
|
93
|
+
*
|
|
94
|
+
* @param {String} goModData Contents of go.mod file
|
|
95
|
+
* @param {Object} gosumMap Data from go.sum files
|
|
96
|
+
*
|
|
97
|
+
* @returns {Object} Object containing parent component, rootList and packages list
|
|
98
|
+
*/
|
|
99
|
+
export async function parseGoModData(goModData, gosumMap) {
|
|
100
|
+
const pkgComponentsList = [];
|
|
101
|
+
const rootList = [];
|
|
102
|
+
|
|
103
|
+
if (!goModData) {
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
const { parentComponent, entries } = decodeGoModData(goModData, gosumMap);
|
|
107
|
+
await prefetchGoPkgMetadata(entries);
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
const component = await getGoPkgComponent(
|
|
110
|
+
"",
|
|
111
|
+
entry.name,
|
|
112
|
+
entry.version,
|
|
113
|
+
entry.hash,
|
|
114
|
+
);
|
|
115
|
+
if (entry.replacement) {
|
|
116
|
+
pkgComponentsList.push(component);
|
|
117
|
+
rootList.push(component);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (entry.indirect) {
|
|
121
|
+
component.scope = "optional";
|
|
122
|
+
} else {
|
|
123
|
+
rootList.push(component);
|
|
124
|
+
}
|
|
125
|
+
pkgComponentsList.push(component);
|
|
126
|
+
}
|
|
127
|
+
// Clear the cache
|
|
128
|
+
_clearMetadataCache();
|
|
129
|
+
return {
|
|
130
|
+
parentComponent,
|
|
131
|
+
pkgList: pkgComponentsList.sort((a, b) =>
|
|
132
|
+
// Sort on bom-ref, which every component has, rather than falling back
|
|
133
|
+
// from purl to name. A mixed key sorts purl-less components under their
|
|
134
|
+
// bare name and everything else under "pkg:...", so whether a purl could
|
|
135
|
+
// be built silently reorders the output.
|
|
136
|
+
(a["bom-ref"] || "").localeCompare(b["bom-ref"] || ""),
|
|
137
|
+
),
|
|
138
|
+
rootList,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Read a go.mod into its parent component and an ordered list of module
|
|
144
|
+
* entries, without touching the network.
|
|
145
|
+
*
|
|
146
|
+
* Separated from {@link parseGoModData} so the whole module set is known before
|
|
147
|
+
* the first licence lookup, which is what makes one batched round possible.
|
|
148
|
+
*
|
|
149
|
+
* @param {String} goModData Contents of go.mod file
|
|
150
|
+
* @param {Object} gosumMap Data from go.sum files
|
|
151
|
+
* @returns {{parentComponent: Object, entries: Array<Object>}} Parent component
|
|
152
|
+
* and module entries in file order
|
|
153
|
+
*/
|
|
154
|
+
function decodeGoModData(goModData, gosumMap) {
|
|
155
|
+
const parentComponent = {};
|
|
156
|
+
const entries = [];
|
|
157
|
+
let isModReplacement = false;
|
|
158
|
+
let isTool = false;
|
|
159
|
+
|
|
160
|
+
const pkgs = goModData.split("\n");
|
|
161
|
+
for (let l of pkgs) {
|
|
162
|
+
// Windows of course
|
|
163
|
+
l = l.replaceAll("\r", "").replace(/[\t ]+/g, " ");
|
|
164
|
+
// Capture the parent component name from the module
|
|
165
|
+
if (l.startsWith("module ")) {
|
|
166
|
+
parentComponent.name = l.split(" ").pop().trim();
|
|
167
|
+
parentComponent.type = "application";
|
|
168
|
+
// Single-segment module paths are valid golang purls as of cdx-purl 0.0.4.
|
|
169
|
+
applyPurl(
|
|
170
|
+
parentComponent,
|
|
171
|
+
tryParsePurl(`pkg:golang/${parentComponent.name}`),
|
|
172
|
+
);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// The `tool` block dependency relations will be recorded into `require` block(need run `go mod tidy`), just ignore that
|
|
177
|
+
if (l.includes("tool (")) {
|
|
178
|
+
isTool = !l.includes(")");
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (l.includes(")")) {
|
|
182
|
+
isTool = false;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (l.includes("tool ") || isTool) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (l.startsWith("toolchain ")) {
|
|
189
|
+
const toolchainVer = l.split(" ").pop().trim();
|
|
190
|
+
parentComponent.properties = [
|
|
191
|
+
{ name: "cdx:go:toolchain", value: toolchainVer },
|
|
192
|
+
];
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// Skip go.mod file headers, whitespace, and/or comments
|
|
196
|
+
if (
|
|
197
|
+
l.startsWith("go ") ||
|
|
198
|
+
//TODO: should toolchain be considered as a dependency
|
|
199
|
+
l.includes(")") ||
|
|
200
|
+
l.trim() === "" ||
|
|
201
|
+
l.trim().startsWith("//")
|
|
202
|
+
) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Handle required modules separately from replacement modules to ensure accuracy when parsing component data.
|
|
207
|
+
if (l.includes("require (")) {
|
|
208
|
+
isModReplacement = false;
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (l.includes("replace (")) {
|
|
212
|
+
isModReplacement = true;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (l.includes("replace ")) {
|
|
216
|
+
// If this is an inline replacement, drop the word replace
|
|
217
|
+
// (eg; "replace google.golang.org/grpc => google.golang.org/grpc v1.21.0" becomes " google.golang.org/grpc => google.golang.org/grpc v1.21.0")
|
|
218
|
+
l = l.replace("replace", "");
|
|
219
|
+
isModReplacement = true;
|
|
220
|
+
}
|
|
221
|
+
// require google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17
|
|
222
|
+
if (l.startsWith("require ")) {
|
|
223
|
+
l = l.replace("require ", "");
|
|
224
|
+
isModReplacement = false;
|
|
225
|
+
}
|
|
226
|
+
const tmpA = l.trim().split(" ");
|
|
227
|
+
if (!isModReplacement) {
|
|
228
|
+
// Add group, name and version component properties for required modules
|
|
229
|
+
const version = tmpA[1];
|
|
230
|
+
entries.push({
|
|
231
|
+
group: "",
|
|
232
|
+
name: tmpA[0],
|
|
233
|
+
version,
|
|
234
|
+
hash: gosumMap[`${tmpA[0]}@${version}`],
|
|
235
|
+
indirect: l.endsWith("// indirect"),
|
|
236
|
+
replacement: false,
|
|
237
|
+
});
|
|
238
|
+
} else {
|
|
239
|
+
// Add group, name and version component properties for replacement modules
|
|
240
|
+
const version = tmpA[3];
|
|
241
|
+
entries.push({
|
|
242
|
+
group: "",
|
|
243
|
+
name: tmpA[2],
|
|
244
|
+
version,
|
|
245
|
+
hash: gosumMap[`${tmpA[2]}@${version}`],
|
|
246
|
+
indirect: false,
|
|
247
|
+
replacement: true,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return { parentComponent, entries };
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Parses a Go modules text file (e.g. vendor/modules.txt) and returns a list of
|
|
256
|
+
* Go package components. Cross-references the go.sum map for integrity hashes and
|
|
257
|
+
* sets scope and confidence based on hash availability.
|
|
258
|
+
*
|
|
259
|
+
* @param {string} txtFile Path to the modules.txt file
|
|
260
|
+
* @param {Object} gosumMap Map of "module@version" keys to sha256 hash values from go.sum
|
|
261
|
+
* @returns {Promise<Object[]>} List of Go package component objects with evidence
|
|
262
|
+
*/
|
|
263
|
+
export async function parseGoModulesTxt(txtFile, gosumMap) {
|
|
264
|
+
const pkgList = [];
|
|
265
|
+
const txtData = readFileSync(txtFile, { encoding: "utf-8" });
|
|
266
|
+
const pkgs = txtData
|
|
267
|
+
.split("\n")
|
|
268
|
+
.filter((p) => p.trim().replace(/["']/g, "").startsWith("# "));
|
|
269
|
+
await prefetchGoPkgMetadata(
|
|
270
|
+
// # cel.dev/expr v0.18.0
|
|
271
|
+
pkgs.map((l) => ({ group: "", name: l.split(" ")[1] })),
|
|
272
|
+
);
|
|
273
|
+
for (const l of pkgs) {
|
|
274
|
+
const tmpA = l.split(" ");
|
|
275
|
+
if (!tmpA.length === 3) {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
const version = tmpA[2];
|
|
279
|
+
const gosumHash = gosumMap[`${tmpA[1]}@${version}`];
|
|
280
|
+
const component = await getGoPkgComponent("", tmpA[1], tmpA[2], gosumHash);
|
|
281
|
+
let confidence = 0.7;
|
|
282
|
+
if (gosumHash) {
|
|
283
|
+
component.scope = "required";
|
|
284
|
+
} else {
|
|
285
|
+
confidence = 0.3;
|
|
286
|
+
}
|
|
287
|
+
pkgList.push(_addGoComponentEvidence(component, txtFile, confidence));
|
|
288
|
+
}
|
|
289
|
+
return pkgList;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Parse go list output
|
|
294
|
+
*
|
|
295
|
+
* @param {string} rawOutput Output from go list invocation
|
|
296
|
+
* @param {Object} gosumMap go.sum data
|
|
297
|
+
* @returns Object with parent component and List of packages
|
|
298
|
+
*/
|
|
299
|
+
export async function parseGoListDep(rawOutput, gosumMap) {
|
|
300
|
+
let parentComponent = {};
|
|
301
|
+
const deps = [];
|
|
302
|
+
if (typeof rawOutput === "string") {
|
|
303
|
+
const keys_cache = {};
|
|
304
|
+
const pkgs = rawOutput
|
|
305
|
+
.split("\n")
|
|
306
|
+
.filter((p) => p.trim().replace(/["']/g, "").length);
|
|
307
|
+
// Same shape and same duplicate filter as the loop below, so the batch
|
|
308
|
+
// covers every module the loop resolves and nothing else.
|
|
309
|
+
const prefetchSeen = new Set();
|
|
310
|
+
const prefetchModules = [];
|
|
311
|
+
for (const l of pkgs) {
|
|
312
|
+
const verArr = l.trim().replace(/["']/g, "").split("|");
|
|
313
|
+
if (!verArr || verArr.length < 5) {
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
const key = `${verArr[0]}-${verArr[1]}`;
|
|
317
|
+
if (prefetchSeen.has(key)) {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
prefetchSeen.add(key);
|
|
321
|
+
prefetchModules.push({ group: "", name: verArr[0] });
|
|
322
|
+
}
|
|
323
|
+
await prefetchGoPkgMetadata(prefetchModules);
|
|
324
|
+
for (const l of pkgs) {
|
|
325
|
+
const verArr = l.trim().replace(/["']/g, "").split("|");
|
|
326
|
+
if (verArr && verArr.length >= 5) {
|
|
327
|
+
const key = `${verArr[0]}-${verArr[1]}`;
|
|
328
|
+
// Filter duplicates
|
|
329
|
+
if (!keys_cache[key]) {
|
|
330
|
+
keys_cache[key] = key;
|
|
331
|
+
const version = verArr[1];
|
|
332
|
+
let gosumHash = gosumMap[`${verArr[0]}@${version}`];
|
|
333
|
+
if (!gosumHash && verArr.length >= 8 && verArr[8]?.length) {
|
|
334
|
+
gosumHash = `sha256-${verArr[8].replace("h1:", "")}`;
|
|
335
|
+
}
|
|
336
|
+
const component = await getGoPkgComponent(
|
|
337
|
+
"",
|
|
338
|
+
verArr[0],
|
|
339
|
+
version,
|
|
340
|
+
gosumHash,
|
|
341
|
+
);
|
|
342
|
+
// This is misusing the scope attribute to represent direct vs indirect
|
|
343
|
+
if (verArr[2] === "false") {
|
|
344
|
+
component.scope = "required";
|
|
345
|
+
} else if (verArr[2] === "true") {
|
|
346
|
+
component.scope = "optional";
|
|
347
|
+
}
|
|
348
|
+
component.properties = [
|
|
349
|
+
{
|
|
350
|
+
name: "internal:SrcGoMod",
|
|
351
|
+
value: verArr[3] || "",
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
name: "internal:ModuleGoVersion",
|
|
355
|
+
value: verArr[4] || "",
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: "cdx:go:indirect",
|
|
359
|
+
value: verArr[2],
|
|
360
|
+
},
|
|
361
|
+
];
|
|
362
|
+
if (
|
|
363
|
+
verArr.length >= 6 &&
|
|
364
|
+
verArr[6]?.length &&
|
|
365
|
+
verArr[6] !== "<nil>"
|
|
366
|
+
) {
|
|
367
|
+
component.properties.push({
|
|
368
|
+
name: "cdx:go:creation_time",
|
|
369
|
+
value: verArr[6],
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
if (verArr.length >= 7 && verArr[7]?.length) {
|
|
373
|
+
component.properties.push({
|
|
374
|
+
name: "cdx:go:deprecated",
|
|
375
|
+
value: verArr[7],
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
if (verArr.length >= 9 && verArr[9]?.length) {
|
|
379
|
+
component.properties.push({
|
|
380
|
+
name: "cdx:go:local_dir",
|
|
381
|
+
value: verArr[9],
|
|
382
|
+
});
|
|
383
|
+
if (safeExistsSync(join(verArr[9], "LICENSE"))) {
|
|
384
|
+
const licenseText = readFileSync(join(verArr[9], "LICENSE"), {
|
|
385
|
+
encoding: "utf-8",
|
|
386
|
+
});
|
|
387
|
+
if (licenseText?.length) {
|
|
388
|
+
component.licenses = [
|
|
389
|
+
{
|
|
390
|
+
license: {
|
|
391
|
+
name: "CUSTOM",
|
|
392
|
+
text: { contentType: "text/plain", content: licenseText },
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
];
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (verArr.length > 5 && verArr[5] === "true") {
|
|
400
|
+
parentComponent = component;
|
|
401
|
+
} else {
|
|
402
|
+
deps.push(component);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return {
|
|
409
|
+
parentComponent,
|
|
410
|
+
pkgList: deps.sort((a, b) =>
|
|
411
|
+
// Sort on bom-ref, which every component has, rather than falling back
|
|
412
|
+
// from purl to name. A mixed key sorts purl-less components under their
|
|
413
|
+
// bare name and everything else under "pkg:...", so whether a purl could
|
|
414
|
+
// be built silently reorders the output.
|
|
415
|
+
(a["bom-ref"] || "").localeCompare(b["bom-ref"] || ""),
|
|
416
|
+
),
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
function _addGoComponentEvidence(component, goModFile, confidence = 0.8) {
|
|
421
|
+
if (goModFile) {
|
|
422
|
+
component.evidence = {
|
|
423
|
+
identity: {
|
|
424
|
+
field: "purl",
|
|
425
|
+
confidence,
|
|
426
|
+
methods: [
|
|
427
|
+
{
|
|
428
|
+
technique: "manifest-analysis",
|
|
429
|
+
confidence,
|
|
430
|
+
value: goModFile,
|
|
431
|
+
},
|
|
432
|
+
],
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
if (!component.properties) {
|
|
436
|
+
component.properties = [];
|
|
437
|
+
}
|
|
438
|
+
component.properties.push({
|
|
439
|
+
name: "internal:SrcFile",
|
|
440
|
+
value: goModFile,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
return component;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Parse go mod graph
|
|
448
|
+
*
|
|
449
|
+
* @param {string} rawOutput Output from go mod graph invocation
|
|
450
|
+
* @param {string} goModFile go.mod file
|
|
451
|
+
* @param {Object} gosumMap Hashes from gosum for lookups
|
|
452
|
+
* @param {Array} epkgList Existing package list
|
|
453
|
+
* @param {Object} parentComponent Current parent component
|
|
454
|
+
*
|
|
455
|
+
* @returns Object containing List of packages and dependencies
|
|
456
|
+
*/
|
|
457
|
+
export async function parseGoModGraph(
|
|
458
|
+
rawOutput,
|
|
459
|
+
goModFile,
|
|
460
|
+
gosumMap,
|
|
461
|
+
epkgList = [],
|
|
462
|
+
parentComponent = {},
|
|
463
|
+
) {
|
|
464
|
+
const pkgList = [];
|
|
465
|
+
const dependenciesList = [];
|
|
466
|
+
const addedPkgs = {};
|
|
467
|
+
const depsMap = {};
|
|
468
|
+
// Useful for filtering out invalid components
|
|
469
|
+
const existingPkgMap = {};
|
|
470
|
+
// Package map by manually parsing the go.mod data
|
|
471
|
+
let goModPkgMap = {};
|
|
472
|
+
// Direct dependencies by manually parsing the go.mod data
|
|
473
|
+
const goModDirectDepsMap = {};
|
|
474
|
+
// Indirect dependencies by manually parsing the go.mod data
|
|
475
|
+
const goModOptionalDepsMap = {};
|
|
476
|
+
const excludedRefs = [];
|
|
477
|
+
if (goModFile) {
|
|
478
|
+
goModPkgMap = await parseGoModData(
|
|
479
|
+
readFileSync(goModFile, { encoding: "utf-8" }),
|
|
480
|
+
gosumMap,
|
|
481
|
+
);
|
|
482
|
+
if (goModPkgMap?.rootList) {
|
|
483
|
+
for (const epkg of goModPkgMap.rootList) {
|
|
484
|
+
goModDirectDepsMap[epkg["bom-ref"]] = true;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
if (goModPkgMap?.pkgList) {
|
|
488
|
+
for (const epkg of goModPkgMap.pkgList) {
|
|
489
|
+
if (epkg?.scope === "optional") {
|
|
490
|
+
goModOptionalDepsMap[epkg["bom-ref"]] = true;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
for (const epkg of epkgList) {
|
|
496
|
+
existingPkgMap[epkg["bom-ref"]] = true;
|
|
497
|
+
}
|
|
498
|
+
if (parentComponent && Object.keys(parentComponent).length) {
|
|
499
|
+
existingPkgMap[parentComponent["bom-ref"]] = true;
|
|
500
|
+
}
|
|
501
|
+
if (typeof rawOutput === "string") {
|
|
502
|
+
const lines = rawOutput.split("\n");
|
|
503
|
+
// Each line is of the form ref dependsOn
|
|
504
|
+
// github.com/spf13/afero@v1.2.2 golang.org/x/text@v0.3.0
|
|
505
|
+
for (const l of lines) {
|
|
506
|
+
// To keep the parsing logic simple we prefix pkg:golang/
|
|
507
|
+
// and let packageurl work out the rest
|
|
508
|
+
const tmpA = l.replaceAll("\r", "").split(" ");
|
|
509
|
+
if (tmpA && tmpA.length === 2) {
|
|
510
|
+
try {
|
|
511
|
+
// Some golang modules (e.g. go4.org) have no path separator and
|
|
512
|
+
// cdx-purl requires a namespace. Use the raw ref when parsing fails.
|
|
513
|
+
let sourceRefString;
|
|
514
|
+
let sourceName = tmpA[0].split("@")[0];
|
|
515
|
+
let sourcePurl = null;
|
|
516
|
+
try {
|
|
517
|
+
sourcePurl = Purl.parse(`pkg:golang/${tmpA[0]}`);
|
|
518
|
+
sourceRefString = decodeURIComponent(sourcePurl.toString());
|
|
519
|
+
sourceName = `${sourcePurl.namespace ? `${sourcePurl.namespace}/` : ""}${sourcePurl.name}`;
|
|
520
|
+
} catch {
|
|
521
|
+
sourceRefString = `pkg:golang/${tmpA[0]}`;
|
|
522
|
+
}
|
|
523
|
+
let dependsRefString;
|
|
524
|
+
let dependsName = tmpA[1].split("@")[0];
|
|
525
|
+
let dependsPurl = null;
|
|
526
|
+
try {
|
|
527
|
+
dependsPurl = Purl.parse(`pkg:golang/${tmpA[1]}`);
|
|
528
|
+
dependsRefString = decodeURIComponent(dependsPurl.toString());
|
|
529
|
+
dependsName = `${dependsPurl.namespace ? `${dependsPurl.namespace}/` : ""}${dependsPurl.name}`;
|
|
530
|
+
} catch {
|
|
531
|
+
dependsRefString = `pkg:golang/${tmpA[1]}`;
|
|
532
|
+
}
|
|
533
|
+
// Since go mod graph over-reports direct dependencies we use the existing list
|
|
534
|
+
// from go deps to filter the result
|
|
535
|
+
if (
|
|
536
|
+
existingPkgMap &&
|
|
537
|
+
Object.keys(existingPkgMap).length &&
|
|
538
|
+
(!existingPkgMap[sourceRefString] ||
|
|
539
|
+
!existingPkgMap[dependsRefString])
|
|
540
|
+
) {
|
|
541
|
+
continue;
|
|
542
|
+
}
|
|
543
|
+
// Add the source and depends to the pkgList
|
|
544
|
+
if (!addedPkgs[tmpA[0]] && !excludedRefs.includes(sourceRefString)) {
|
|
545
|
+
const component = await getGoPkgComponent(
|
|
546
|
+
"",
|
|
547
|
+
sourceName,
|
|
548
|
+
sourcePurl?.version || tmpA[0].split("@")[1],
|
|
549
|
+
gosumMap[tmpA[0]],
|
|
550
|
+
);
|
|
551
|
+
let confidence = 0.7;
|
|
552
|
+
if (goModOptionalDepsMap[component["bom-ref"]]) {
|
|
553
|
+
component.scope = "optional";
|
|
554
|
+
confidence = 0.5;
|
|
555
|
+
} else if (goModDirectDepsMap[component["bom-ref"]]) {
|
|
556
|
+
component.scope = "required";
|
|
557
|
+
}
|
|
558
|
+
// These are likely false positives
|
|
559
|
+
if (
|
|
560
|
+
goModFile &&
|
|
561
|
+
!Object.keys(existingPkgMap).length &&
|
|
562
|
+
goModPkgMap?.parentComponent?.["bom-ref"] !== sourceRefString &&
|
|
563
|
+
!component.scope
|
|
564
|
+
) {
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
567
|
+
// Don't add the parent component to the package list
|
|
568
|
+
if (goModPkgMap?.parentComponent?.["bom-ref"] !== sourceRefString) {
|
|
569
|
+
pkgList.push(
|
|
570
|
+
_addGoComponentEvidence(component, goModFile, confidence),
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
addedPkgs[tmpA[0]] = true;
|
|
574
|
+
}
|
|
575
|
+
if (!addedPkgs[tmpA[1]]) {
|
|
576
|
+
const component = await getGoPkgComponent(
|
|
577
|
+
"",
|
|
578
|
+
dependsName,
|
|
579
|
+
dependsPurl?.version || tmpA[1].split("@")[1],
|
|
580
|
+
gosumMap[tmpA[1]],
|
|
581
|
+
);
|
|
582
|
+
let confidence = 0.7;
|
|
583
|
+
if (goModDirectDepsMap[component["bom-ref"]]) {
|
|
584
|
+
component.scope = "required";
|
|
585
|
+
}
|
|
586
|
+
if (goModOptionalDepsMap[component["bom-ref"]]) {
|
|
587
|
+
component.scope = "optional";
|
|
588
|
+
confidence = 0.5;
|
|
589
|
+
}
|
|
590
|
+
if (
|
|
591
|
+
goModPkgMap?.parentComponent?.["bom-ref"] !== sourceRefString &&
|
|
592
|
+
goModDirectDepsMap[sourceRefString] &&
|
|
593
|
+
component?.scope !== "required"
|
|
594
|
+
) {
|
|
595
|
+
// If the parent is required, then ensure the child doesn't accidentally become optional or excluded
|
|
596
|
+
component.scope = undefined;
|
|
597
|
+
}
|
|
598
|
+
// Mark the go toolchain components as excluded
|
|
599
|
+
if (
|
|
600
|
+
dependsRefString.startsWith("pkg:golang/toolchain@") ||
|
|
601
|
+
dependsRefString.startsWith("pkg:golang/go@")
|
|
602
|
+
) {
|
|
603
|
+
excludedRefs.push(dependsRefString);
|
|
604
|
+
continue;
|
|
605
|
+
}
|
|
606
|
+
// These are likely false positives
|
|
607
|
+
if (
|
|
608
|
+
goModFile &&
|
|
609
|
+
goModPkgMap?.parentComponent?.["bom-ref"] !== sourceRefString &&
|
|
610
|
+
!Object.keys(existingPkgMap).length &&
|
|
611
|
+
!component.scope
|
|
612
|
+
) {
|
|
613
|
+
excludedRefs.push(dependsRefString);
|
|
614
|
+
continue;
|
|
615
|
+
}
|
|
616
|
+
// The confidence for the indirect dependencies is lower
|
|
617
|
+
// This is because go mod graph emits module requirements graph, which could be different to module compile graph
|
|
618
|
+
// See https://go.dev/ref/mod#glos-module-graph
|
|
619
|
+
pkgList.push(
|
|
620
|
+
_addGoComponentEvidence(component, goModFile, confidence),
|
|
621
|
+
);
|
|
622
|
+
addedPkgs[tmpA[1]] = true;
|
|
623
|
+
}
|
|
624
|
+
if (!depsMap[sourceRefString]) {
|
|
625
|
+
depsMap[sourceRefString] = new Set();
|
|
626
|
+
}
|
|
627
|
+
if (!depsMap[dependsRefString]) {
|
|
628
|
+
depsMap[dependsRefString] = new Set();
|
|
629
|
+
}
|
|
630
|
+
// Check if the root is really dependent on this component
|
|
631
|
+
if (
|
|
632
|
+
goModPkgMap?.parentComponent?.["bom-ref"] === sourceRefString &&
|
|
633
|
+
Object.keys(goModDirectDepsMap).length &&
|
|
634
|
+
!goModDirectDepsMap[dependsRefString]
|
|
635
|
+
) {
|
|
636
|
+
// ignore
|
|
637
|
+
} else if (!excludedRefs.includes(dependsRefString)) {
|
|
638
|
+
depsMap[sourceRefString].add(dependsRefString);
|
|
639
|
+
}
|
|
640
|
+
} catch (_e) {
|
|
641
|
+
// pass
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
for (const adep of Object.keys(depsMap).sort()) {
|
|
647
|
+
dependenciesList.push({
|
|
648
|
+
ref: adep,
|
|
649
|
+
dependsOn: Array.from(depsMap[adep]).sort(),
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
return {
|
|
653
|
+
pkgList: pkgList.sort((a, b) =>
|
|
654
|
+
// Sort on bom-ref, which every component has, rather than falling back
|
|
655
|
+
// from purl to name. A mixed key sorts purl-less components under their
|
|
656
|
+
// bare name and everything else under "pkg:...", so whether a purl could
|
|
657
|
+
// be built silently reorders the output.
|
|
658
|
+
(a["bom-ref"] || "").localeCompare(b["bom-ref"] || ""),
|
|
659
|
+
),
|
|
660
|
+
dependenciesList,
|
|
661
|
+
parentComponent: goModPkgMap?.parentComponent,
|
|
662
|
+
rootList: goModPkgMap?.rootList,
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Parse go mod why output.
|
|
668
|
+
*
|
|
669
|
+
* @param {string} rawOutput Output from go mod why
|
|
670
|
+
* @returns {string|undefined} package name or none
|
|
671
|
+
*/
|
|
672
|
+
export function parseGoModWhy(rawOutput) {
|
|
673
|
+
if (typeof rawOutput === "string") {
|
|
674
|
+
let pkg_name;
|
|
675
|
+
const lines = rawOutput.split("\n");
|
|
676
|
+
lines.forEach((l) => {
|
|
677
|
+
if (l && !l.startsWith("#") && !l.startsWith("(")) {
|
|
678
|
+
pkg_name = l.trim();
|
|
679
|
+
}
|
|
680
|
+
});
|
|
681
|
+
return pkg_name;
|
|
682
|
+
}
|
|
683
|
+
return undefined;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/**
|
|
687
|
+
* Parse go sum data
|
|
688
|
+
* @param {string} gosumData Content of go.sum
|
|
689
|
+
* @returns package list
|
|
690
|
+
*/
|
|
691
|
+
export async function parseGosumData(gosumData) {
|
|
692
|
+
const pkgList = [];
|
|
693
|
+
if (!gosumData) {
|
|
694
|
+
return pkgList;
|
|
695
|
+
}
|
|
696
|
+
// Decoding every line first lets the whole module set be fetched in one
|
|
697
|
+
// batched round before any component is built. One decode function feeds both,
|
|
698
|
+
// so the batch cannot ask for a module the loop does not resolve.
|
|
699
|
+
const entries = [];
|
|
700
|
+
for (const l of gosumData.split("\n")) {
|
|
701
|
+
const m = l.replaceAll("\r", "");
|
|
702
|
+
// look for lines containing go.mod
|
|
703
|
+
if (m.indexOf("go.mod") > -1) {
|
|
704
|
+
const tmpA = m.split(" ");
|
|
705
|
+
entries.push({
|
|
706
|
+
group: "",
|
|
707
|
+
name: tmpA[0],
|
|
708
|
+
version: tmpA[1].replace("/go.mod", ""),
|
|
709
|
+
hash: tmpA[tmpA.length - 1].replace("h1:", "sha256-"),
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
await prefetchGoPkgMetadata(entries);
|
|
714
|
+
for (const entry of entries) {
|
|
715
|
+
pkgList.push(
|
|
716
|
+
await getGoPkgComponent("", entry.name, entry.version, entry.hash),
|
|
717
|
+
);
|
|
718
|
+
}
|
|
719
|
+
return pkgList;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* Parses the contents of a Gopkg.lock or Gopkg.toml file (dep tool format) and
|
|
724
|
+
* returns a list of Go package components. Optionally fetches license information
|
|
725
|
+
* for each package when FETCH_LICENSE is enabled.
|
|
726
|
+
*
|
|
727
|
+
* @param {string} gopkgData Raw string contents of the Gopkg lock/toml file
|
|
728
|
+
* @returns {Promise<Object[]>} List of Go package component objects
|
|
729
|
+
*/
|
|
730
|
+
export async function parseGopkgData(gopkgData) {
|
|
731
|
+
const pkgList = [];
|
|
732
|
+
if (!gopkgData) {
|
|
733
|
+
return pkgList;
|
|
734
|
+
}
|
|
735
|
+
let pkg = null;
|
|
736
|
+
const pkgs = gopkgData.split("\n");
|
|
737
|
+
for (const l of pkgs) {
|
|
738
|
+
let key = null;
|
|
739
|
+
let value = null;
|
|
740
|
+
if (l.indexOf("[[projects]]") > -1) {
|
|
741
|
+
if (pkg) {
|
|
742
|
+
pkgList.push(pkg);
|
|
743
|
+
}
|
|
744
|
+
pkg = {};
|
|
745
|
+
}
|
|
746
|
+
if (l.indexOf("=") > -1) {
|
|
747
|
+
const tmpA = l.split("=");
|
|
748
|
+
key = tmpA[0].trim();
|
|
749
|
+
value = tmpA[1].trim().replace(/"/g, "");
|
|
750
|
+
let digestStr;
|
|
751
|
+
switch (key) {
|
|
752
|
+
case "digest":
|
|
753
|
+
digestStr = value.replace("1:", "");
|
|
754
|
+
pkg._integrity = `sha256-${toBase64(digestStr)}`;
|
|
755
|
+
break;
|
|
756
|
+
case "name":
|
|
757
|
+
pkg.group = "";
|
|
758
|
+
pkg.name = value;
|
|
759
|
+
if (shouldFetchLicense()) {
|
|
760
|
+
pkg.license = await getGoPkgLicense({
|
|
761
|
+
group: pkg.group,
|
|
762
|
+
name: pkg.name,
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
break;
|
|
766
|
+
case "version":
|
|
767
|
+
pkg.version = value;
|
|
768
|
+
break;
|
|
769
|
+
case "revision":
|
|
770
|
+
if (!pkg.version) {
|
|
771
|
+
pkg.version = value;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
return pkgList;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
/**
|
|
780
|
+
* Parses the output of `go version -m` (build info) and returns a list of Go
|
|
781
|
+
* package components for each "dep" line, including name, version, and integrity hash.
|
|
782
|
+
*
|
|
783
|
+
* @param {string} buildInfoData Raw string output from `go version -m`
|
|
784
|
+
* @returns {Promise<Object[]>} List of Go package component objects
|
|
785
|
+
*/
|
|
786
|
+
export async function parseGoVersionData(buildInfoData) {
|
|
787
|
+
const pkgList = [];
|
|
788
|
+
if (!buildInfoData) {
|
|
789
|
+
return pkgList;
|
|
790
|
+
}
|
|
791
|
+
const entries = [];
|
|
792
|
+
for (const line of buildInfoData.split("\n")) {
|
|
793
|
+
const l = line.trim().replace(/\t/g, " ");
|
|
794
|
+
if (!l.startsWith("dep")) {
|
|
795
|
+
continue;
|
|
796
|
+
}
|
|
797
|
+
const tmpA = l.split(" ");
|
|
798
|
+
if (!tmpA || tmpA.length < 3) {
|
|
799
|
+
continue;
|
|
800
|
+
}
|
|
801
|
+
entries.push({
|
|
802
|
+
group: "",
|
|
803
|
+
name: tmpA[1].trim(),
|
|
804
|
+
version: tmpA[2].trim(),
|
|
805
|
+
hash:
|
|
806
|
+
tmpA.length === 4
|
|
807
|
+
? tmpA[tmpA.length - 1].replace("h1:", "sha256-")
|
|
808
|
+
: "",
|
|
809
|
+
});
|
|
810
|
+
}
|
|
811
|
+
await prefetchGoPkgMetadata(entries);
|
|
812
|
+
for (const entry of entries) {
|
|
813
|
+
pkgList.push(
|
|
814
|
+
await getGoPkgComponent("", entry.name, entry.version, entry.hash),
|
|
815
|
+
);
|
|
816
|
+
}
|
|
817
|
+
return pkgList;
|
|
818
|
+
}
|