@cyclonedx/cdxgen 8.4.8 → 8.4.10
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/index.js +17 -6
- package/package.json +1 -1
- package/utils.js +54 -26
- package/utils.test.js +22 -1
package/index.js
CHANGED
|
@@ -1167,14 +1167,23 @@ const createJavaBom = async (path, options) => {
|
|
|
1167
1167
|
["true", "1"].includes(multiProjectMode) ||
|
|
1168
1168
|
(gradleFiles.length > 1 && !["false", "0"].includes(multiProjectMode))
|
|
1169
1169
|
) {
|
|
1170
|
-
|
|
1171
|
-
|
|
1170
|
+
let gradleProjectsArgs = ["projects", "-q", "--console", "plain"];
|
|
1171
|
+
if (process.env.GRADLE_ARGS) {
|
|
1172
|
+
const addArgs = process.env.GRADLE_ARGS.split(" ");
|
|
1173
|
+
gradleProjectsArgs = gradleProjectsArgs.concat(addArgs);
|
|
1172
1174
|
}
|
|
1173
|
-
|
|
1175
|
+
console.log(
|
|
1176
|
+
"Executing",
|
|
1174
1177
|
gradleCmd,
|
|
1175
|
-
|
|
1176
|
-
|
|
1178
|
+
gradleProjectsArgs.join(" "),
|
|
1179
|
+
"projects in",
|
|
1180
|
+
path
|
|
1177
1181
|
);
|
|
1182
|
+
const result = spawnSync(gradleCmd, gradleProjectsArgs, {
|
|
1183
|
+
cwd: path,
|
|
1184
|
+
encoding: "utf-8",
|
|
1185
|
+
timeout: TIMEOUT_MS
|
|
1186
|
+
});
|
|
1178
1187
|
if (result.status !== 0 || result.error) {
|
|
1179
1188
|
if (result.stderr) {
|
|
1180
1189
|
console.error(result.stdout, result.stderr);
|
|
@@ -1391,7 +1400,9 @@ const createJavaBom = async (path, options) => {
|
|
|
1391
1400
|
const cmdOutput = Buffer.from(stdout).toString();
|
|
1392
1401
|
const parsedList = utils.parseGradleDep(cmdOutput);
|
|
1393
1402
|
const dlist = parsedList.pkgList;
|
|
1394
|
-
|
|
1403
|
+
if (!parentComponent) {
|
|
1404
|
+
parentComponent = dlist.splice(0, 1)[0];
|
|
1405
|
+
}
|
|
1395
1406
|
if (parsedList.dependenciesList && parsedList.dependenciesList) {
|
|
1396
1407
|
dependencies = mergeDependencies(
|
|
1397
1408
|
dependencies,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyclonedx/cdxgen",
|
|
3
|
-
"version": "8.4.
|
|
3
|
+
"version": "8.4.10",
|
|
4
4
|
"description": "Creates CycloneDX Software Bill-of-Materials (SBOM) from source or container image",
|
|
5
5
|
"homepage": "http://github.com/cyclonedx/cdxgen",
|
|
6
6
|
"author": "Prabhu Subramanian <prabhu@appthreat.com>",
|
package/utils.js
CHANGED
|
@@ -1190,6 +1190,18 @@ const parseGradleDep = function (
|
|
|
1190
1190
|
rootProjectVersion = "latest"
|
|
1191
1191
|
) {
|
|
1192
1192
|
if (typeof rawOutput === "string") {
|
|
1193
|
+
// Bug: 249. Get any sub-projects refered here
|
|
1194
|
+
const retMap = parseGradleProjects(rawOutput);
|
|
1195
|
+
// Issue #289. Work hard to find the root project name
|
|
1196
|
+
if (
|
|
1197
|
+
!rootProjectName ||
|
|
1198
|
+
(rootProjectName === "root" &&
|
|
1199
|
+
retMap &&
|
|
1200
|
+
retMap.rootProject &&
|
|
1201
|
+
retMap.rootProject !== "root")
|
|
1202
|
+
) {
|
|
1203
|
+
rootProjectName = retMap.rootProject;
|
|
1204
|
+
}
|
|
1193
1205
|
let match = "";
|
|
1194
1206
|
// To render dependency tree we need a root project
|
|
1195
1207
|
const rootProject = {
|
|
@@ -1202,10 +1214,10 @@ const parseGradleDep = function (
|
|
|
1202
1214
|
const deps = [rootProject];
|
|
1203
1215
|
const dependenciesList = [];
|
|
1204
1216
|
const keys_cache = {};
|
|
1217
|
+
const deps_keys_cache = {};
|
|
1205
1218
|
let last_level = 0;
|
|
1206
1219
|
let last_purl = `pkg:maven/${rootProjectName}@${rootProjectVersion}?type=jar`;
|
|
1207
|
-
|
|
1208
|
-
const retMap = parseGradleProjects(rawOutput);
|
|
1220
|
+
const first_purl = last_purl;
|
|
1209
1221
|
const level_trees = {};
|
|
1210
1222
|
level_trees[last_purl] = [];
|
|
1211
1223
|
if (retMap && retMap.projects) {
|
|
@@ -1229,30 +1241,45 @@ const parseGradleDep = function (
|
|
|
1229
1241
|
let stack = [last_purl];
|
|
1230
1242
|
const depRegex =
|
|
1231
1243
|
/^.*?--- +(?<group>[^\s:]+):(?<name>[^\s:]+)(?::(?:{strictly [[]?)?(?<versionspecified>[^,\s:}]+))?(?:})?(?:[^->]* +-> +(?<versionoverride>[^\s:]+))?/gm;
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
"
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1244
|
+
for (const rline of rawOutput.split("\n")) {
|
|
1245
|
+
if (last_level !== 1) {
|
|
1246
|
+
if (
|
|
1247
|
+
!rline ||
|
|
1248
|
+
rline.trim() === "" ||
|
|
1249
|
+
rline.startsWith("+--- ") ||
|
|
1250
|
+
rline.startsWith("\\--- ")
|
|
1251
|
+
) {
|
|
1252
|
+
last_level = 1;
|
|
1253
|
+
last_purl = first_purl;
|
|
1254
|
+
stack = [last_purl];
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
while ((match = depRegex.exec(rline))) {
|
|
1258
|
+
const [line, group, name, versionspecified, versionoverride] = match;
|
|
1259
|
+
const version = versionoverride || versionspecified;
|
|
1260
|
+
const level = line.split(group)[0].length / 5;
|
|
1261
|
+
if (version !== undefined) {
|
|
1262
|
+
let purlString = new PackageURL(
|
|
1263
|
+
"maven",
|
|
1264
|
+
group,
|
|
1265
|
+
name,
|
|
1266
|
+
version,
|
|
1267
|
+
{ type: "jar" },
|
|
1268
|
+
null
|
|
1269
|
+
).toString();
|
|
1270
|
+
purlString = decodeURIComponent(purlString);
|
|
1271
|
+
keys_cache[purlString + "_" + last_purl] = true;
|
|
1249
1272
|
if (group !== "project") {
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1273
|
+
// Filter duplicates
|
|
1274
|
+
if (!deps_keys_cache[purlString]) {
|
|
1275
|
+
deps_keys_cache[purlString] = true;
|
|
1276
|
+
deps.push({
|
|
1277
|
+
group,
|
|
1278
|
+
name: name,
|
|
1279
|
+
version: version,
|
|
1280
|
+
qualifiers: { type: "jar" }
|
|
1281
|
+
});
|
|
1282
|
+
}
|
|
1256
1283
|
if (!level_trees[purlString]) {
|
|
1257
1284
|
level_trees[purlString] = [];
|
|
1258
1285
|
}
|
|
@@ -1269,7 +1296,8 @@ const parseGradleDep = function (
|
|
|
1269
1296
|
for (let i = level; i <= last_level; i++) {
|
|
1270
1297
|
stack.pop();
|
|
1271
1298
|
}
|
|
1272
|
-
const last_stack =
|
|
1299
|
+
const last_stack =
|
|
1300
|
+
stack.length > 0 ? stack[stack.length - 1] : first_purl;
|
|
1273
1301
|
const cnodes = level_trees[last_stack] || [];
|
|
1274
1302
|
cnodes.push(purlString);
|
|
1275
1303
|
level_trees[last_stack] = cnodes;
|
package/utils.test.js
CHANGED
|
@@ -205,12 +205,32 @@ test("parse gradle dependencies", () => {
|
|
|
205
205
|
fs.readFileSync("./test/data/gradle-rich5.dep", { encoding: "utf-8" })
|
|
206
206
|
);
|
|
207
207
|
expect(parsedList.pkgList.length).toEqual(68);
|
|
208
|
-
expect(parsedList.dependenciesList.length).toEqual(
|
|
208
|
+
expect(parsedList.dependenciesList.length).toEqual(68);
|
|
209
209
|
parsedList = utils.parseGradleDep(
|
|
210
210
|
fs.readFileSync("./test/data/gradle-out-249.dep", { encoding: "utf-8" })
|
|
211
211
|
);
|
|
212
212
|
expect(parsedList.pkgList.length).toEqual(21);
|
|
213
213
|
expect(parsedList.dependenciesList.length).toEqual(21);
|
|
214
|
+
parsedList = utils.parseGradleDep(
|
|
215
|
+
fs.readFileSync("./test/data/gradle-service.out", { encoding: "utf-8" })
|
|
216
|
+
);
|
|
217
|
+
expect(parsedList.pkgList.length).toEqual(35);
|
|
218
|
+
expect(parsedList.dependenciesList.length).toEqual(35);
|
|
219
|
+
parsedList = utils.parseGradleDep(
|
|
220
|
+
fs.readFileSync("./test/data/gradle-s.out", { encoding: "utf-8" })
|
|
221
|
+
);
|
|
222
|
+
expect(parsedList.pkgList.length).toEqual(28);
|
|
223
|
+
expect(parsedList.dependenciesList.length).toEqual(28);
|
|
224
|
+
parsedList = utils.parseGradleDep(
|
|
225
|
+
fs.readFileSync("./test/data/gradle-core.out", { encoding: "utf-8" })
|
|
226
|
+
);
|
|
227
|
+
expect(parsedList.pkgList.length).toEqual(19);
|
|
228
|
+
expect(parsedList.dependenciesList.length).toEqual(19);
|
|
229
|
+
parsedList = utils.parseGradleDep(
|
|
230
|
+
fs.readFileSync("./test/data/gradle-single.out", { encoding: "utf-8" })
|
|
231
|
+
);
|
|
232
|
+
expect(parsedList.pkgList.length).toEqual(153);
|
|
233
|
+
expect(parsedList.dependenciesList.length).toEqual(153);
|
|
214
234
|
});
|
|
215
235
|
|
|
216
236
|
test("parse gradle projects", () => {
|
|
@@ -933,6 +953,7 @@ test("parse .net cs proj", async () => {
|
|
|
933
953
|
});
|
|
934
954
|
|
|
935
955
|
test("get nget metadata", async () => {
|
|
956
|
+
jest.setTimeout(240000);
|
|
936
957
|
const dep_list = await utils.getNugetMetadata([
|
|
937
958
|
{
|
|
938
959
|
group: "",
|