@contrast/contrast 1.0.15 → 1.0.17

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 (91) hide show
  1. package/dist/audit/catalogueApplication/catalogueApplication.js +1 -1
  2. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +2 -2
  3. package/dist/audit/report/commonReportingFunctions.js +1 -19
  4. package/dist/{constants.js → cliConstants.js} +47 -32
  5. package/dist/commands/audit/auditConfig.js +10 -12
  6. package/dist/commands/audit/auditController.js +12 -16
  7. package/dist/commands/audit/help.js +24 -26
  8. package/dist/commands/audit/processAudit.js +16 -22
  9. package/dist/commands/audit/saveFile.js +3 -9
  10. package/dist/commands/auth/auth.js +1 -1
  11. package/dist/commands/config/config.js +1 -1
  12. package/dist/commands/scan/processScan.js +5 -7
  13. package/dist/commands/scan/sca/scaAnalysis.js +118 -89
  14. package/dist/common/HTTPClient.js +4 -2
  15. package/dist/common/commonHelp.js +35 -17
  16. package/dist/common/errorHandling.js +28 -57
  17. package/dist/common/versionChecker.js +24 -27
  18. package/dist/constants/constants.js +1 -1
  19. package/dist/constants/locales.js +11 -33
  20. package/dist/index.js +5 -5
  21. package/dist/lambda/help.js +2 -1
  22. package/dist/lambda/lambda.js +2 -7
  23. package/dist/scaAnalysis/common/auditReport.js +3 -2
  24. package/dist/scaAnalysis/common/scaParserForGoAndJava.js +1 -1
  25. package/dist/scaAnalysis/java/analysis.js +40 -5
  26. package/dist/scaAnalysis/java/index.js +15 -2
  27. package/dist/scaAnalysis/javascript/scaServiceParser.js +2 -2
  28. package/dist/scaAnalysis/php/phpNewServicesMapper.js +3 -3
  29. package/dist/scaAnalysis/python/analysis.js +1 -1
  30. package/dist/scaAnalysis/repoMode/gradleParser.js +75 -0
  31. package/dist/scaAnalysis/repoMode/index.js +21 -0
  32. package/dist/scaAnalysis/repoMode/mavenParser.js +76 -0
  33. package/dist/scaAnalysis/ruby/analysis.js +4 -4
  34. package/dist/scan/autoDetection.js +12 -3
  35. package/dist/scan/fileUtils.js +24 -1
  36. package/dist/scan/help.js +3 -2
  37. package/dist/scan/saveResults.js +1 -1
  38. package/dist/scan/scanConfig.js +1 -1
  39. package/dist/utils/commonApi.js +10 -1
  40. package/dist/utils/generalAPI.js +1 -2
  41. package/dist/utils/paramsUtil/configStoreParams.js +12 -1
  42. package/dist/utils/paramsUtil/paramHandler.js +7 -1
  43. package/dist/utils/saveFile.js +2 -1
  44. package/package.json +3 -1
  45. package/src/audit/catalogueApplication/catalogueApplication.js +1 -1
  46. package/src/audit/languageAnalysisEngine/sendSnapshot.js +2 -6
  47. package/src/audit/report/commonReportingFunctions.js +1 -23
  48. package/src/{constants.js → cliConstants.js} +53 -36
  49. package/src/commands/audit/auditConfig.js +19 -0
  50. package/src/commands/audit/{auditController.ts → auditController.js} +17 -12
  51. package/src/commands/audit/{help.ts → help.js} +10 -7
  52. package/src/commands/audit/processAudit.js +37 -0
  53. package/src/commands/audit/{saveFile.ts → saveFile.js} +2 -2
  54. package/src/commands/auth/auth.js +1 -1
  55. package/src/commands/config/config.js +1 -1
  56. package/src/commands/scan/processScan.js +4 -10
  57. package/src/commands/scan/sca/scaAnalysis.js +146 -118
  58. package/src/common/HTTPClient.js +4 -2
  59. package/src/common/commonHelp.js +43 -0
  60. package/src/common/{errorHandling.ts → errorHandling.js} +6 -31
  61. package/src/common/{versionChecker.ts → versionChecker.js} +15 -10
  62. package/src/constants/constants.js +1 -1
  63. package/src/constants/locales.js +13 -47
  64. package/src/index.ts +1 -1
  65. package/src/lambda/help.ts +2 -1
  66. package/src/lambda/lambda.ts +2 -10
  67. package/src/scaAnalysis/common/auditReport.js +3 -4
  68. package/src/scaAnalysis/common/scaParserForGoAndJava.js +1 -1
  69. package/src/scaAnalysis/java/analysis.js +43 -10
  70. package/src/scaAnalysis/java/index.js +19 -2
  71. package/src/scaAnalysis/javascript/scaServiceParser.js +8 -2
  72. package/src/scaAnalysis/php/phpNewServicesMapper.js +3 -3
  73. package/src/scaAnalysis/python/analysis.js +1 -1
  74. package/src/scaAnalysis/repoMode/gradleParser.js +88 -0
  75. package/src/scaAnalysis/repoMode/index.js +21 -0
  76. package/src/scaAnalysis/repoMode/mavenParser.js +89 -0
  77. package/src/scaAnalysis/ruby/analysis.js +4 -4
  78. package/src/scan/autoDetection.js +14 -3
  79. package/src/scan/fileUtils.js +29 -1
  80. package/src/scan/help.js +3 -2
  81. package/src/scan/saveResults.js +1 -1
  82. package/src/scan/scanConfig.js +1 -1
  83. package/src/utils/commonApi.js +13 -1
  84. package/src/utils/generalAPI.js +1 -2
  85. package/src/utils/getConfig.ts +1 -0
  86. package/src/utils/paramsUtil/configStoreParams.js +14 -1
  87. package/src/utils/paramsUtil/paramHandler.js +9 -1
  88. package/src/utils/saveFile.js +2 -1
  89. package/src/commands/audit/auditConfig.ts +0 -21
  90. package/src/commands/audit/processAudit.ts +0 -40
  91. package/src/common/commonHelp.ts +0 -13
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
  }
