@cdxgen/cdxgen 13.6.0 → 13.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -8
- package/bin/audit.js +7 -4
- package/bin/cdxgen.js +256 -37
- package/bin/convert.js +146 -22
- package/bin/evinse.js +25 -3
- package/bin/repl.js +47 -3
- package/bin/sign.js +211 -34
- package/bin/tracebom.js +18 -6
- package/bin/validate.js +18 -3
- package/bin/verify.js +113 -5
- package/data/behavior-taxonomy.schema.json +1491 -0
- package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
- package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
- package/data/pqc-migration.json +239 -0
- package/data/remediations.json +52 -0
- package/data/rules/cbom-security.yaml +4 -3
- package/data/rules/package-integrity.yaml +28 -0
- package/lib/audit/index.js +25 -3
- package/lib/cli/bomAssembly.js +80 -1
- package/lib/cli/cliOptions.js +121 -17
- package/lib/cli/index.js +609 -898
- package/lib/cli/jsBom.js +3 -0
- package/lib/cli/jvmBom.js +365 -40
- package/lib/cli/managedBom.js +19 -3
- package/lib/cli/nativeBom.js +10 -0
- package/lib/core/env.js +26 -0
- package/lib/core/fs.js +126 -3
- package/lib/core/globPatterns.js +218 -0
- package/lib/core/processTree.js +99 -12
- package/lib/core/projectConfig.js +332 -25
- package/lib/core/toolRegistry.js +15 -1
- package/lib/ecosystems/denoutils.js +2 -2
- package/lib/ecosystems/golem.js +3 -8
- package/lib/ecosystems/gradleutils.js +1082 -6
- package/lib/ecosystems/jsEvidence.js +90 -38
- package/lib/ecosystems/kosi.js +3 -5
- package/lib/ecosystems/npmVersionResolution.js +376 -0
- package/lib/ecosystems/parsers-python.js +89 -28
- package/lib/ecosystems/parsers-rust.js +117 -15
- package/lib/ecosystems/remote/huggingface.js +22 -0
- package/lib/ecosystems/rusi.js +2 -4
- package/lib/ecosystems/scalasem.js +2 -1
- package/lib/evinser/evinser.js +196 -34
- package/lib/evinser/scalasem.js +5 -1
- package/lib/helpers/agenticToolutils.js +112 -1
- package/lib/helpers/bomSigner.js +43 -9
- package/lib/helpers/jssSigner.js +1276 -0
- package/lib/inventory/agentBlueprint.js +193 -0
- package/lib/inventory/agentToolNames.js +145 -0
- package/lib/inventory/aiCollector.js +153 -7
- package/lib/inventory/aiInventory.js +44 -8
- package/lib/inventory/aiProviders.js +324 -0
- package/lib/inventory/bomUtils.js +8 -1
- package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
- package/lib/inventory/citations.js +31 -2
- package/lib/inventory/communityAiConfigParser.js +978 -80
- package/lib/inventory/cyclonedx20.js +152 -0
- package/lib/inventory/cyclonedx20Common.js +286 -0
- package/lib/inventory/cyclonedx20Derived.js +159 -0
- package/lib/inventory/cyclonedx20Parties.js +552 -0
- package/lib/inventory/cyclonedx20Read.js +768 -0
- package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
- package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
- package/lib/inventory/cyclonedx20ReadContext.js +380 -0
- package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
- package/lib/inventory/cyclonedx20ReadSections.js +599 -0
- package/lib/inventory/cyclonedx20Render.js +766 -0
- package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
- package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
- package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
- package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
- package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
- package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
- package/lib/inventory/cyclonedx20RenderSections.js +499 -0
- package/lib/inventory/cyclonedx20Tables.js +594 -0
- package/lib/inventory/deps.js +106 -13
- package/lib/inventory/dosai.js +236 -1
- package/lib/inventory/dosaiParsers.js +3 -6
- package/lib/inventory/dotnetRuntime.js +164 -14
- package/lib/inventory/ecosystemFormulationParsers.js +979 -0
- package/lib/inventory/envcontext.js +132 -38
- package/lib/inventory/evidenceUtils.js +2 -1
- package/lib/inventory/formulationParsers.js +95 -13
- package/lib/inventory/hbom.js +45 -6
- package/lib/inventory/hbomLoader.js +166 -0
- package/lib/inventory/mcpConfigParser.js +5 -0
- package/lib/inventory/occurrenceKey.js +90 -0
- package/lib/inventory/pqcMigration.js +426 -0
- package/lib/inventory/rustFormulationParser.js +21 -10
- package/lib/inventory/source.js +65 -6
- package/lib/parsers/huggingfaceManifest.js +9 -1
- package/lib/parsers/huggingfaceUtils.js +18 -0
- package/lib/parsers/kiroPermissions.js +166 -0
- package/lib/server/server.js +36 -34
- package/lib/stages/postgen/postgen.js +41 -1
- package/lib/stages/postgen/specVersionCompat.js +76 -0
- package/lib/validator/bomValidator.js +8 -1
- package/lib/validator/complianceEngine.js +30 -3
- package/lib/validator/complianceRules.js +1416 -4
- package/lib/validator/generated/validate-2.0.mjs +57554 -13851
- package/lib/validator/index.js +48 -7
- package/lib/validator/reporters/json.js +6 -0
- package/package.json +9 -9
- package/types/bin/repl.d.ts.map +1 -1
- package/types/lib/audit/index.d.ts +6 -2
- package/types/lib/audit/index.d.ts.map +1 -1
- package/types/lib/cli/bomAssembly.d.ts +16 -0
- package/types/lib/cli/bomAssembly.d.ts.map +1 -1
- package/types/lib/cli/cliOptions.d.ts +6 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -1
- package/types/lib/cli/index.d.ts.map +1 -1
- package/types/lib/cli/jsBom.d.ts +2 -1
- package/types/lib/cli/jsBom.d.ts.map +1 -1
- package/types/lib/cli/jvmBom.d.ts +15 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -1
- package/types/lib/cli/managedBom.d.ts.map +1 -1
- package/types/lib/cli/nativeBom.d.ts.map +1 -1
- package/types/lib/core/boundedFile.d.ts +30 -0
- package/types/lib/core/boundedFile.d.ts.map +1 -1
- package/types/lib/core/env.d.ts +10 -0
- package/types/lib/core/env.d.ts.map +1 -1
- package/types/lib/core/fs.d.ts +4 -0
- package/types/lib/core/fs.d.ts.map +1 -1
- package/types/lib/core/globPatterns.d.ts +70 -0
- package/types/lib/core/globPatterns.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +9 -0
- package/types/lib/core/paths.d.ts.map +1 -1
- package/types/lib/core/processTree.d.ts +16 -5
- package/types/lib/core/processTree.d.ts.map +1 -1
- package/types/lib/core/projectConfig.d.ts +47 -8
- package/types/lib/core/projectConfig.d.ts.map +1 -1
- package/types/lib/core/toolRegistry.d.ts.map +1 -1
- package/types/lib/ecosystems/golem.d.ts.map +1 -1
- package/types/lib/ecosystems/gradleutils.d.ts +248 -8
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
- package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
- package/types/lib/ecosystems/kosi.d.ts.map +1 -1
- package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
- package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
- package/types/lib/ecosystems/pythonutils.d.ts +1 -1
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
- package/types/lib/ecosystems/rusi.d.ts.map +1 -1
- package/types/lib/ecosystems/scalasem.d.ts +58 -16
- package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
- package/types/lib/evinser/evinser.d.ts +61 -9
- package/types/lib/evinser/evinser.d.ts.map +1 -1
- package/types/lib/evinser/scalasem.d.ts.map +1 -1
- package/types/lib/helpers/agenticToolutils.d.ts +53 -19
- package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
- package/types/lib/helpers/bomSigner.d.ts +20 -3
- package/types/lib/helpers/bomSigner.d.ts.map +1 -1
- package/types/lib/helpers/jssSigner.d.ts +288 -0
- package/types/lib/helpers/jssSigner.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +303 -19
- package/types/lib/helpers/vsixutils.d.ts.map +1 -1
- package/types/lib/inventory/agentBlueprint.d.ts +70 -0
- package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
- package/types/lib/inventory/agentToolNames.d.ts +51 -0
- package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -1
- package/types/lib/inventory/aiInventory.d.ts.map +1 -1
- package/types/lib/inventory/aiProviders.d.ts +85 -0
- package/types/lib/inventory/aiProviders.d.ts.map +1 -0
- package/types/lib/inventory/bomUtils.d.ts.map +1 -1
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +5 -0
- package/types/lib/inventory/citations.d.ts.map +1 -1
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/cyclonedx20.d.ts +99 -0
- package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +35 -2
- package/types/lib/inventory/deps.d.ts.map +1 -1
- package/types/lib/inventory/dosai.d.ts +19 -0
- package/types/lib/inventory/dosai.d.ts.map +1 -1
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
- package/types/lib/inventory/dotnetRuntime.d.ts +51 -4
- package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -1
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +22 -6
- package/types/lib/inventory/envcontext.d.ts.map +1 -1
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
- package/types/lib/inventory/hbom.d.ts +11 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -1
- package/types/lib/inventory/hbomLoader.d.ts +54 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
- package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
- package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/occurrenceKey.d.ts +52 -0
- package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
- package/types/lib/inventory/pqcMigration.d.ts +84 -0
- package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
- package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
- package/types/lib/inventory/scalaDedupe.d.ts +43 -0
- package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +15 -0
- package/types/lib/inventory/source.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
- package/types/lib/parsers/kiroPermissions.d.ts +62 -0
- package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
- package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
- package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
- package/types/lib/server/server.d.ts.map +1 -1
- package/types/lib/stages/postgen/postgen.d.ts +7 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
- package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
- package/types/lib/validator/bomValidator.d.ts +5 -1
- package/types/lib/validator/bomValidator.d.ts.map +1 -1
- package/types/lib/validator/complianceEngine.d.ts +4 -4
- package/types/lib/validator/complianceEngine.d.ts.map +1 -1
- package/types/lib/validator/complianceRules.d.ts +14 -2
- package/types/lib/validator/complianceRules.d.ts.map +1 -1
- package/types/lib/validator/index.d.ts +10 -0
- package/types/lib/validator/index.d.ts.map +1 -1
- package/types/lib/validator/reporters/json.d.ts.map +1 -1
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// https://learn.microsoft.com/dotnet/core/dependency-loading/default-probing#how-are-the-properties-populated
|
|
12
12
|
|
|
13
13
|
import { closeSync, readSync } from "node:fs";
|
|
14
|
-
import { join } from "node:path";
|
|
14
|
+
import { isAbsolute, join } from "node:path";
|
|
15
15
|
|
|
16
16
|
import { globSync } from "glob";
|
|
17
17
|
|
|
@@ -38,6 +38,12 @@ const DOTNET_ROOTS = [
|
|
|
38
38
|
];
|
|
39
39
|
const RUNTIME_PACK_RE =
|
|
40
40
|
/^(Microsoft\.[A-Za-z]+(?:\.[A-Za-z]+)*\.App\.Runtime\.[A-Za-z0-9.-]+)\/(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)$/;
|
|
41
|
+
// The version shape a runtime pack names, anchored for the versions a line of
|
|
42
|
+
// `dotnet --list-runtimes` reports.
|
|
43
|
+
const RUNTIME_VERSION_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
|
|
44
|
+
// The pre-release label a CPE can name: `rc` or `preview` with its number,
|
|
45
|
+
// written with or without a dot between the label and the number.
|
|
46
|
+
const PRERELEASE_LABEL_RE = /^(rc|preview)\.?(\d+)(?:[.-]|$)/;
|
|
41
47
|
|
|
42
48
|
function readJsonBounded(absPath, rootDir) {
|
|
43
49
|
const opened = openRegularFile(absPath, rootDir);
|
|
@@ -93,27 +99,79 @@ export function runtimePackFromDepsJson(depsJson, framework) {
|
|
|
93
99
|
}
|
|
94
100
|
|
|
95
101
|
/**
|
|
96
|
-
* The
|
|
97
|
-
*
|
|
102
|
+
* The .NET majors whose previews NVD names `preview.<N>`. NVD names the
|
|
103
|
+
* previews of every other .NET major, of ASP.NET Core and of .NET Core
|
|
104
|
+
* `preview<N>`.
|
|
105
|
+
*/
|
|
106
|
+
const DOTTED_PREVIEW_MAJORS = new Set([7, 8, 10]);
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Read the pre-release tag of a runtime version.
|
|
110
|
+
*
|
|
111
|
+
* @param {string} version runtime version
|
|
112
|
+
* @returns {{label: string, number: string}|null|undefined} the `rc` or
|
|
113
|
+
* `preview` tag and its number; undefined for a release; null for a
|
|
114
|
+
* pre-release of any other kind
|
|
115
|
+
*/
|
|
116
|
+
function dotnetPrerelease(version) {
|
|
117
|
+
const dashAt = version.indexOf("-");
|
|
118
|
+
if (dashAt < 0) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
const tag = PRERELEASE_LABEL_RE.exec(version.slice(dashAt + 1));
|
|
122
|
+
return tag ? { label: tag[1], number: tag[2] } : null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The CPE NVD uses for a shared framework version, with the version and update
|
|
127
|
+
* fields spelled the way the NVD CPE dictionary spells them.
|
|
128
|
+
*
|
|
129
|
+
* The product is `.net` from 5.0 on, `.net_core` before it, and `asp.net_core`
|
|
130
|
+
* for ASP.NET Core. NVD names a .NET Core x.y.0 release and its pre-releases
|
|
131
|
+
* with two version parts (`.net_core:3.1`, `.net_core:3.0:preview9`), and the
|
|
132
|
+
* .NET 5.0 pre-releases the same way (`.net:5.0:rc1`); every other version
|
|
133
|
+
* keeps three. A release candidate is `rc<N>`, and a preview is
|
|
134
|
+
* `preview.<N>` for .NET 7, 8 and 10 and `preview<N>` otherwise. A release
|
|
135
|
+
* keeps the `*` update, which is the only one NVD lists for some releases. A
|
|
136
|
+
* pre-release of any other kind names no version NVD has, so it gets no CPE.
|
|
98
137
|
*
|
|
99
138
|
* @param {string} framework framework directory name
|
|
100
139
|
* @param {string} version runtime version
|
|
101
140
|
* @returns {string|undefined} CPE 2.3 string
|
|
102
141
|
*/
|
|
103
142
|
export function dotnetCpe(framework, version) {
|
|
104
|
-
const base = /^(\d+)
|
|
143
|
+
const base = /^(\d+)\.(\d+)\.(\d+)/.exec(version || "");
|
|
105
144
|
if (!base) {
|
|
106
145
|
return undefined;
|
|
107
146
|
}
|
|
108
|
-
const
|
|
147
|
+
const major = Number(base[1]);
|
|
148
|
+
let product;
|
|
109
149
|
if (framework === "Microsoft.AspNetCore.App") {
|
|
110
|
-
|
|
150
|
+
product = "asp.net_core";
|
|
151
|
+
} else if (framework === "Microsoft.NETCore.App") {
|
|
152
|
+
product = major >= 5 ? ".net" : ".net_core";
|
|
153
|
+
} else {
|
|
154
|
+
return undefined;
|
|
111
155
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
return
|
|
156
|
+
const prerelease = dotnetPrerelease(version);
|
|
157
|
+
if (prerelease === null) {
|
|
158
|
+
return undefined;
|
|
115
159
|
}
|
|
116
|
-
|
|
160
|
+
let update = "*";
|
|
161
|
+
if (prerelease?.label === "rc") {
|
|
162
|
+
update = `rc${prerelease.number}`;
|
|
163
|
+
} else if (prerelease) {
|
|
164
|
+
update =
|
|
165
|
+
product === ".net" && DOTTED_PREVIEW_MAJORS.has(major)
|
|
166
|
+
? `preview.${prerelease.number}`
|
|
167
|
+
: `preview${prerelease.number}`;
|
|
168
|
+
}
|
|
169
|
+
const twoPart =
|
|
170
|
+
base[3] === "0" &&
|
|
171
|
+
(product === ".net_core" ||
|
|
172
|
+
(product === ".net" && major === 5 && prerelease !== undefined));
|
|
173
|
+
const cpeVersion = twoPart ? `${base[1]}.${base[2]}` : base[0];
|
|
174
|
+
return `cpe:2.3:a:microsoft:${product}:${cpeVersion}:${update}:*:*:*:*:*:*`;
|
|
117
175
|
}
|
|
118
176
|
|
|
119
177
|
/**
|
|
@@ -121,7 +179,9 @@ export function dotnetCpe(framework, version) {
|
|
|
121
179
|
*
|
|
122
180
|
* @param {string} framework framework directory name
|
|
123
181
|
* @param {{pack: string, version: string, rid: string}} runtime runtime pack
|
|
124
|
-
* @param {string} location root-relative path of the deps.json
|
|
182
|
+
* @param {string} [location] root-relative path of the deps.json. A runtime
|
|
183
|
+
* found on the scanning host gets none, since host paths can name the user's
|
|
184
|
+
* home directory.
|
|
125
185
|
* @returns {Object|undefined} component, or undefined when no purl can be built
|
|
126
186
|
*/
|
|
127
187
|
export function createDotnetRuntimeComponent(framework, runtime, location) {
|
|
@@ -133,10 +193,12 @@ export function createDotnetRuntimeComponent(framework, runtime, location) {
|
|
|
133
193
|
{ name: "cdx:dotnet:sharedFramework", value: framework },
|
|
134
194
|
{ name: "cdx:dotnet:runtimeIdentifier", value: runtime.rid },
|
|
135
195
|
],
|
|
136
|
-
evidence: {
|
|
137
|
-
occurrences: [{ location: `/${location.replace(/^\/+/, "")}` }],
|
|
138
|
-
},
|
|
139
196
|
};
|
|
197
|
+
if (location) {
|
|
198
|
+
component.evidence = {
|
|
199
|
+
occurrences: [{ location: `/${location.replace(/^\/+/, "")}` }],
|
|
200
|
+
};
|
|
201
|
+
}
|
|
140
202
|
const cpe = dotnetCpe(framework, runtime.version);
|
|
141
203
|
if (cpe) {
|
|
142
204
|
component.cpe = cpe;
|
|
@@ -152,6 +214,94 @@ export function createDotnetRuntimeComponent(framework, runtime, location) {
|
|
|
152
214
|
return applyPurl(component, purl);
|
|
153
215
|
}
|
|
154
216
|
|
|
217
|
+
/**
|
|
218
|
+
* Parse the output of `dotnet --list-runtimes`, one `<framework> <version>
|
|
219
|
+
* [<directory>]` line per installed runtime. Warnings, update notices, blank
|
|
220
|
+
* lines, unknown frameworks and versions of a shape no runtime pack names are
|
|
221
|
+
* left out, and no more than MAX_FRAMEWORKS runtimes are kept.
|
|
222
|
+
*
|
|
223
|
+
* https://learn.microsoft.com/dotnet/core/install/how-to-detect-installed-versions
|
|
224
|
+
*
|
|
225
|
+
* @param {string} output output of `dotnet --list-runtimes`
|
|
226
|
+
* @returns {{framework: string, version: string, frameworkDir: string}[]} one
|
|
227
|
+
* entry per installed runtime
|
|
228
|
+
*/
|
|
229
|
+
export function parseDotnetListRuntimes(output) {
|
|
230
|
+
const entries = [];
|
|
231
|
+
if (!output) {
|
|
232
|
+
return entries;
|
|
233
|
+
}
|
|
234
|
+
for (const rawLine of `${output}`.split(/\r?\n/)) {
|
|
235
|
+
if (entries.length >= MAX_FRAMEWORKS) {
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
const line = rawLine.trim();
|
|
239
|
+
// The directory is the text between ` [` and the trailing `]`, and can
|
|
240
|
+
// contain spaces, as in `C:\Program Files\dotnet\shared\Microsoft.NETCore.App`.
|
|
241
|
+
const bracketAt = line.indexOf(" [");
|
|
242
|
+
if (bracketAt <= 0 || !line.endsWith("]")) {
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const head = line.slice(0, bracketAt);
|
|
246
|
+
const spaceAt = head.indexOf(" ");
|
|
247
|
+
if (spaceAt <= 0) {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
const framework = head.slice(0, spaceAt);
|
|
251
|
+
const version = head.slice(spaceAt + 1);
|
|
252
|
+
if (!FRAMEWORKS.has(framework) || !RUNTIME_VERSION_RE.test(version)) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const frameworkDir = line.slice(bracketAt + 2, line.length - 1);
|
|
256
|
+
entries.push({ framework, version, frameworkDir });
|
|
257
|
+
}
|
|
258
|
+
return entries;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Create the platform component for one runtime the host install reports.
|
|
263
|
+
*
|
|
264
|
+
* The identity comes from the deps.json in the runtime's own directory, read
|
|
265
|
+
* with the directory as the root so the read cannot leave it and a symlink is
|
|
266
|
+
* not followed. Only an absolute directory is read, which is what the dotnet
|
|
267
|
+
* host prints. A runtime whose deps.json is missing, unreadable or names
|
|
268
|
+
* another version keeps its name, its version and its CPE, without a purl:
|
|
269
|
+
* without the runtime identifier of the pack there is no correct nuget purl.
|
|
270
|
+
*
|
|
271
|
+
* @param {{framework: string, version: string, frameworkDir: string}} entry
|
|
272
|
+
* one entry of parseDotnetListRuntimes
|
|
273
|
+
* @returns {Object} platform component
|
|
274
|
+
*/
|
|
275
|
+
export function createHostDotnetRuntimeComponent(entry) {
|
|
276
|
+
const depsJson = isAbsolute(entry.frameworkDir)
|
|
277
|
+
? readJsonBounded(
|
|
278
|
+
join(entry.frameworkDir, entry.version, `${entry.framework}.deps.json`),
|
|
279
|
+
entry.frameworkDir,
|
|
280
|
+
)
|
|
281
|
+
: undefined;
|
|
282
|
+
const runtime = runtimePackFromDepsJson(depsJson, entry.framework);
|
|
283
|
+
// The directory a runtime lives in is named after its version.
|
|
284
|
+
if (runtime && runtime.version === entry.version) {
|
|
285
|
+
const component = createDotnetRuntimeComponent(entry.framework, runtime);
|
|
286
|
+
if (component) {
|
|
287
|
+
return component;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const component = {
|
|
291
|
+
type: "platform",
|
|
292
|
+
name: entry.framework,
|
|
293
|
+
version: entry.version,
|
|
294
|
+
properties: [
|
|
295
|
+
{ name: "cdx:dotnet:sharedFramework", value: entry.framework },
|
|
296
|
+
],
|
|
297
|
+
};
|
|
298
|
+
const cpe = dotnetCpe(entry.framework, entry.version);
|
|
299
|
+
if (cpe) {
|
|
300
|
+
component.cpe = cpe;
|
|
301
|
+
}
|
|
302
|
+
return component;
|
|
303
|
+
}
|
|
304
|
+
|
|
155
305
|
/**
|
|
156
306
|
* Find the .NET shared frameworks installed under a root that no package
|
|
157
307
|
* manager owns, and return one platform component per runtime pack.
|