@contrast/contrast 1.0.14 → 1.0.16

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.
Files changed (59) hide show
  1. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +2 -2
  2. package/dist/audit/report/commonReportingFunctions.js +1 -19
  3. package/dist/audit/save.js +7 -2
  4. package/dist/{constants.js → cliConstants.js} +70 -31
  5. package/dist/commands/audit/auditConfig.js +2 -2
  6. package/dist/commands/audit/help.js +5 -3
  7. package/dist/commands/auth/auth.js +1 -1
  8. package/dist/commands/config/config.js +1 -1
  9. package/dist/commands/scan/processScan.js +0 -6
  10. package/dist/commands/scan/sca/scaAnalysis.js +64 -33
  11. package/dist/common/HTTPClient.js +25 -4
  12. package/dist/constants/constants.js +10 -2
  13. package/dist/constants/locales.js +7 -30
  14. package/dist/index.js +5 -5
  15. package/dist/sbom/generateSbom.js +18 -1
  16. package/dist/scaAnalysis/common/auditReport.js +3 -2
  17. package/dist/scaAnalysis/common/scaParserForGoAndJava.js +1 -1
  18. package/dist/scaAnalysis/common/scaServicesUpload.js +14 -7
  19. package/dist/scaAnalysis/javascript/scaServiceParser.js +2 -2
  20. package/dist/scaAnalysis/php/phpNewServicesMapper.js +3 -3
  21. package/dist/scaAnalysis/python/analysis.js +1 -1
  22. package/dist/scaAnalysis/repoMode/gradleParser.js +75 -0
  23. package/dist/scaAnalysis/repoMode/index.js +21 -0
  24. package/dist/scaAnalysis/repoMode/mavenParser.js +76 -0
  25. package/dist/scaAnalysis/ruby/analysis.js +4 -4
  26. package/dist/scan/help.js +1 -1
  27. package/dist/scan/scanConfig.js +1 -1
  28. package/dist/utils/commonApi.js +1 -0
  29. package/dist/utils/settingsHelper.js +24 -0
  30. package/package.json +2 -1
  31. package/src/audit/languageAnalysisEngine/sendSnapshot.js +2 -6
  32. package/src/audit/report/commonReportingFunctions.js +1 -23
  33. package/src/audit/save.js +14 -6
  34. package/src/{constants.js → cliConstants.js} +79 -35
  35. package/src/commands/audit/auditConfig.ts +1 -1
  36. package/src/commands/audit/help.ts +4 -2
  37. package/src/commands/auth/auth.js +1 -1
  38. package/src/commands/config/config.js +1 -1
  39. package/src/commands/scan/processScan.js +0 -8
  40. package/src/commands/scan/sca/scaAnalysis.js +85 -54
  41. package/src/common/HTTPClient.js +29 -4
  42. package/src/constants/constants.js +12 -2
  43. package/src/constants/locales.js +9 -44
  44. package/src/index.ts +1 -1
  45. package/src/sbom/generateSbom.ts +20 -0
  46. package/src/scaAnalysis/common/auditReport.js +3 -4
  47. package/src/scaAnalysis/common/scaParserForGoAndJava.js +1 -1
  48. package/src/scaAnalysis/common/scaServicesUpload.js +15 -7
  49. package/src/scaAnalysis/javascript/scaServiceParser.js +8 -2
  50. package/src/scaAnalysis/php/phpNewServicesMapper.js +3 -3
  51. package/src/scaAnalysis/python/analysis.js +1 -1
  52. package/src/scaAnalysis/repoMode/gradleParser.js +88 -0
  53. package/src/scaAnalysis/repoMode/index.js +21 -0
  54. package/src/scaAnalysis/repoMode/mavenParser.js +89 -0
  55. package/src/scaAnalysis/ruby/analysis.js +4 -4
  56. package/src/scan/help.js +1 -1
  57. package/src/scan/scanConfig.js +1 -1
  58. package/src/utils/commonApi.js +1 -0
  59. package/src/utils/settingsHelper.js +26 -0