@@ -81,6 +81,7 @@ const lambdaUsageGuide = (0, command_line_usage_1.default)([
81
81
  { name: i18n_1.default.__('lambdaHelpOption'), summary: i18n_1.default.__('helpSummary') }
82
82
  ]
83
83
  },
84
- (0, commonHelp_1.commonHelpLinks)()
84
+ (0, commonHelp_1.commonHelpLinks)()[0],
85
+ (0, commonHelp_1.commonHelpLinks)()[1]
85
86
  ]);
86
87
  exports.lambdaUsageGuide = lambdaUsageGuide;
@@ -23,7 +23,7 @@ const oraWrapper_1 = __importDefault(require("../utils/oraWrapper"));
23
23
  const analytics_1 = require("./analytics");
24
24
  const types_1 = require("./types");
25
25
  const constants_2 = require("../constants/constants");
26
- const chalk_1 = __importDefault(require("chalk"));
26
+ const commonHelp_1 = require("../common/commonHelp");
27
27
  const failedStates = [
28
28
  'UNSUPPORTED',
29
29
  'EXCLUDED',
@@ -110,7 +110,7 @@ const processLambda = async (argv) => {
110
110
  }
111
111
  await (0, analytics_1.postAnalytics)(endCommandAnalytics).catch((error) => {
112
112
  });
113
- postRunMessage();
113
+ (0, commonHelp_1.postRunMessage)('lambda');
114
114
  if (errorMsg) {
115
115
  process.exit(1);
116
116
  }
@@ -193,8 +193,3 @@ const handleLambdaHelp = () => {
193
193
  printHelpMessage();
194
194
  process.exit(0);
195
195
  };
196
- const postRunMessage = () => {
197
- console.log('\n' + chalk_1.default.underline.bold('Other Codesec Features:'));
198
- console.log("'contrast scan' to run CodeSec’s industry leading SAST scanner");
199
- console.log("'contrast audit' to find vulnerabilities in your open source dependencies\n");
200
- };
@@ -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;
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  const child_process = require('child_process');
3
+ const spawn = require('cross-spawn');
3
4
  const path = require('path');
4
5
  const i18n = require('i18n');
5
6
  const fs = require('fs');
7
+ const readLine = require('readline');
8
+ const paramHandler = require('../../utils/paramsUtil/paramHandler');
6
9
  const MAVEN = 'maven';
7
10
  const GRADLE = 'gradle';
8
11
  const determineProjectTypeAndCwd = (files, config) => {
@@ -23,15 +26,20 @@ const determineProjectTypeAndCwd = (files, config) => {
23
26
  };
24
27
  const buildMaven = (config, projectData, timeout) => {
25
28
  let cmdStdout;
26
- let mvn_settings = '';
27
29
  try {
30
+ let command = 'mvn';
31
+ let args = ['dependency:tree', '-B'];
28
32
  if (config.mavenSettingsPath) {
29
- mvn_settings = ' -s ' + config.mavenSettingsPath;
33
+ args.push('-s');
34
+ args.push(config.mavenSettingsPath);
30
35
  }
31
- cmdStdout = child_process.execSync('mvn dependency:tree -B' + mvn_settings, {
36
+ cmdStdout = spawn
37
+ .sync(command, args, {
38
+ env: process.env,
32
39
  cwd: projectData.cwd,
33
40
  timeout
34
- });
41
+ })
42
+ .stdout.toString();
35
43
  return cmdStdout.toString();
36
44
  }
37
45
  catch (err) {
@@ -103,7 +111,34 @@ const getJavaBuildDeps = (config, files) => {
103
111
  console.log(err.message.toString());
104
112
  }
105
113
  };
114
+ const agreementPrompt = async (config) => {
115
+ const rl = readLine.createInterface({
116
+ input: process.stdin,
117
+ output: process.stdout
118
+ });
119
+ return new Promise((resolve, reject) => {
120
+ rl.question('❔ Do you want to continue? Type Y or N', async (input) => {
121
+ if (input.toLowerCase() === 'yes' || input.toLowerCase() === 'y') {
122
+ config.javaAgreement = paramHandler.setAgreement(true);
123
+ rl.close();
124
+ resolve(config);
125
+ }
126
+ else if (input.toLowerCase() === 'no' || input.toLowerCase() === 'n') {
127
+ rl.close();
128
+ resolve(process.exit(1));
129
+ }
130
+ else {
131
+ rl.close();
132
+ console.log('Invalid Input: Exiting');
133
+ resolve(process.exit(1));
134
+ }
135
+ });
136
+ }).catch(e => {
137
+ throw e;
138
+ });
139
+ };
106
140
  module.exports = {
107
141
  getJavaBuildDeps,
108
- determineProjectTypeAndCwd
142
+ determineProjectTypeAndCwd,
143
+ agreementPrompt
109
144
  };
@@ -3,10 +3,13 @@ const analysis = require('./analysis');
3
3
  const { parseBuildDeps } = require('./javaBuildDepsParser');
4
4
  const { createJavaTSMessage } = require('../common/formatMessage');
5
5
  const { parseDependenciesForSCAServices } = require('../common/scaParserForGoAndJava');
6
- const javaAnalysis = (config, languageFiles) => {
6
+ const chalk = require('chalk');
7
+ const _ = require('lodash');
8
+ const javaAnalysis = async (config, languageFiles) => {
7
9
  languageFiles.JAVA.forEach(file => {
8
10
  file.replace('build.gradle.kts', 'build.gradle');
9
11
  });
12
+ await getAgreement(config);
10
13
  const javaDeps = buildJavaTree(config, languageFiles.JAVA);
11
14
  if (config.experimental) {
12
15
  return parseDependenciesForSCAServices(javaDeps);
@@ -15,10 +18,20 @@ const javaAnalysis = (config, languageFiles) => {
15
18
  return createJavaTSMessage(javaDeps);
16
19
  }
17
20
  };
21
+ const getAgreement = async (config) => {
22
+ console.log(chalk.bold('Java project detected'));
23
+ console.log('Java analysis uses maven / gradle which are potentially susceptible to command injection. Be sure that the code you are running Contrast CLI on is trusted before continuing.');
24
+ if (_.isNil(!process.env.CI) && _.isNil(!config.javaAgreement)) {
25
+ console.log('should print');
26
+ return await analysis.agreementPrompt(config);
27
+ }
28
+ return config;
29
+ };
18
30
  const buildJavaTree = (config, files) => {
19
31
  const javaBuildDeps = analysis.getJavaBuildDeps(config, files);
20
32
  return parseBuildDeps(config, javaBuildDeps);
21
33
  };
22
34
  module.exports = {
23
- javaAnalysis
35
+ javaAnalysis,
36
+ getAgreement
24
37
  };
@@ -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;
@@ -1,8 +1,16 @@
1
1
  "use strict";
2
2
  const i18n = require('i18n');
3
3
  const fileFinder = require('./fileUtils');
4
- const rootFile = require('../audit/languageAnalysisEngine/getProjectRootFilenames');
5
- const path = require('path');
4
+ const autoDetectFingerprintInfo = async (filePath) => {
5
+ let complexObj = await fileFinder.findAllFiles(filePath);
6
+ let result = [];
7
+ let count = 0;
8
+ complexObj.forEach(i => {
9
+ count++;
10
+ result.push({ filePath: i, id: count.toString() });
11
+ });
12
+ return result;
13
+ };
6
14
  const autoDetectFileAndLanguage = async (configToUse) => {
7
15
  const entries = await fileFinder.findFile();
8
16
  if (entries.length === 1) {
@@ -78,5 +86,6 @@ module.exports = {
78
86
  autoDetectFileAndLanguage,
79
87
  errorOnFileDetection,
80
88
  autoDetectAuditFilesAndLanguages,
81
- errorOnAuditFileDetection
89
+ errorOnAuditFileDetection,
90
+ autoDetectFingerprintInfo
82
91
  };
@@ -10,6 +10,28 @@ const findFile = async () => {
10
10
  onlyFiles: true
11
11
  });
12
12
  };
13
+ const findAllFiles = async (filePath) => {
14
+ const result = await fg([
15
+ '**/pom.xml',
16
+ '**/build.gradle',
17
+ '**/build.gradle.kts',
18
+ '**/package.json',
19
+ '**/Pipfile',
20
+ '**/*.csproj',
21
+ '**/Gemfile',
22
+ '**/go.mod'
23
+ ], {
24
+ dot: false,
25
+ deep: 2,
26
+ onlyFiles: true,
27
+ absolute: true,
28
+ cwd: filePath ? filePath : process.cwd()
29
+ });
30
+ if (result.length > 0) {
31
+ return result;
32
+ }
33
+ return [];
34
+ };
13
35
  const findFilesJava = async (languagesFound, filePath) => {
14
36
  const result = await fg(['**/pom.xml', '**/build.gradle', '**/build.gradle.kts'], {
15
37
  dot: false,
@@ -136,5 +158,6 @@ module.exports = {
136
158
  findFilesPhp,
137
159
  findFilesRuby,
138
160
  findFilesDotNet,
139
- fileIsEmpty
161
+ fileIsEmpty,
162
+ findAllFiles
140
163
  };
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
  {
@@ -36,7 +36,8 @@ const scanUsageGuide = commandLineUsage([
36
36
  'application-name'
37
37
  ]
38
38
  },
39
- commonHelpLinks()
39
+ commonHelpLinks()[0],
40
+ commonHelpLinks()[1]
40
41
  ]);
41
42
  module.exports = {
42
43
  scanUsageGuide
@@ -3,7 +3,7 @@ const fs = require('fs');
3
3
  const writeResultsToFile = async (responseBody, name = 'results.sarif') => {
4
4
  try {
5
5
  fs.writeFileSync(name, JSON.stringify(responseBody, null, 2));
6
- console.log(`Scan Results saved to ${name}`);
6
+ return name;
7
7
  }
8
8
  catch (err) {
9
9
  console.log('Error writing Scan Results to file');
@@ -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');
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  const HttpClient = require('./../common/HTTPClient');
3
- const { badRequestError, unauthenticatedError, forbiddenError, proxyError, genericError, maxAppError } = require('../common/errorHandling');
3
+ const { badRequestError, unauthenticatedError, forbiddenError, proxyError, genericError, maxAppError, snapshotFailureError, vulnerabilitiesFailureError, reportFailureError } = require('../common/errorHandling');
4
4
  const handleResponseErrors = (res, api) => {
5
5
  if (res.statusCode === 400) {
6
6
  api === 'catalogue' ? badRequestError(true) : badRequestError(false);
@@ -18,6 +18,15 @@ const handleResponseErrors = (res, api) => {
18
18
  maxAppError();
19
19
  }
20
20
  else {
21
+ if (api === 'snapshot' || api === 'catalogue') {
22
+ snapshotFailureError();
23
+ }
24
+ if (api === 'vulnerabilities') {
25
+ vulnerabilitiesFailureError();
26
+ }
27
+ if (api === 'report') {
28
+ reportFailureError();
29
+ }
21
30
  console.log(res.statusCode);
22
31
  genericError(res);
23
32
  }
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  const { featuresTeamServer } = require('./capabilities');
3
3
  const semver = require('semver');
4
- const { handleResponseErrors } = require('../common/errorHandling');
5
4
  const commonApi = require('./commonApi');
6
5
  const { isNil } = require('lodash');
7
6
  const getGlobalProperties = async (config) => {
@@ -13,7 +12,7 @@ const getGlobalProperties = async (config) => {
13
12
  return res.body;
14
13
  }
15
14
  else {
16
- handleResponseErrors(res, 'globalProperties');
15
+ commonApi.handleResponseErrors(res, 'globalProperties');
17
16
  }
18
17
  })
19
18
  .catch(err => {
@@ -15,4 +15,15 @@ const getAuth = () => {
15
15
  }
16
16
  return ContrastConfToUse;
17
17
  };
18
- module.exports = { getAuth: getAuth };
18
+ const getAgreement = () => {
19
+ const ContrastConf = config.localConfig(APP_NAME, APP_VERSION);
20
+ let ContrastConfToUse = {};
21
+ ContrastConfToUse.javaAgreement = ContrastConf.get('javaAgreement');
22
+ return ContrastConfToUse;
23
+ };
24
+ const setAgreement = agreement => {
25
+ const ContrastConf = config.localConfig(APP_NAME, APP_VERSION);
26
+ ContrastConf.set('javaAgreement', agreement);
27
+ return agreement;
28
+ };
29
+ module.exports = { getAuth, getAgreement, setAgreement };
@@ -22,4 +22,10 @@ const getAuth = params => {
22
22
  process.exit(1);
23
23
  }
24
24
  };
25
- module.exports = { getAuth: getAuth };
25
+ const getAgreement = () => {
26
+ return configStoreParams.getAgreement();
27
+ };
28
+ const setAgreement = answer => {
29
+ return configStoreParams.setAgreement(answer);
30
+ };
31
+ module.exports = { getAuth, getAgreement, setAgreement };
@@ -8,7 +8,8 @@ const saveScanFile = async (config, scanResults) => {
8
8
  const scanId = scanResults.scanDetail.id;
9
9
  const client = commonApi.getHttpClient(config);
10
10
  const rawResults = await client.getSpecificScanResultSarif(config, scanId);
11
- await saveResults.writeResultsToFile(rawResults?.body);
11
+ const name = await saveResults.writeResultsToFile(rawResults?.body);
12
+ console.log(`Scan Results saved to ${name}`);
12
13
  }
13
14
  else {
14
15
  console.log(i18n.__('scanNoFiletypeSpecifiedForSave'));