@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,807 @@
|
|
|
1
|
+
import { lstatSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir, tmpdir } from "node:os";
|
|
3
|
+
import {
|
|
4
|
+
delimiter as _delimiter,
|
|
5
|
+
sep as _sep,
|
|
6
|
+
basename,
|
|
7
|
+
dirname,
|
|
8
|
+
join,
|
|
9
|
+
} from "node:path";
|
|
10
|
+
|
|
11
|
+
import { build, Purl } from "@cdxgen/cdx-purl";
|
|
12
|
+
import StreamZip from "node-stream-zip";
|
|
13
|
+
|
|
14
|
+
import { DEBUG_MODE, readEnvironmentVariable } from "../core/activity.js";
|
|
15
|
+
import { parseMavenArgs } from "../core/env.js";
|
|
16
|
+
import {
|
|
17
|
+
getAllFiles,
|
|
18
|
+
multiChecksumFile,
|
|
19
|
+
safeExistsSync,
|
|
20
|
+
safeMkdtempSync,
|
|
21
|
+
safeRmSync,
|
|
22
|
+
safeSpawnSync,
|
|
23
|
+
} from "../core/fs.js";
|
|
24
|
+
import { isWin } from "../core/paths.js";
|
|
25
|
+
import { xml2js } from "../parsers/xml.js";
|
|
26
|
+
import { pypiBomRef } from "./purl.js";
|
|
27
|
+
|
|
28
|
+
const jarNSMapping_cache = {};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Collect maven dependencies
|
|
32
|
+
*
|
|
33
|
+
* @param {string} mavenCmd Maven command to use
|
|
34
|
+
* @param {string} basePath Path to the maven project
|
|
35
|
+
* @param {boolean} cleanup Remove temporary directories
|
|
36
|
+
* @param {boolean} includeCacheDir Include maven and gradle cache directories
|
|
37
|
+
*/
|
|
38
|
+
export async function collectMvnDependencies(
|
|
39
|
+
mavenCmd,
|
|
40
|
+
basePath,
|
|
41
|
+
cleanup = true,
|
|
42
|
+
includeCacheDir = false,
|
|
43
|
+
) {
|
|
44
|
+
let jarNSMapping = {};
|
|
45
|
+
const MAVEN_CACHE_DIR =
|
|
46
|
+
readEnvironmentVariable("MAVEN_CACHE_DIR") ||
|
|
47
|
+
join(homedir(), ".m2", "repository");
|
|
48
|
+
const tempDir = safeMkdtempSync(join(tmpdir(), "mvn-deps-"));
|
|
49
|
+
let copyArgs = [
|
|
50
|
+
"dependency:copy-dependencies",
|
|
51
|
+
`-DoutputDirectory=${tempDir}`,
|
|
52
|
+
"-U",
|
|
53
|
+
"-Dmdep.copyPom=true",
|
|
54
|
+
"-Dmdep.useRepositoryLayout=true",
|
|
55
|
+
"-Dmdep.includeScope=compile",
|
|
56
|
+
`-Dmdep.prependGroupId=${readEnvironmentVariable("MAVEN_PREPEND_GROUP") || "false"}`,
|
|
57
|
+
`-Dmdep.stripVersion=${readEnvironmentVariable("MAVEN_STRIP_VERSION") || "false"}`,
|
|
58
|
+
];
|
|
59
|
+
if (readEnvironmentVariable("MVN_ARGS")) {
|
|
60
|
+
const addArgs = parseMavenArgs(readEnvironmentVariable("MVN_ARGS"));
|
|
61
|
+
copyArgs = copyArgs.concat(addArgs);
|
|
62
|
+
}
|
|
63
|
+
if (basePath && basePath !== MAVEN_CACHE_DIR) {
|
|
64
|
+
console.log(`Executing '${mavenCmd} in ${basePath}`);
|
|
65
|
+
const result = safeSpawnSync(mavenCmd, copyArgs, {
|
|
66
|
+
cwd: basePath,
|
|
67
|
+
shell: isWin,
|
|
68
|
+
});
|
|
69
|
+
if (result.status !== 0 || result.error) {
|
|
70
|
+
console.error(result.stderr, result.error);
|
|
71
|
+
console.log(
|
|
72
|
+
"You can try the following remediation tips to resolve this error:\n",
|
|
73
|
+
);
|
|
74
|
+
console.log(
|
|
75
|
+
"1. Check if the correct version of maven is installed and available in the PATH. Check if the environment variable MVN_ARGS needs to be set.",
|
|
76
|
+
);
|
|
77
|
+
console.log(
|
|
78
|
+
"2. Perform 'mvn compile package' before invoking this command. Fix any errors found during this invocation.",
|
|
79
|
+
);
|
|
80
|
+
console.log(
|
|
81
|
+
"3. Ensure the temporary directory is available and has sufficient disk space to copy all the artifacts.",
|
|
82
|
+
);
|
|
83
|
+
} else {
|
|
84
|
+
jarNSMapping = await collectJarNS(tempDir);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (includeCacheDir || basePath === MAVEN_CACHE_DIR) {
|
|
88
|
+
// slow operation
|
|
89
|
+
jarNSMapping = await collectJarNS(MAVEN_CACHE_DIR);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Clean up
|
|
93
|
+
if (cleanup && tempDir?.startsWith(tmpdir())) {
|
|
94
|
+
safeRmSync(tempDir, { recursive: true, force: true });
|
|
95
|
+
}
|
|
96
|
+
return jarNSMapping;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Method to collect class names from all jars in a directory
|
|
101
|
+
*
|
|
102
|
+
* @param {string} jarPath Path containing jars
|
|
103
|
+
* @param {object} pomPathMap Map containing jar to pom names. Required to successfully parse gradle cache.
|
|
104
|
+
*
|
|
105
|
+
* @return object containing jar name and class list
|
|
106
|
+
*/
|
|
107
|
+
export async function collectJarNS(jarPath, pomPathMap = {}) {
|
|
108
|
+
const jarNSMapping = {};
|
|
109
|
+
const env = {
|
|
110
|
+
...process.env,
|
|
111
|
+
};
|
|
112
|
+
// jar command usually would not be available in the PATH for windows
|
|
113
|
+
if (isWin && env.JAVA_HOME) {
|
|
114
|
+
env.PATH = `${env.PATH || env.Path}${_delimiter}${join(
|
|
115
|
+
env.JAVA_HOME,
|
|
116
|
+
"bin",
|
|
117
|
+
)}`;
|
|
118
|
+
}
|
|
119
|
+
// Parse jar files to get class names
|
|
120
|
+
const jarFiles = jarPath.endsWith(".jar")
|
|
121
|
+
? [jarPath]
|
|
122
|
+
: getAllFiles(jarPath, "**/*.jar");
|
|
123
|
+
if (jarFiles?.length) {
|
|
124
|
+
for (const jf of jarFiles) {
|
|
125
|
+
let pomname =
|
|
126
|
+
pomPathMap[basename(jf).replace(".jar", ".pom")] ||
|
|
127
|
+
jf.replace(".jar", ".pom");
|
|
128
|
+
let pomData;
|
|
129
|
+
let purl;
|
|
130
|
+
// In some cases, the pom name might be slightly different to the jar name
|
|
131
|
+
if (!safeExistsSync(pomname)) {
|
|
132
|
+
let searchDir = dirname(jf);
|
|
133
|
+
// in case of gradle, there would be hash directory that is different for jar vs pom
|
|
134
|
+
// so we need to start search from a level up
|
|
135
|
+
if (searchDir.includes(join(".gradle", "caches"))) {
|
|
136
|
+
searchDir = join(searchDir, "..");
|
|
137
|
+
}
|
|
138
|
+
const pomSearch = getAllFiles(searchDir, "**/*.pom");
|
|
139
|
+
if (pomSearch && pomSearch.length === 1) {
|
|
140
|
+
pomname = pomSearch[0];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (safeExistsSync(pomname)) {
|
|
144
|
+
// TODO: Replace with parsePom which contains pomPurl
|
|
145
|
+
pomData = parsePomXml(readFileSync(pomname, { encoding: "utf-8" }));
|
|
146
|
+
if (pomData) {
|
|
147
|
+
const purlObj = new Purl({
|
|
148
|
+
type: "maven",
|
|
149
|
+
namespace: pomData.groupId || "" || null,
|
|
150
|
+
name: pomData.artifactId,
|
|
151
|
+
version: pomData.version || null,
|
|
152
|
+
qualifiers: { type: "jar" } || null,
|
|
153
|
+
});
|
|
154
|
+
purl = purlObj.toString();
|
|
155
|
+
}
|
|
156
|
+
} else if (jf.includes(join(".m2", "repository"))) {
|
|
157
|
+
// Let's try our best to construct a purl for .m2 cache entries of the form
|
|
158
|
+
// .m2/repository/org/apache/logging/log4j/log4j-web/3.0.0-SNAPSHOT/log4j-web-3.0.0-SNAPSHOT.jar
|
|
159
|
+
const tmpA = jf.split(join(".m2", "repository", ""));
|
|
160
|
+
if (tmpA?.length) {
|
|
161
|
+
const tmpJarPath = tmpA[tmpA.length - 1];
|
|
162
|
+
// This would yield log4j-web-3.0.0-SNAPSHOT.jar
|
|
163
|
+
const jarFileName = basename(tmpJarPath).replace(".jar", "");
|
|
164
|
+
const tmpDirParts = dirname(tmpJarPath).split(_sep);
|
|
165
|
+
// Retrieve the version
|
|
166
|
+
let jarVersion = tmpDirParts.pop();
|
|
167
|
+
if (jarVersion === "plugins") {
|
|
168
|
+
jarVersion = tmpDirParts.pop();
|
|
169
|
+
if (jarVersion === "eclipse") {
|
|
170
|
+
jarVersion = tmpDirParts.pop();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// The result would form the group name
|
|
174
|
+
let jarGroupName = tmpDirParts.join(".").replace(/^\./, "");
|
|
175
|
+
let qualifierType = "jar";
|
|
176
|
+
// Support for p2 bundles and plugins
|
|
177
|
+
// See https://github.com/CycloneDX/cyclonedx-maven-plugin/issues/137
|
|
178
|
+
// See https://github.com/cdxgen/cdxgen/pull/510#issuecomment-1702551615
|
|
179
|
+
if (jarGroupName.startsWith("p2.osgi.bundle")) {
|
|
180
|
+
jarGroupName = "p2.osgi.bundle";
|
|
181
|
+
qualifierType = "osgi-bundle";
|
|
182
|
+
} else if (jarGroupName.startsWith("p2.eclipse.plugin")) {
|
|
183
|
+
jarGroupName = "p2.eclipse.plugin";
|
|
184
|
+
qualifierType = "eclipse-plugin";
|
|
185
|
+
} else if (jarGroupName.startsWith("p2.binary")) {
|
|
186
|
+
jarGroupName = "p2.binary";
|
|
187
|
+
qualifierType = "eclipse-executable";
|
|
188
|
+
} else if (jarGroupName.startsWith("p2.org.eclipse.update.feature")) {
|
|
189
|
+
jarGroupName = "p2.org.eclipse.update.feature";
|
|
190
|
+
qualifierType = "eclipse-feature";
|
|
191
|
+
}
|
|
192
|
+
const purlObj = new Purl({
|
|
193
|
+
type: "maven",
|
|
194
|
+
namespace: jarGroupName || null,
|
|
195
|
+
name: jarFileName.replace(`-${jarVersion}`, ""),
|
|
196
|
+
version: jarVersion || null,
|
|
197
|
+
qualifiers: { type: qualifierType } || null,
|
|
198
|
+
});
|
|
199
|
+
purl = purlObj.toString();
|
|
200
|
+
}
|
|
201
|
+
} else if (jf.includes(join(".gradle", "caches"))) {
|
|
202
|
+
// Let's try our best to construct a purl for gradle cache entries of the form
|
|
203
|
+
// .gradle/caches/modules-2/files-2.1/org.xmlresolver/xmlresolver/4.2.0/f4dbdaa83d636dcac91c9003ffa7fb173173fe8d/xmlresolver-4.2.0-data.jar
|
|
204
|
+
const tmpA = jf.split(join("files-2.1", ""));
|
|
205
|
+
if (tmpA?.length) {
|
|
206
|
+
const tmpJarPath = tmpA[tmpA.length - 1];
|
|
207
|
+
// This would yield xmlresolver-4.2.0-data.jar
|
|
208
|
+
const jarFileName = basename(tmpJarPath).replace(".jar", "");
|
|
209
|
+
const tmpDirParts = dirname(tmpJarPath).split(_sep);
|
|
210
|
+
// This would remove the hash from the end of the directory name
|
|
211
|
+
tmpDirParts.pop();
|
|
212
|
+
// Retrieve the version
|
|
213
|
+
const jarVersion = tmpDirParts.pop();
|
|
214
|
+
const pkgName = jarFileName.replace(`-${jarVersion}`, "");
|
|
215
|
+
// The result would form the group name
|
|
216
|
+
let jarGroupName = tmpDirParts.join(".").replace(/^\./, "");
|
|
217
|
+
if (jarGroupName.includes(pkgName)) {
|
|
218
|
+
jarGroupName = jarGroupName.replace(`.${pkgName}`, "");
|
|
219
|
+
}
|
|
220
|
+
const purlObj = new Purl({
|
|
221
|
+
type: "maven",
|
|
222
|
+
namespace: jarGroupName || null,
|
|
223
|
+
name: pkgName,
|
|
224
|
+
version: jarVersion || null,
|
|
225
|
+
qualifiers: { type: "jar" } || null,
|
|
226
|
+
});
|
|
227
|
+
purl = purlObj.toString();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// If we have a hit from the cache, use it.
|
|
231
|
+
if (purl && jarNSMapping_cache[purl]) {
|
|
232
|
+
jarNSMapping[purl] = jarNSMapping_cache[purl];
|
|
233
|
+
} else {
|
|
234
|
+
if (DEBUG_MODE) {
|
|
235
|
+
console.log(`Parsing ${jf}`);
|
|
236
|
+
}
|
|
237
|
+
const [nsList, hashValues] = await Promise.all([
|
|
238
|
+
getJarClasses(jf),
|
|
239
|
+
multiChecksumFile(["md5", "sha1", "sha256", "sha512"], jf).catch(
|
|
240
|
+
() => undefined,
|
|
241
|
+
),
|
|
242
|
+
]);
|
|
243
|
+
let hashes;
|
|
244
|
+
if (hashValues) {
|
|
245
|
+
hashes = [
|
|
246
|
+
{ alg: "MD5", content: hashValues["md5"] },
|
|
247
|
+
{ alg: "SHA-1", content: hashValues["sha1"] },
|
|
248
|
+
{ alg: "SHA-256", content: hashValues["sha256"] },
|
|
249
|
+
{ alg: "SHA-512", content: hashValues["sha512"] },
|
|
250
|
+
];
|
|
251
|
+
}
|
|
252
|
+
jarNSMapping[purl || jf] = {
|
|
253
|
+
jarFile: jf,
|
|
254
|
+
pom: pomData,
|
|
255
|
+
namespaces: nsList,
|
|
256
|
+
hashes,
|
|
257
|
+
};
|
|
258
|
+
// Retain in the global cache to speed up future lookups
|
|
259
|
+
if (purl) {
|
|
260
|
+
jarNSMapping_cache[purl] = jarNSMapping[purl];
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (!jarNSMapping) {
|
|
265
|
+
console.log(`Unable to determine class names for the jars in ${jarPath}`);
|
|
266
|
+
}
|
|
267
|
+
} else {
|
|
268
|
+
console.log(
|
|
269
|
+
`${jarPath} did not contain any jars. Try building the project to improve the BOM precision.`,
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
return jarNSMapping;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Convert a JAR namespace mapping (produced by {@link collectJarNS}) into an array
|
|
277
|
+
* of CycloneDX package component objects.
|
|
278
|
+
*
|
|
279
|
+
* Each entry in the mapping is resolved to a component with name, group, version,
|
|
280
|
+
* purl, hashes, namespace properties, and source file evidence.
|
|
281
|
+
*
|
|
282
|
+
* @param {Object} jarNSMapping Map of purl string to `{ jarFile, pom, namespaces, hashes }`
|
|
283
|
+
* @returns {Promise<Object[]>} Array of component objects derived from the JAR mapping
|
|
284
|
+
*/
|
|
285
|
+
export async function convertJarNSToPackages(jarNSMapping) {
|
|
286
|
+
const pkgList = [];
|
|
287
|
+
for (const purl of Object.keys(jarNSMapping)) {
|
|
288
|
+
let { jarFile, pom, namespaces, hashes } = jarNSMapping[purl];
|
|
289
|
+
if (!pom) {
|
|
290
|
+
pom = {};
|
|
291
|
+
}
|
|
292
|
+
let purlObj;
|
|
293
|
+
try {
|
|
294
|
+
purlObj = Purl.parse(purl);
|
|
295
|
+
} catch (_e) {
|
|
296
|
+
// ignore
|
|
297
|
+
purlObj = {};
|
|
298
|
+
}
|
|
299
|
+
const name = pom.artifactId || purlObj.name;
|
|
300
|
+
if (!name) {
|
|
301
|
+
console.warn(
|
|
302
|
+
`Unable to identify the metadata for ${purl}. This will be skipped.`,
|
|
303
|
+
);
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const apackage = {
|
|
307
|
+
name,
|
|
308
|
+
group: pom.groupId || purlObj.namespace || "",
|
|
309
|
+
version: pom.version || purlObj.version,
|
|
310
|
+
description: (pom.description || "").trim(),
|
|
311
|
+
purl,
|
|
312
|
+
"bom-ref": decodeURIComponent(purl),
|
|
313
|
+
hashes,
|
|
314
|
+
evidence: {
|
|
315
|
+
identity: {
|
|
316
|
+
field: "purl",
|
|
317
|
+
confidence: 0.3,
|
|
318
|
+
methods: [
|
|
319
|
+
{
|
|
320
|
+
technique: "filename",
|
|
321
|
+
confidence: 0.3,
|
|
322
|
+
value: jarFile,
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
properties: [
|
|
328
|
+
{
|
|
329
|
+
name: "internal:SrcFile",
|
|
330
|
+
value: jarFile,
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: "internal:Namespaces",
|
|
334
|
+
value: namespaces.join("\n"),
|
|
335
|
+
},
|
|
336
|
+
],
|
|
337
|
+
};
|
|
338
|
+
if (pom.url) {
|
|
339
|
+
apackage["homepage"] = { url: pom.url };
|
|
340
|
+
}
|
|
341
|
+
if (pom.scm) {
|
|
342
|
+
apackage["repository"] = { url: pom.scm };
|
|
343
|
+
}
|
|
344
|
+
pkgList.push(apackage);
|
|
345
|
+
}
|
|
346
|
+
return pkgList;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Deprecated function to parse pom.xml. Use parsePom instead.
|
|
351
|
+
*
|
|
352
|
+
* @deprecated
|
|
353
|
+
* @param pomXmlData XML contents
|
|
354
|
+
* @returns {Object} Parent component data
|
|
355
|
+
*/
|
|
356
|
+
export function parsePomXml(pomXmlData) {
|
|
357
|
+
if (!pomXmlData) {
|
|
358
|
+
return undefined;
|
|
359
|
+
}
|
|
360
|
+
const project = xml2js(pomXmlData, {
|
|
361
|
+
compact: true,
|
|
362
|
+
spaces: 4,
|
|
363
|
+
textKey: "_",
|
|
364
|
+
attributesKey: "$",
|
|
365
|
+
commentKey: "value",
|
|
366
|
+
}).project;
|
|
367
|
+
if (project) {
|
|
368
|
+
let version = project.version ? project.version._ : undefined;
|
|
369
|
+
if (!version && project.parent) {
|
|
370
|
+
version = project.parent.version._;
|
|
371
|
+
}
|
|
372
|
+
let groupId = project.groupId ? project.groupId._ : undefined;
|
|
373
|
+
if (!groupId && project.parent) {
|
|
374
|
+
groupId = project.parent.groupId._;
|
|
375
|
+
}
|
|
376
|
+
return {
|
|
377
|
+
artifactId: project.artifactId ? project.artifactId._ : "",
|
|
378
|
+
groupId,
|
|
379
|
+
version,
|
|
380
|
+
description: project.description ? project.description._ : "",
|
|
381
|
+
url: project.url ? project.url._ : "",
|
|
382
|
+
scm: project.scm?.url ? project.scm.url._ : "",
|
|
383
|
+
licenses: project.licenses?.license,
|
|
384
|
+
organization: project.organization,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Parse a JAR MANIFEST.MF file and return its key-value pairs as an object.
|
|
392
|
+
*
|
|
393
|
+
* @param {string} jarMetadata Raw text contents of a MANIFEST.MF file
|
|
394
|
+
* @returns {Object} Key-value pairs extracted from the manifest
|
|
395
|
+
*/
|
|
396
|
+
export function parseJarManifest(jarMetadata) {
|
|
397
|
+
const metadata = {};
|
|
398
|
+
if (!jarMetadata) {
|
|
399
|
+
return metadata;
|
|
400
|
+
}
|
|
401
|
+
jarMetadata.split("\n").forEach((l) => {
|
|
402
|
+
l = l.replaceAll("\r", "");
|
|
403
|
+
if (l.includes(": ")) {
|
|
404
|
+
const tmpA = l.split(": ");
|
|
405
|
+
if (tmpA && tmpA.length === 2) {
|
|
406
|
+
metadata[tmpA[0]] = tmpA[1].replaceAll("\r", "");
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
return metadata;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Determine whether a manifest candidate looks like a namespace-qualified identifier.
|
|
415
|
+
*
|
|
416
|
+
* @param {string} candidate Manifest field value
|
|
417
|
+
* @returns {boolean} True when candidate appears namespace-qualified
|
|
418
|
+
*/
|
|
419
|
+
function isQualifiedJarNamespace(candidate) {
|
|
420
|
+
return (
|
|
421
|
+
!!candidate &&
|
|
422
|
+
!candidate.includes(" ") &&
|
|
423
|
+
(candidate.includes(".") || candidate.includes("-"))
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Select the most reliable group candidate from JAR manifest metadata.
|
|
429
|
+
*
|
|
430
|
+
* @param {Object} jarMetadata Parsed MANIFEST.MF key-value map
|
|
431
|
+
* @returns {string} Best group candidate, or empty string if none exists
|
|
432
|
+
*/
|
|
433
|
+
export function inferJarGroupFromManifest(jarMetadata = {}) {
|
|
434
|
+
// Keep this ordered from most to least namespace-qualified manifest fields.
|
|
435
|
+
// Extension-Name is intentionally lower priority due to inconsistent usage.
|
|
436
|
+
const qualifiedCandidates = [
|
|
437
|
+
jarMetadata["Bundle-SymbolicName"],
|
|
438
|
+
jarMetadata["Automatic-Module-Name"],
|
|
439
|
+
jarMetadata["Implementation-Title"],
|
|
440
|
+
jarMetadata["Extension-Name"],
|
|
441
|
+
];
|
|
442
|
+
for (const candidate of qualifiedCandidates) {
|
|
443
|
+
if (isQualifiedJarNamespace(candidate)) {
|
|
444
|
+
return candidate;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
return (
|
|
448
|
+
jarMetadata["Implementation-Vendor-Id"] ||
|
|
449
|
+
jarMetadata["Bundle-Vendor"] ||
|
|
450
|
+
jarMetadata["Extension-Name"] ||
|
|
451
|
+
""
|
|
452
|
+
);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Trim group suffix that duplicates the artifact name for compound artifact names.
|
|
457
|
+
*
|
|
458
|
+
* @param {string} group Group candidate
|
|
459
|
+
* @param {string} name Artifact name candidate
|
|
460
|
+
* @returns {string} Adjusted group
|
|
461
|
+
*/
|
|
462
|
+
export function trimJarGroupSuffix(group, name) {
|
|
463
|
+
if (!group || !name || group.startsWith("javax")) {
|
|
464
|
+
return group;
|
|
465
|
+
}
|
|
466
|
+
// Only trim when the artifact name contains a separator (hyphen or dot).
|
|
467
|
+
if (!name.includes("-") && !name.includes(".")) {
|
|
468
|
+
return group;
|
|
469
|
+
}
|
|
470
|
+
const lowerName = name.toLowerCase();
|
|
471
|
+
const dottedName = lowerName.replace(/-/g, ".");
|
|
472
|
+
const dottedSuffix = `.${dottedName}`;
|
|
473
|
+
if (group.endsWith(dottedSuffix)) {
|
|
474
|
+
return group.slice(0, -dottedSuffix.length);
|
|
475
|
+
}
|
|
476
|
+
const lowerSuffix = `.${lowerName}`;
|
|
477
|
+
if (group.endsWith(lowerSuffix)) {
|
|
478
|
+
return group.slice(0, -lowerSuffix.length);
|
|
479
|
+
}
|
|
480
|
+
return group;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Parse a Maven pom.properties file and return its key-value pairs as an object.
|
|
485
|
+
*
|
|
486
|
+
* @param {string} pomProperties Raw text contents of a pom.properties file
|
|
487
|
+
* @returns {Object} Key-value pairs extracted from the properties file
|
|
488
|
+
*/
|
|
489
|
+
export function parsePomProperties(pomProperties) {
|
|
490
|
+
const properties = {};
|
|
491
|
+
if (!pomProperties) {
|
|
492
|
+
return properties;
|
|
493
|
+
}
|
|
494
|
+
pomProperties.split("\n").forEach((l) => {
|
|
495
|
+
l = l.replaceAll("\r", "");
|
|
496
|
+
if (l.includes("=")) {
|
|
497
|
+
const separatorIndex = l.indexOf("=");
|
|
498
|
+
if (separatorIndex !== -1) {
|
|
499
|
+
properties[l.slice(0, separatorIndex)] = l.slice(separatorIndex + 1);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
return properties;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Method to get pom properties from maven directory
|
|
507
|
+
*
|
|
508
|
+
* @param {string} mavenDir Path to maven directory
|
|
509
|
+
*
|
|
510
|
+
* @return array with pom properties
|
|
511
|
+
*/
|
|
512
|
+
export function getPomPropertiesFromMavenDir(mavenDir) {
|
|
513
|
+
let pomProperties = {};
|
|
514
|
+
if (safeExistsSync(mavenDir) && lstatSync(mavenDir).isDirectory()) {
|
|
515
|
+
const pomPropertiesFiles = getAllFiles(mavenDir, "**/pom.properties");
|
|
516
|
+
if (pomPropertiesFiles?.length) {
|
|
517
|
+
const pomPropertiesString = readFileSync(pomPropertiesFiles[0], {
|
|
518
|
+
encoding: "utf-8",
|
|
519
|
+
});
|
|
520
|
+
pomProperties = parsePomProperties(pomPropertiesString);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
return pomProperties;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Method to read a single file entry from a zip file
|
|
528
|
+
*
|
|
529
|
+
* @param {string} zipFile Zip file to read
|
|
530
|
+
* @param {string} filePattern File pattern
|
|
531
|
+
* @param {string} contentEncoding Encoding. Defaults to utf-8
|
|
532
|
+
*
|
|
533
|
+
* @returns {Promise<string|undefined>} File contents
|
|
534
|
+
*/
|
|
535
|
+
export async function readZipEntry(
|
|
536
|
+
zipFile,
|
|
537
|
+
filePattern,
|
|
538
|
+
contentEncoding = "utf-8",
|
|
539
|
+
) {
|
|
540
|
+
/** @type {string|undefined} */
|
|
541
|
+
let retData;
|
|
542
|
+
try {
|
|
543
|
+
const zip = new StreamZip.async({ file: zipFile });
|
|
544
|
+
const entriesCount = await zip.entriesCount;
|
|
545
|
+
if (!entriesCount) {
|
|
546
|
+
return undefined;
|
|
547
|
+
}
|
|
548
|
+
const entries = await zip.entries();
|
|
549
|
+
for (const entry of Object.values(entries)) {
|
|
550
|
+
if (entry.isDirectory) {
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
if (entry.name.endsWith(filePattern)) {
|
|
554
|
+
const fileData = await zip.entryData(entry.name);
|
|
555
|
+
let decoder;
|
|
556
|
+
try {
|
|
557
|
+
let enc = contentEncoding;
|
|
558
|
+
if (enc) {
|
|
559
|
+
const lower = enc.toLowerCase();
|
|
560
|
+
if (lower === "ucs2" || lower === "ucs-2") {
|
|
561
|
+
enc = "utf-16le";
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
decoder = new TextDecoder(enc);
|
|
565
|
+
} catch (_err) {
|
|
566
|
+
decoder = new TextDecoder("utf-8");
|
|
567
|
+
}
|
|
568
|
+
retData = decoder.decode(Buffer.from(fileData));
|
|
569
|
+
break;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
await zip.close();
|
|
573
|
+
} catch (e) {
|
|
574
|
+
console.log(e);
|
|
575
|
+
}
|
|
576
|
+
return retData;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* Read every zip entry whose name contains `pathFragment`. Unlike
|
|
581
|
+
* `readZipEntry`, which returns the first matching entry, this enumerates all
|
|
582
|
+
* matches — needed for PEP 770, where a distribution may carry several SBOM
|
|
583
|
+
* documents under `<dist>.dist-info/sboms/`, in a directory whose name is
|
|
584
|
+
* prefixed by the distribution stem and so is not known in advance.
|
|
585
|
+
*
|
|
586
|
+
* Entries larger than `maxEntryBytes` are skipped without being decompressed,
|
|
587
|
+
* because a wheel is untrusted input and its declared sizes are the only cheap
|
|
588
|
+
* defence against an archive that expands without bound.
|
|
589
|
+
*
|
|
590
|
+
* @param {string} zipFile Path to a zip archive (e.g. a wheel)
|
|
591
|
+
* @param {string} pathFragment Substring an entry name must contain
|
|
592
|
+
* @param {Object} [opts] Options
|
|
593
|
+
* @param {string} [opts.contentEncoding] Text encoding. Defaults to utf-8
|
|
594
|
+
* @param {number} [opts.maxEntryBytes] Per-entry uncompressed size bound
|
|
595
|
+
* @returns {Promise<Array<{name: string, data: string}>>} Matching entries
|
|
596
|
+
*/
|
|
597
|
+
export async function readZipEntriesMatching(
|
|
598
|
+
zipFile,
|
|
599
|
+
pathFragment,
|
|
600
|
+
{ contentEncoding = "utf-8", maxEntryBytes = 5 * 1024 * 1024 } = {},
|
|
601
|
+
) {
|
|
602
|
+
const results = [];
|
|
603
|
+
let zip;
|
|
604
|
+
try {
|
|
605
|
+
zip = new StreamZip.async({ file: zipFile });
|
|
606
|
+
const entries = await zip.entries();
|
|
607
|
+
let decoder;
|
|
608
|
+
try {
|
|
609
|
+
const lower = String(contentEncoding).toLowerCase();
|
|
610
|
+
decoder = new TextDecoder(
|
|
611
|
+
lower === "ucs2" || lower === "ucs-2" ? "utf-16le" : contentEncoding,
|
|
612
|
+
);
|
|
613
|
+
} catch (_err) {
|
|
614
|
+
decoder = new TextDecoder("utf-8");
|
|
615
|
+
}
|
|
616
|
+
for (const entry of Object.values(entries)) {
|
|
617
|
+
if (entry.isDirectory) {
|
|
618
|
+
continue;
|
|
619
|
+
}
|
|
620
|
+
if (pathFragment && !entry.name.includes(pathFragment)) {
|
|
621
|
+
continue;
|
|
622
|
+
}
|
|
623
|
+
if (entry.size > maxEntryBytes) {
|
|
624
|
+
if (DEBUG_MODE) {
|
|
625
|
+
console.log(
|
|
626
|
+
`Skipping ${entry.name} in ${zipFile}: ${entry.size} bytes exceeds the ${maxEntryBytes} byte limit.`,
|
|
627
|
+
);
|
|
628
|
+
}
|
|
629
|
+
continue;
|
|
630
|
+
}
|
|
631
|
+
const fileData = await zip.entryData(entry.name);
|
|
632
|
+
results.push({
|
|
633
|
+
name: entry.name,
|
|
634
|
+
data: decoder.decode(Buffer.from(fileData)),
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
} catch (err) {
|
|
638
|
+
if (DEBUG_MODE) {
|
|
639
|
+
console.log(`Unable to read the entries of ${zipFile}`, err);
|
|
640
|
+
}
|
|
641
|
+
} finally {
|
|
642
|
+
await zip?.close();
|
|
643
|
+
}
|
|
644
|
+
return results;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Method to get the classes and relevant sources in a jar file
|
|
649
|
+
*
|
|
650
|
+
* @param {string} jarFile Jar file to read
|
|
651
|
+
*
|
|
652
|
+
* @returns List of classes and sources matching certain known patterns
|
|
653
|
+
*/
|
|
654
|
+
export async function getJarClasses(jarFile) {
|
|
655
|
+
const retList = [];
|
|
656
|
+
try {
|
|
657
|
+
const zip = new StreamZip.async({ file: jarFile });
|
|
658
|
+
const entriesCount = await zip.entriesCount;
|
|
659
|
+
if (!entriesCount) {
|
|
660
|
+
return [];
|
|
661
|
+
}
|
|
662
|
+
const entries = await zip.entries();
|
|
663
|
+
for (const entry of Object.values(entries)) {
|
|
664
|
+
if (entry.isDirectory) {
|
|
665
|
+
continue;
|
|
666
|
+
}
|
|
667
|
+
if (
|
|
668
|
+
(entry.name.includes(".class") ||
|
|
669
|
+
entry.name.includes(".java") ||
|
|
670
|
+
entry.name.includes(".scala") ||
|
|
671
|
+
entry.name.includes(".groovy") ||
|
|
672
|
+
entry.name.includes(".kt")) &&
|
|
673
|
+
!entry.name.includes("-INF") &&
|
|
674
|
+
!entry.name.includes("module-info")
|
|
675
|
+
) {
|
|
676
|
+
retList.push(
|
|
677
|
+
entry.name
|
|
678
|
+
.replaceAll("\r", "")
|
|
679
|
+
.replace(/\.(class|java|kt|scala|groovy)$/, "")
|
|
680
|
+
.replace(/\/$/, "")
|
|
681
|
+
.replace(/\//g, "."),
|
|
682
|
+
);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
await zip.close();
|
|
686
|
+
} catch (e) {
|
|
687
|
+
// node-stream-zip seems to fail on deno with a RangeError.
|
|
688
|
+
// So we fallback to using jar -tf command
|
|
689
|
+
if (e.name === "RangeError") {
|
|
690
|
+
const jarResult = safeSpawnSync("jar", ["-tf", jarFile], {
|
|
691
|
+
shell: isWin,
|
|
692
|
+
});
|
|
693
|
+
if (
|
|
694
|
+
jarResult?.stderr?.includes(
|
|
695
|
+
"is not recognized as an internal or external command",
|
|
696
|
+
)
|
|
697
|
+
) {
|
|
698
|
+
return retList;
|
|
699
|
+
}
|
|
700
|
+
const consolelines = (jarResult.stdout || "").split("\n");
|
|
701
|
+
return consolelines
|
|
702
|
+
.filter((l) => {
|
|
703
|
+
return (
|
|
704
|
+
(l.includes(".class") ||
|
|
705
|
+
l.includes(".java") ||
|
|
706
|
+
l.includes(".scala") ||
|
|
707
|
+
l.includes(".groovy") ||
|
|
708
|
+
l.includes(".kt")) &&
|
|
709
|
+
!l.includes("-INF") &&
|
|
710
|
+
!l.includes("module-info")
|
|
711
|
+
);
|
|
712
|
+
})
|
|
713
|
+
.map((e) => {
|
|
714
|
+
return e
|
|
715
|
+
.replaceAll("\r", "")
|
|
716
|
+
.replace(/\.(class|java|kt|scala|groovy)$/, "")
|
|
717
|
+
.replace(/\/$/, "")
|
|
718
|
+
.replace(/\//g, ".");
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
return retList;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/**
|
|
726
|
+
* Recursively flatten a Python package's transitive dependencies into the
|
|
727
|
+
* dependencies map and flat package list.
|
|
728
|
+
*
|
|
729
|
+
* @param {Object} dependenciesMap Map of bom-ref to the list of dependent bom-refs, mutated in place
|
|
730
|
+
* @param {Object[]} pkgList Flat list of package component objects, mutated in place
|
|
731
|
+
* @param {string} reqOrSetupFile Path to the requirements.txt or setup.py file used as evidence
|
|
732
|
+
* @param {Object} t Root package object with name, version, and nested dependencies
|
|
733
|
+
* @returns {void}
|
|
734
|
+
*/
|
|
735
|
+
export function flattenDeps(dependenciesMap, pkgList, reqOrSetupFile, t) {
|
|
736
|
+
const tRef = pypiBomRef(t.name, t.version);
|
|
737
|
+
const dependsOn = [];
|
|
738
|
+
for (const d of t.dependencies) {
|
|
739
|
+
const pkgRef = pypiBomRef(d.name, d.version);
|
|
740
|
+
dependsOn.push(pkgRef);
|
|
741
|
+
if (!dependenciesMap[pkgRef]) {
|
|
742
|
+
dependenciesMap[pkgRef] = [];
|
|
743
|
+
}
|
|
744
|
+
const purlString = build({
|
|
745
|
+
type: "pypi",
|
|
746
|
+
namespace: "" || null,
|
|
747
|
+
name: d.name,
|
|
748
|
+
version: d.version || null,
|
|
749
|
+
});
|
|
750
|
+
const apkg = {
|
|
751
|
+
name: d.name,
|
|
752
|
+
version: d.version,
|
|
753
|
+
purl: purlString,
|
|
754
|
+
"bom-ref": decodeURIComponent(purlString),
|
|
755
|
+
};
|
|
756
|
+
if (reqOrSetupFile) {
|
|
757
|
+
apkg.properties = [
|
|
758
|
+
{
|
|
759
|
+
name: "internal:SrcFile",
|
|
760
|
+
value: reqOrSetupFile,
|
|
761
|
+
},
|
|
762
|
+
];
|
|
763
|
+
apkg.evidence = {
|
|
764
|
+
identity: {
|
|
765
|
+
field: "purl",
|
|
766
|
+
confidence: 0.8,
|
|
767
|
+
methods: [
|
|
768
|
+
{
|
|
769
|
+
technique: "manifest-analysis",
|
|
770
|
+
confidence: 0.8,
|
|
771
|
+
value: reqOrSetupFile,
|
|
772
|
+
},
|
|
773
|
+
],
|
|
774
|
+
},
|
|
775
|
+
};
|
|
776
|
+
}
|
|
777
|
+
pkgList.push(apkg);
|
|
778
|
+
// Recurse and flatten
|
|
779
|
+
if (d.dependencies && d.dependencies) {
|
|
780
|
+
flattenDeps(dependenciesMap, pkgList, reqOrSetupFile, d);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
dependenciesMap[tRef] = (dependenciesMap[tRef] || [])
|
|
784
|
+
.concat(dependsOn)
|
|
785
|
+
.sort();
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
/**
|
|
789
|
+
* Comparator function for sorting CycloneDX component objects.
|
|
790
|
+
*
|
|
791
|
+
* Compares components by `bom-ref`, then `purl`, then `name`, using locale-aware
|
|
792
|
+
* string comparison on the first available key.
|
|
793
|
+
*
|
|
794
|
+
* @param {Object|string} a First component to compare
|
|
795
|
+
* @param {Object|string} b Second component to compare
|
|
796
|
+
* @returns {number} Negative, zero, or positive integer as required by Array.sort
|
|
797
|
+
*/
|
|
798
|
+
export function componentSorter(a, b) {
|
|
799
|
+
if (a && b) {
|
|
800
|
+
for (const k of ["bom-ref", "purl", "name"]) {
|
|
801
|
+
if (a[k] && b[k]) {
|
|
802
|
+
return a[k].localeCompare(b[k]);
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
return a.localeCompare(b);
|
|
807
|
+
}
|