@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 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
- if (DEBUG_MODE) {
1171
- console.log("Executing", gradleCmd, "projects in", path);
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
- const result = spawnSync(
1175
+ console.log(
1176
+ "Executing",
1174
1177
  gradleCmd,
1175
- ["projects", "-q", "--console", "plain"],
1176
- { cwd: path, encoding: "utf-8", timeout: TIMEOUT_MS }
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
- parentComponent = dlist.splice(0, 1)[0];
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.8",
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
- // Bug: 249. Get any sub-projects refered here
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
- while ((match = depRegex.exec(rawOutput))) {
1233
- const [line, group, name, versionspecified, versionoverride] = match;
1234
- const version = versionoverride || versionspecified;
1235
- const level = line.split(group)[0].length / 5;
1236
- if (version !== undefined) {
1237
- let purlString = new PackageURL(
1238
- "maven",
1239
- group,
1240
- name,
1241
- version,
1242
- { type: "jar" },
1243
- null
1244
- ).toString();
1245
- purlString = decodeURIComponent(purlString);
1246
- // Filter duplicates
1247
- if (!keys_cache[purlString]) {
1248
- keys_cache[purlString] = true;
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
- deps.push({
1251
- group,
1252
- name: name,
1253
- version: version,
1254
- qualifiers: { type: "jar" }
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 = stack[stack.length - 1];
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(69);
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: "",