package/dist/index.js CHANGED
@@ -9,15 +9,15 @@ const processAudit_1 = require("./commands/audit/processAudit");
9
9
  const auth_1 = require("./commands/auth/auth");
10
10
  const config_1 = require("./commands/config/config");
11
11
  const processScan_1 = require("./commands/scan/processScan");
12
- const constants_1 = __importDefault(require("./constants"));
13
- const constants_2 = require("./constants/constants");
12
+ const cliConstants_1 = __importDefault(require("./cliConstants"));
13
+ const constants_1 = require("./constants/constants");
14
14
  const lambda_1 = require("./lambda/lambda");
15
15
  const getConfig_1 = require("./utils/getConfig");
16
16
  const versionChecker_1 = require("./common/versionChecker");
17
17
  const errorHandling_1 = require("./common/errorHandling");
18
18
  const telemetry_1 = require("./telemetry/telemetry");
19
- const { commandLineDefinitions: { mainUsageGuide, mainDefinition } } = constants_1.default;
20
- const config = (0, getConfig_1.localConfig)(constants_2.APP_NAME, constants_2.APP_VERSION);
19
+ const { commandLineDefinitions: { mainUsageGuide, mainDefinition } } = cliConstants_1.default;
20
+ const config = (0, getConfig_1.localConfig)(constants_1.APP_NAME, constants_1.APP_VERSION);
21
21
  const getMainOption = () => {
22
22
  const mainOptions = (0, command_line_args_1.default)(mainDefinition, {
23
23
  stopAtFirstUnknown: true,
@@ -40,7 +40,7 @@ const start = async () => {
40
40
  if (command === 'version' ||
41
41
  argvMain.includes('--v') ||
42
42
  argvMain.includes('--version')) {
43
- console.log(constants_2.APP_VERSION);
43
+ console.log(constants_1.APP_VERSION);
44
44
  await (0, versionChecker_1.findLatestCLIVersion)(config);
45
45
  return;
46
46
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateSbom = void 0;
3
+ exports.generateSCASbom = exports.generateSbom = void 0;
4
4
  const commonApi_1 = require("../utils/commonApi");
5
5
  const generateSbom = (config, type) => {
6
6
  const client = (0, commonApi_1.getHttpClient)(config);
@@ -19,3 +19,20 @@ const generateSbom = (config, type) => {
19
19
  });
20
20
  };
21
21
  exports.generateSbom = generateSbom;
22
+ const generateSCASbom = (config, type, reportId) => {
23
+ const client = (0, commonApi_1.getHttpClient)(config);
24
+ return client
25
+ .getSCASbom(config, type, reportId)
26
+ .then((res) => {
27
+ if (res.statusCode === 200) {
28
+ return res.body;
29
+ }
30
+ else {
31
+ console.log('Unable to retrieve Software Bill of Materials (SBOM)');
32
+ }
33
+ })
34
+ .catch((err) => {
35
+ console.log(err);
36
+ });
37
+ };
38
+ exports.generateSCASbom = generateSCASbom;
@@ -5,6 +5,7 @@ const { assignBySeverity } = require('../../scan/formatScanOutput');
5
5
  const chalk = require('chalk');
6
6
  const { CE_URL } = require('../../constants/constants');
7
7
  const common = require('../../common/fail');
8
+ const i18n = require('i18n');
8
9
  const processAuditReport = (config, results) => {
9
10
  let severityCounts = {};
10
11
  if (results !== undefined) {
@@ -66,8 +67,8 @@ const formatScaServicesReport = (config, results) => {
66
67
  console.log(table.toString() + '\n');
67
68
  printVulnInfo(projectOverviewCount);
68
69
  if (config.host !== CE_URL) {
69
- console.log('\n' + chalk.bold('View your full dependency tree in Contrast:'));
70
- console.log(`${config.host}/Contrast/static/ng/index.html#/${config.organizationId}/applications/${config.applicationId}/libs/dependency-tree`);
70
+ console.log('\n' + chalk.bold(i18n.__('auditServicesMessageForTS')));
71
+ console.log(`${config.host}/Contrast/static/ng/index.html#/${config.organizationId}/applications/${config.applicationId}/libs`);
71
72
  }
72
73
  return projectOverviewCount;
73
74
  }
@@ -11,7 +11,7 @@ const parseDependenciesForSCAServices = dependencyTreeObject => {
11
11
  group: unParsedDependencyTree[dependency].group,
12
12
  version: unParsedDependencyTree[dependency].version,
13
13
  directDependency: unParsedDependencyTree[dependency].type === 'direct',
14
- isProduction: true,
14
+ productionDependency: true,
15
15
  dependencies: subDeps
16
16
  };
17
17
  parsedDependencyTree[dependency] = parsedDependency;
@@ -13,6 +13,9 @@ const scaTreeUpload = async (analysis, config) => {
13
13
  version: APP_VERSION
14
14
  }
15
15
  };
16
+ if (config.branch) {
17
+ requestBody.branchName = config.branch;
18
+ }
16
19
  const client = commonApi.getHttpClient(config);
17
20
  const reportID = await client
18
21
  .scaServiceIngest(requestBody, config)
@@ -27,26 +30,30 @@ const scaTreeUpload = async (analysis, config) => {
27
30
  .catch(err => {
28
31
  throw err;
29
32
  });
30
- console.log(' polling report');
33
+ if (config.debug) {
34
+ console.log(' polling report', reportID);
35
+ }
31
36
  let keepChecking = true;
32
37
  let res;
33
38
  while (keepChecking) {
34
39
  res = await client.scaServiceReportStatus(config, reportID).then(res => {
35
- console.log(res.statusCode);
36
- console.log(res.body);
37
- if (res.body.status == 'COMPLETED') {
40
+ if (config.debug) {
41
+ console.log(res.statusCode);
42
+ console.log(res.body);
43
+ }
44
+ if (res.body.status === 'COMPLETED') {
38
45
  keepChecking = false;
39
46
  return client.scaServiceReport(config, reportID).then(res => {
40
- return res.body;
47
+ return [res.body, reportID];
41
48
  });
42
49
  }
43
50
  });
44
51
  if (!keepChecking) {
45
- return res;
52
+ return [res, reportID];
46
53
  }
47
54
  await requestUtils.sleep(5000);
48
55
  }
49
- return res;
56
+ return [res, reportID];
50
57
  };
51
58
  module.exports = {
52
59
  scaTreeUpload
@@ -20,7 +20,7 @@ const npmCreateDepTree = (dependencyTree, combinedPackageJSONDep, packageLock, r
20
20
  name: key,
21
21
  version: getResolvedVersion(key, packageLock),
22
22
  group: null,
23
- isProduction: checkIfInPackageJSON(rawNode.packageJSON.dependencies, key),
23
+ productionDependency: checkIfInPackageJSON(rawNode.packageJSON.dependencies, key),
24
24
  directDependency: checkIfInPackageJSON(combinedPackageJSONDep, key),
25
25
  dependencies: createNPMChildDependencies(packageLock, key)
26
26
  };
@@ -35,7 +35,7 @@ const yarnCreateDepTree = (dependencyTree, combinedPackageJSONDep, packageLock,
35
35
  name: gav,
36
36
  version: getResolvedVersion(key, packageLock),
37
37
  group: null,
38
- isProduction: checkIfInPackageJSON(rawNode.packageJSON.dependencies, nag),
38
+ productionDependency: checkIfInPackageJSON(rawNode.packageJSON.dependencies, nag),
39
39
  directDependency: checkIfInPackageJSON(combinedPackageJSONDep, nag),
40
40
  dependencies: createChildDependencies(packageLock, key)
41
41
  };
@@ -5,7 +5,7 @@ const parsePHPLockFileForScaServices = phpLockFile => {
5
5
  const packagesDev = keyBy(phpLockFile['packages-dev'], 'name');
6
6
  return merge(buildDepTree(packages, true), buildDepTree(packagesDev, false));
7
7
  };
8
- const buildDepTree = (packages, isProduction) => {
8
+ const buildDepTree = (packages, productionDependency) => {
9
9
  const dependencyTree = {};
10
10
  for (const packagesKey in packages) {
11
11
  const currentObj = packages[packagesKey];
@@ -16,7 +16,7 @@ const buildDepTree = (packages, isProduction) => {
16
16
  name: name,
17
17
  version: currentObj.version,
18
18
  directDependency: true,
19
- isProduction: isProduction,
19
+ productionDependency: productionDependency,
20
20
  dependencies: []
21
21
  };
22
22
  const mergedChildDeps = merge(buildSubDepsIntoFlatStructure(currentObj.require), buildSubDepsIntoFlatStructure(currentObj['require-dev']));
@@ -39,7 +39,7 @@ const buildSubDepsIntoFlatStructure = childDeps => {
39
39
  name: name,
40
40
  version: version,
41
41
  directDependency: false,
42
- isProduction: false,
42
+ productionDependency: false,
43
43
  dependencies: []
44
44
  };
45
45
  }
@@ -32,7 +32,7 @@ const scaPythonParser = pythonDependencies => {
32
32
  pythonParsedDeps[key].version = pythonDependencies[key].version.replace('==', '');
33
33
  pythonParsedDeps[key].group = null;
34
34
  pythonParsedDeps[key].name = key;
35
- pythonParsedDeps[key].isProduction = true;
35
+ pythonParsedDeps[key].productionDependency = true;
36
36
  pythonParsedDeps[key].dependencies = [];
37
37
  pythonParsedDeps[key].directDependency = true;
38
38
  }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ const g2js = require('gradle-to-js/lib/parser');
3
+ const readBuildGradleFile = async (project) => {
4
+ const gradleFilePath = project.cwd + '/build.gradle';
5
+ return await g2js.parseFile(gradleFilePath);
6
+ };
7
+ const filterGav = (groupId, artifactId, version, gradleJson) => {
8
+ if (groupId === '') {
9
+ if (artifactId.includes(':')) {
10
+ groupId = artifactId.split(':')[0].replace("'", '');
11
+ }
12
+ }
13
+ if (version === '') {
14
+ if (artifactId.includes(':')) {
15
+ artifactId.split(':').length > 2
16
+ ? (version = artifactId.split(':')[2].replace("'", ''))
17
+ : (version = null);
18
+ }
19
+ }
20
+ if (artifactId.split(':').length > 1) {
21
+ artifactId = artifactId.split(':')[1].replace("'", '');
22
+ }
23
+ if (version === null) {
24
+ version = getVersion(gradleJson, groupId);
25
+ }
26
+ return { groupId, artifactId, version };
27
+ };
28
+ const parseGradleJson = gradleJson => {
29
+ let deps = gradleJson.dependencies;
30
+ let dependencyTree = {};
31
+ if (deps === undefined) {
32
+ console.log('Unable to find any dependencies in your project file.');
33
+ process.exit(0);
34
+ }
35
+ for (let a in deps) {
36
+ let dependencyType = deps[a].type;
37
+ if (dependencyType === 'implementation') {
38
+ let groupId = deps[a].group;
39
+ let artifactId = deps[a].name;
40
+ let version = deps[a].version;
41
+ let filteredGav = filterGav(groupId, artifactId, version, gradleJson);
42
+ let depName = filteredGav.groupId +
43
+ '/' +
44
+ filteredGav.artifactId +
45
+ '@' +
46
+ filteredGav.version;
47
+ let parsedDependency = {
48
+ name: filteredGav.artifactId,
49
+ group: filteredGav.groupId,
50
+ version: filteredGav.version,
51
+ directDependency: true,
52
+ isProduction: true,
53
+ dependencies: []
54
+ };
55
+ dependencyTree[depName] = parsedDependency;
56
+ }
57
+ }
58
+ return dependencyTree;
59
+ };
60
+ const getVersion = (gradleJson, dependencyWithoutVersion) => {
61
+ let parentVersion = gradleJson.plugins[0].version;
62
+ let parentGroupName = gradleJson.plugins[0].id;
63
+ if (parentGroupName === dependencyWithoutVersion) {
64
+ return parentVersion;
65
+ }
66
+ else {
67
+ return null;
68
+ }
69
+ };
70
+ module.exports = {
71
+ readBuildGradleFile,
72
+ parseGradleJson,
73
+ getVersion,
74
+ filterGav
75
+ };
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ const mavenParser = require('./mavenParser');
3
+ const gradleParser = require('./gradleParser');
4
+ const { determineProjectTypeAndCwd } = require('../java/analysis');
5
+ const buildRepo = async (config, languageFiles) => {
6
+ const project = determineProjectTypeAndCwd(languageFiles.JAVA, config);
7
+ if (project.projectType === 'maven') {
8
+ let jsonPomFile = mavenParser.readPomFile(project);
9
+ mavenParser.parsePomFile(jsonPomFile);
10
+ }
11
+ else if (project.projectType === 'gradle') {
12
+ const gradleJson = gradleParser.readBuildGradleFile(project);
13
+ gradleParser.parseGradleJson(await gradleJson);
14
+ }
15
+ else {
16
+ console.log('Unable to read project files.');
17
+ }
18
+ };
19
+ module.exports = {
20
+ buildRepo
21
+ };
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ const fs = require('fs');
3
+ const xml2js = require('xml2js');
4
+ const readPomFile = project => {
5
+ const mavenFilePath = project.cwd + '/pom.xml';
6
+ const projectFile = fs.readFileSync(mavenFilePath);
7
+ let jsonPomFile;
8
+ xml2js.parseString(projectFile, (err, result) => {
9
+ if (err) {
10
+ throw err;
11
+ }
12
+ const json = JSON.stringify(result, null);
13
+ jsonPomFile = JSON.parse(json);
14
+ });
15
+ return jsonPomFile;
16
+ };
17
+ const getFromVersionsTag = (dependencyName, versionIdentifier, jsonPomFile) => {
18
+ let formattedVersion = versionIdentifier.replace(/[{}]/g, '').replace('$', '');
19
+ if (jsonPomFile.project.properties[0].hasOwnProperty([formattedVersion])) {
20
+ return jsonPomFile.project.properties[0][formattedVersion][0];
21
+ }
22
+ else {
23
+ return null;
24
+ }
25
+ };
26
+ const parsePomFile = jsonPomFile => {
27
+ let dependencyTree = {};
28
+ let parsedVersion;
29
+ let dependencies;
30
+ jsonPomFile.project.hasOwnProperty('dependencies')
31
+ ? (dependencies = jsonPomFile.project.dependencies[0].dependency)
32
+ : (dependencies =
33
+ jsonPomFile.project.dependencyManagement[0].dependencies[0].dependency);
34
+ for (let x in dependencies) {
35
+ let dependencyObject = dependencies[x];
36
+ if (!dependencyObject.hasOwnProperty('version')) {
37
+ parsedVersion = getVersion(jsonPomFile, dependencyObject);
38
+ }
39
+ else {
40
+ dependencyObject.version[0].includes('${versions.')
41
+ ? (parsedVersion = getFromVersionsTag(dependencyObject.artifactId[0], dependencyObject.version[0], jsonPomFile))
42
+ : (parsedVersion = dependencyObject.version[0]);
43
+ }
44
+ let depName = dependencyObject.groupId +
45
+ '/' +
46
+ dependencyObject.artifactId +
47
+ '@' +
48
+ parsedVersion;
49
+ let parsedDependency = {
50
+ name: dependencyObject.artifactId[0],
51
+ group: dependencyObject.groupId[0],
52
+ version: parsedVersion,
53
+ directDependency: true,
54
+ productionDependency: true,
55
+ dependencies: []
56
+ };
57
+ dependencyTree[depName] = parsedDependency;
58
+ }
59
+ return dependencyTree;
60
+ };
61
+ const getVersion = (pomFile, dependencyWithoutVersion) => {
62
+ let parentVersion = pomFile.project.parent[0].version[0];
63
+ let parentGroupName = pomFile.project.parent[0].groupId[0];
64
+ if (parentGroupName === dependencyWithoutVersion.groupId[0]) {
65
+ return parentVersion;
66
+ }
67
+ else {
68
+ return null;
69
+ }
70
+ };
71
+ module.exports = {
72
+ readPomFile,
73
+ getVersion,
74
+ parsePomFile,
75
+ getFromVersionsTag
76
+ };
@@ -263,25 +263,25 @@ const removeRedundantAndPopulateDefinedElements = deps => {
263
263
  delete element.remote;
264
264
  delete element.platform;
265
265
  element.group = null;
266
- element.isProduction = true;
266
+ element.productionDependency = true;
267
267
  }
268
268
  if (element.sourceType === 'GEM') {
269
269
  element.group = null;
270
- element.isProduction = true;
270
+ element.productionDependency = true;
271
271
  delete element.sourceType;
272
272
  delete element.remote;
273
273
  delete element.platform;
274
274
  }
275
275
  if (element.sourceType === 'PATH') {
276
276
  element.group = null;
277
- element.isProduction = true;
277
+ element.productionDependency = true;
278
278
  delete element.platform;
279
279
  delete element.sourceType;
280
280
  delete element.remote;
281
281
  }
282
282
  if (element.sourceType === 'BUNDLED WITH') {
283
283
  element.group = null;
284
- element.isProduction = true;
284
+ element.productionDependency = true;
285
285
  delete element.sourceType;
286
286
  delete element.remote;
287
287
  delete element.branch;
package/dist/scan/help.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const commandLineUsage = require('command-line-usage');
3
3
  const i18n = require('i18n');
4
- const constants = require('../constants');
4
+ const constants = require('../cliConstants');
5
5
  const { commonHelpLinks } = require('../common/commonHelp');
6
6
  const scanUsageGuide = commandLineUsage([
7
7
  {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  const paramHandler = require('../utils/paramsUtil/paramHandler');
3
- const constants = require('../constants.js');
3
+ const constants = require('../cliConstants.js');
4
4
  const path = require('path');
5
5
  const { supportedLanguagesScan } = require('../constants/constants');
6
6
  const i18n = require('i18n');
@@ -18,6 +18,7 @@ const handleResponseErrors = (res, api) => {
18
18
  maxAppError();
19
19
  }
20
20
  else {
21
+ console.log(res.statusCode);
21
22
  genericError(res);
22
23
  }
23
24
  };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ const commonApi = require('./commonApi');
3
+ const { getMode } = require('./generalAPI');
4
+ const { SAAS, MODE_BUILD } = require('../constants/constants');
5
+ const getSettings = async (config) => {
6
+ config.isEOP = (await getMode(config)).toUpperCase() === SAAS ? false : true;
7
+ config.mode = MODE_BUILD;
8
+ config.scaServices = await isSCAServicesAvailable(config);
9
+ return config;
10
+ };
11
+ const isSCAServicesAvailable = async (config) => {
12
+ const client = commonApi.getHttpClient(config);
13
+ return client
14
+ .scaServiceIngests(config)
15
+ .then(res => {
16
+ return res.statusCode !== 403;
17
+ })
18
+ .catch(err => {
19
+ console.log(err);
20
+ });
21
+ };
22
+ module.exports = {
23
+ getSettings
24
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contrast/contrast",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "Contrast Security's command line tool",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -56,6 +56,7 @@
56
56
  "conf": "^10.1.2",
57
57
  "dotenv": "^16.0.0",
58
58
  "fast-glob": "^3.2.11",
59
+ "gradle-to-js": "^2.0.1",
59
60
  "i18n": "^0.14.2",
60
61
  "js-yaml": "^4.1.0",
61
62
  "lodash": "^4.17.21",
@@ -29,11 +29,7 @@ const getTimeout = config => {
29
29
  }
30
30
  }
31
31
 
32
- const pollForSnapshotCompletition = async (
33
- config,
34
- snapshotId,
35
- reportSpinner
36
- ) => {
32
+ const pollForSnapshotCompletion = async (config, snapshotId, reportSpinner) => {
37
33
  const client = commonApi.getHttpClient(config)
38
34
  const startTime = performance.now()
39
35
  const timeout = getTimeout(config)
@@ -76,5 +72,5 @@ const pollForSnapshotCompletition = async (
76
72
  }
77
73
 
78
74
  module.exports = {
79
- pollForSnapshotCompletition: pollForSnapshotCompletition
75
+ pollForSnapshotCompletion
80
76
  }
@@ -256,13 +256,7 @@ function buildBody(cveArray, advice) {
256
256
  function getIssueRow(cveArray) {
257
257
  orderByHighestPriority(cveArray)
258
258
  const cveMessagesList = getIssueCveMsgList(cveArray)
259
- const cveNumbers = getSeverityCounts(cveArray)
260
- const numAndSeverityTypeDesc = getNumOfAndSeverityType(cveNumbers)
261
- return [
262
- chalk.bold('Issue'),
263
- ':',
264
- `${numAndSeverityTypeDesc} ${cveMessagesList.join(', ')}`
265
- ]
259
+ return [chalk.bold('Issue'), ':', `${cveMessagesList.join(', ')}`]
266
260
  }
267
261
 
268
262
  function gatherRemediationAdvice(guidance, libraryName, libraryVersion) {
@@ -282,21 +276,6 @@ function buildFormattedHeaderNum(contrastHeaderNum) {
282
276
  return `CONTRAST-${contrastHeaderNum.toString().padStart(3, '0')}`
283
277
  }
284
278
 
285
- function getNumOfAndSeverityType(cveNumbers) {
286
- const { critical, high, medium, low, note } = cveNumbers
287
-
288
- const criticalMsg = critical > 0 ? `${critical} Critical | ` : ''
289
- const highMsg = high > 0 ? `${high} High | ` : ''
290
- const mediumMsg = medium > 0 ? `${medium} Medium | ` : ''
291
- const lowMsg = low > 0 ? `${low} Low | ` : ''
292
- const noteMsg = note > 0 ? `${note} Note` : ''
293
-
294
- //removes/trims whitespace to single spaces
295
- return `${criticalMsg} ${highMsg} ${mediumMsg} ${lowMsg} ${noteMsg}`
296
- .replace(/\s+/g, ' ')
297
- .trim()
298
- }
299
-
300
279
  const buildFooter = reportModelStructure => {
301
280
  const { critical, high, medium, low, note } =
302
281
  countVulnerableLibrariesBySeverity(reportModelStructure)
@@ -424,7 +403,6 @@ module.exports = {
424
403
  getIssueRow,
425
404
  gatherRemediationAdvice,
426
405
  buildFormattedHeaderNum,
427
- getNumOfAndSeverityType,
428
406
  getIssueCveMsgList,
429
407
  getSeverityCounts,
430
408
  printNoVulnFoundMsg,
package/src/audit/save.js CHANGED
@@ -8,7 +8,7 @@ const {
8
8
  SBOM_SPDX_FILE
9
9
  } = require('../constants/constants')
10
10
 
11
- async function auditSave(config) {
11
+ async function auditSave(config, reportId) {
12
12
  let fileFormat
13
13
  switch (config.save) {
14
14
  case null:
@@ -23,11 +23,19 @@ async function auditSave(config) {
23
23
  }
24
24
 
25
25
  if (fileFormat) {
26
- save.saveFile(
27
- config,
28
- fileFormat,
29
- await sbom.generateSbom(config, fileFormat)
30
- )
26
+ if (config.experimental) {
27
+ save.saveFile(
28
+ config,
29
+ fileFormat,
30
+ await sbom.generateSCASbom(config, fileFormat, reportId)
31
+ )
32
+ } else {
33
+ save.saveFile(
34
+ config,
35
+ fileFormat,
36
+ await sbom.generateSbom(config, fileFormat)
37
+ )
38
+ }
31
39
  const filename = `${config.applicationId}-sbom-${fileFormat}.json`
32
40
  if (fs.existsSync(filename)) {
33
41
  console.log(i18n.__('auditSBOMSaveSuccess') + ` - ${filename}`)