@contrast/contrast 1.0.8 → 1.0.11

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 (217) hide show
  1. package/README.md +2 -2
  2. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +16 -25
  3. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +103 -57
  4. package/dist/audit/languageAnalysisEngine/report/models/reportGuidanceModel.js +6 -0
  5. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +3 -3
  6. package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +1 -0
  7. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +68 -17
  8. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +39 -7
  9. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
  10. package/dist/audit/save.js +21 -13
  11. package/dist/commands/audit/auditConfig.js +3 -19
  12. package/dist/commands/audit/auditController.js +1 -10
  13. package/dist/commands/audit/help.js +7 -24
  14. package/dist/commands/audit/processAudit.js +5 -9
  15. package/dist/commands/audit/saveFile.js +2 -2
  16. package/dist/commands/auth/auth.js +1 -1
  17. package/dist/commands/config/config.js +2 -2
  18. package/dist/commands/scan/processScan.js +11 -4
  19. package/dist/commands/scan/sca/scaAnalysis.js +37 -13
  20. package/dist/common/HTTPClient.js +17 -8
  21. package/dist/common/errorHandling.js +2 -2
  22. package/dist/common/fail.js +66 -0
  23. package/dist/common/versionChecker.js +1 -1
  24. package/dist/constants/constants.js +7 -2
  25. package/dist/constants/locales.js +40 -38
  26. package/dist/constants.js +62 -12
  27. package/dist/index.js +57 -45
  28. package/dist/lambda/lambda.js +5 -2
  29. package/dist/sbom/generateSbom.js +2 -2
  30. package/dist/scaAnalysis/common/formatMessage.js +7 -1
  31. package/dist/scaAnalysis/common/scaParserForGoAndJava.js +32 -0
  32. package/dist/scaAnalysis/common/treeUpload.js +24 -10
  33. package/dist/scaAnalysis/dotnet/analysis.js +55 -0
  34. package/dist/scaAnalysis/dotnet/index.js +10 -0
  35. package/dist/scaAnalysis/go/goAnalysis.js +8 -2
  36. package/dist/scaAnalysis/java/analysis.js +10 -6
  37. package/dist/scaAnalysis/java/index.js +7 -1
  38. package/dist/scaAnalysis/java/javaBuildDepsParser.js +19 -3
  39. package/dist/scaAnalysis/javascript/analysis.js +4 -7
  40. package/dist/scaAnalysis/javascript/index.js +16 -4
  41. package/dist/scaAnalysis/php/analysis.js +14 -33
  42. package/dist/scaAnalysis/php/index.js +11 -4
  43. package/dist/scaAnalysis/python/analysis.js +43 -5
  44. package/dist/scaAnalysis/python/index.js +7 -2
  45. package/dist/scaAnalysis/ruby/analysis.js +16 -14
  46. package/dist/scan/autoDetection.js +13 -24
  47. package/dist/scan/fileUtils.js +31 -12
  48. package/dist/scan/formatScanOutput.js +9 -8
  49. package/dist/scan/populateProjectIdAndProjectName.js +5 -0
  50. package/dist/scan/scan.js +4 -0
  51. package/dist/scan/scanConfig.js +5 -5
  52. package/dist/scan/scanResults.js +39 -3
  53. package/dist/telemetry/telemetry.js +137 -0
  54. package/dist/utils/commonApi.js +1 -1
  55. package/dist/utils/getConfig.js +3 -8
  56. package/dist/utils/parsedCLIOptions.js +3 -1
  57. package/dist/utils/requestUtils.js +7 -1
  58. package/package.json +2 -3
  59. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +21 -57
  60. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +155 -77
  61. package/src/audit/languageAnalysisEngine/report/models/reportGuidanceModel.ts +5 -0
  62. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +5 -5
  63. package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +2 -0
  64. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +56 -27
  65. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +45 -6
  66. package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
  67. package/src/audit/save.js +32 -16
  68. package/src/commands/audit/auditConfig.ts +10 -28
  69. package/src/commands/audit/auditController.ts +0 -11
  70. package/src/commands/audit/help.ts +7 -24
  71. package/src/commands/audit/processAudit.ts +16 -8
  72. package/src/commands/audit/saveFile.ts +2 -2
  73. package/src/commands/auth/auth.js +3 -1
  74. package/src/commands/config/config.js +4 -2
  75. package/src/commands/scan/processScan.js +18 -5
  76. package/src/commands/scan/sca/scaAnalysis.js +50 -18
  77. package/src/common/HTTPClient.js +23 -9
  78. package/src/common/errorHandling.ts +2 -3
  79. package/src/common/fail.js +75 -0
  80. package/src/common/versionChecker.ts +1 -1
  81. package/src/constants/constants.js +9 -3
  82. package/src/constants/locales.js +70 -45
  83. package/src/constants.js +67 -13
  84. package/src/index.ts +91 -66
  85. package/src/lambda/lambda.ts +5 -2
  86. package/src/lambda/types.ts +1 -0
  87. package/src/sbom/generateSbom.ts +2 -2
  88. package/src/scaAnalysis/common/formatMessage.js +8 -1
  89. package/src/scaAnalysis/common/scaParserForGoAndJava.js +41 -0
  90. package/src/scaAnalysis/common/treeUpload.js +25 -11
  91. package/src/scaAnalysis/dotnet/analysis.js +72 -0
  92. package/src/scaAnalysis/dotnet/index.js +11 -0
  93. package/src/scaAnalysis/go/goAnalysis.js +9 -2
  94. package/src/scaAnalysis/java/analysis.js +11 -6
  95. package/src/scaAnalysis/java/index.js +9 -1
  96. package/src/scaAnalysis/java/javaBuildDepsParser.js +25 -6
  97. package/src/scaAnalysis/javascript/analysis.js +6 -7
  98. package/src/scaAnalysis/javascript/index.js +25 -6
  99. package/src/scaAnalysis/php/analysis.js +15 -35
  100. package/src/scaAnalysis/php/index.js +15 -4
  101. package/src/scaAnalysis/python/analysis.js +49 -5
  102. package/src/scaAnalysis/python/index.js +7 -2
  103. package/src/scaAnalysis/ruby/analysis.js +18 -15
  104. package/src/scan/autoDetection.js +14 -27
  105. package/src/scan/fileUtils.js +33 -12
  106. package/src/scan/formatScanOutput.ts +10 -8
  107. package/src/scan/populateProjectIdAndProjectName.js +5 -1
  108. package/src/scan/scan.ts +4 -0
  109. package/src/scan/scanConfig.js +7 -7
  110. package/src/scan/scanResults.js +46 -3
  111. package/src/telemetry/telemetry.ts +154 -0
  112. package/src/utils/commonApi.js +1 -1
  113. package/src/utils/getConfig.ts +5 -18
  114. package/src/utils/parsedCLIOptions.js +14 -1
  115. package/src/utils/requestUtils.js +8 -1
  116. package/dist/audit/AnalysisEngine.js +0 -37
  117. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  118. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  119. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  120. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  121. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  122. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  123. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  124. package/dist/audit/goAnalysisEngine/index.js +0 -17
  125. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  126. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  127. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  128. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  129. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -155
  130. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  131. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  132. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  133. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -25
  134. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
  135. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  136. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
  137. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  138. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  139. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  140. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -66
  141. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -166
  142. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  143. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  144. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  145. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  146. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  147. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  148. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  149. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  150. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  151. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  152. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  153. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  154. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  155. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  156. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  157. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  158. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  159. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  160. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  161. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  162. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  163. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  164. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  165. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  166. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  167. package/src/audit/AnalysisEngine.js +0 -103
  168. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  169. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  170. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  171. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  172. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  173. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  174. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  175. package/src/audit/goAnalysisEngine/index.js +0 -18
  176. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  177. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  178. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  179. package/src/audit/javaAnalysisEngine/index.js +0 -41
  180. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -225
  181. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  182. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  183. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  184. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -36
  185. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
  186. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  187. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
  188. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  189. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  190. package/src/audit/languageAnalysisEngine/index.js +0 -45
  191. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -96
  192. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -251
  193. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  194. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  195. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  196. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  197. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  198. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  199. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  200. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  201. package/src/audit/phpAnalysisEngine/index.js +0 -27
  202. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  203. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  204. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  205. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  206. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  207. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  208. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  209. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  210. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  211. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  212. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  213. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  214. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  215. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  216. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  217. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
@@ -6,26 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getAuditConfig = void 0;
7
7
  const paramHandler_1 = __importDefault(require("../../utils/paramsUtil/paramHandler"));
8
8
  const constants_1 = __importDefault(require("../../constants"));
9
- const parsedCLIOptions_1 = __importDefault(require("../../utils/parsedCLIOptions"));
10
- const constants_2 = __importDefault(require("../../audit/languageAnalysisEngine/constants"));
11
- const autoDetectLanguage_1 = require("../../audit/autodetection/autoDetectLanguage");
12
- const { supportedLanguages: { NODE, JAVASCRIPT } } = constants_2.default;
13
- const getAuditConfig = (argv) => {
14
- const auditParameters = parsedCLIOptions_1.default.getCommandLineArgsCustom(argv, constants_1.default.commandLineDefinitions.auditOptionDefinitions);
9
+ const parsedCLIOptions_1 = require("../../utils/parsedCLIOptions");
10
+ const getAuditConfig = async (contrastConf, command, argv) => {
11
+ const auditParameters = await (0, parsedCLIOptions_1.getCommandLineArgsCustom)(contrastConf, command, argv, constants_1.default.commandLineDefinitions.auditOptionDefinitions);
15
12
  const paramsAuth = paramHandler_1.default.getAuth(auditParameters);
16
- if (auditParameters.language === undefined ||
17
- auditParameters.language === null) {
18
- try {
19
- auditParameters.language = (0, autoDetectLanguage_1.determineProjectLanguage)((0, autoDetectLanguage_1.identifyLanguages)(auditParameters));
20
- }
21
- catch (err) {
22
- console.log(err.message);
23
- process.exit(1);
24
- }
25
- }
26
- else if (auditParameters.language.toUpperCase() === JAVASCRIPT) {
27
- auditParameters.language = NODE.toLowerCase();
28
- }
29
13
  return { ...paramsAuth, ...auditParameters };
30
14
  };
31
15
  exports.getAuditConfig = getAuditConfig;
@@ -3,11 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getAppName = exports.startAudit = exports.dealWithNoAppId = void 0;
6
+ exports.getAppName = exports.dealWithNoAppId = void 0;
7
7
  const catalogueApplication_1 = require("../../audit/catalogueApplication/catalogueApplication");
8
8
  const commonApi_1 = __importDefault(require("../../audit/languageAnalysisEngine/commonApi"));
9
- const identifyLanguageAE = require('./../../audit/languageAnalysisEngine');
10
- const languageFactory = require('../../audit/languageAnalysisEngine/languageAnalysisFactory');
11
9
  const dealWithNoAppId = async (config) => {
12
10
  let appID;
13
11
  try {
@@ -33,13 +31,6 @@ const dealWithNoAppId = async (config) => {
33
31
  return appID;
34
32
  };
35
33
  exports.dealWithNoAppId = dealWithNoAppId;
36
- const startAudit = async (config) => {
37
- if (!config.applicationId) {
38
- config.applicationId = await (0, exports.dealWithNoAppId)(config);
39
- }
40
- identifyLanguageAE(config.file, languageFactory, config.applicationId, config);
41
- };
42
- exports.startAudit = startAudit;
43
34
  const getAppName = (file) => {
44
35
  const last = file.charAt(file.length - 1);
45
36
  if (last !== '/') {
@@ -18,30 +18,13 @@ const auditUsageGuide = (0, command_line_usage_1.default)([
18
18
  '{bold ' +
19
19
  i18n_1.default.__('constantsAuditPrerequisitesContentSupportedLanguages') +
20
20
  '}',
21
- '{bold ' +
22
- i18n_1.default.__('constantsAuditPrerequisitesContentJava') +
23
- '}' +
24
- i18n_1.default.__('constantsAuditPrerequisitesContentMessage'),
25
- '',
26
- '{italic ' + i18n_1.default.__('constantsJavaNote') + '}',
27
- '{italic ' + i18n_1.default.__('constantsJavaNoteGradle') + '}',
28
- '',
29
- '{bold ' +
30
- i18n_1.default.__('constantsAuditPrerequisitesContentDotNet') +
31
- '}' +
32
- i18n_1.default.__('constantsAuditPrerequisitesContentDotNetMessage'),
33
- '{bold ' +
34
- i18n_1.default.__('constantsAuditPrerequisitesContentLanguageNode') +
35
- '}' +
36
- i18n_1.default.__('constantsAuditPrerequisitesContentLanguageNodeMessage'),
37
- '{bold ' +
38
- i18n_1.default.__('constantsAuditPrerequisitesContentLanguageRuby') +
39
- '}' +
40
- i18n_1.default.__('constantsAuditPrerequisitesContentLanguageRubyMessage'),
41
- '{bold ' +
42
- i18n_1.default.__('constantsAuditPrerequisitesContentLanguagePython') +
43
- '}' +
44
- i18n_1.default.__('constantsAuditPrerequisitesContentLanguagePythonMessage')
21
+ i18n_1.default.__('constantsAuditPrerequisitesJavaContentMessage'),
22
+ i18n_1.default.__('constantsAuditPrerequisitesContentDotNetMessage'),
23
+ i18n_1.default.__('constantsAuditPrerequisitesContentNodeMessage'),
24
+ i18n_1.default.__('constantsAuditPrerequisitesContentRubyMessage'),
25
+ i18n_1.default.__('constantsAuditPrerequisitesContentPythonMessage'),
26
+ i18n_1.default.__('constantsAuditPrerequisitesContentGoMessage'),
27
+ i18n_1.default.__('constantsAuditPrerequisitesContentPHPMessage')
45
28
  ]
46
29
  },
47
30
  {
@@ -1,22 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.processAudit = void 0;
4
- const auditController_1 = require("./auditController");
5
4
  const auditConfig_1 = require("./auditConfig");
6
5
  const help_1 = require("./help");
7
6
  const scaAnalysis_1 = require("../scan/sca/scaAnalysis");
8
- const processAudit = async (argv) => {
7
+ const telemetry_1 = require("../../telemetry/telemetry");
8
+ const processAudit = async (contrastConf, argv) => {
9
9
  if (argv.indexOf('--help') != -1) {
10
10
  printHelpMessage();
11
11
  process.exit(0);
12
12
  }
13
- const config = (0, auditConfig_1.getAuditConfig)(argv);
14
- if (config.experimental) {
15
- await (0, scaAnalysis_1.processSca)(config);
16
- }
17
- else {
18
- await (0, auditController_1.startAudit)(config);
19
- }
13
+ const config = await (0, auditConfig_1.getAuditConfig)(contrastConf, 'audit', argv);
14
+ await (0, scaAnalysis_1.processSca)(config);
15
+ await (0, telemetry_1.sendTelemetryConfigAsObject)(config, 'audit', argv, 'SUCCESS', config.language);
20
16
  };
21
17
  exports.processAudit = processAudit;
22
18
  const printHelpMessage = () => {
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.saveFile = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
- const saveFile = (config, rawResults) => {
9
- const fileName = `${config.applicationId}-sbom-cyclonedx.json`;
8
+ const saveFile = (config, type, rawResults) => {
9
+ const fileName = `${config.applicationId}-sbom-${type}.json`;
10
10
  fs_1.default.writeFileSync(fileName, JSON.stringify(rawResults));
11
11
  };
12
12
  exports.saveFile = saveFile;
@@ -11,7 +11,7 @@ const parsedCLIOptions = require('../../utils/parsedCLIOptions');
11
11
  const constants = require('../../constants');
12
12
  const commandLineUsage = require('command-line-usage');
13
13
  const processAuth = async (argv, config) => {
14
- let authParams = parsedCLIOptions.getCommandLineArgsCustom(argv, constants.commandLineDefinitions.authOptionDefinitions);
14
+ let authParams = await parsedCLIOptions.getCommandLineArgsCustom(config, 'auth', argv, constants.commandLineDefinitions.authOptionDefinitions);
15
15
  if (authParams.help) {
16
16
  console.log(authUsageGuide);
17
17
  process.exit(0);
@@ -3,9 +3,9 @@ const parsedCLIOptions = require('../../utils/parsedCLIOptions');
3
3
  const constants = require('../../constants');
4
4
  const commandLineUsage = require('command-line-usage');
5
5
  const i18n = require('i18n');
6
- const processConfig = (argv, config) => {
6
+ const processConfig = async (argv, config) => {
7
7
  try {
8
- let configParams = parsedCLIOptions.getCommandLineArgsCustom(argv, constants.commandLineDefinitions.configOptionDefinitions);
8
+ let configParams = await parsedCLIOptions.getCommandLineArgsCustom(config, 'config', argv, constants.commandLineDefinitions.configOptionDefinitions);
9
9
  if (configParams.help) {
10
10
  console.log(configUsageGuide);
11
11
  process.exit(0);
@@ -5,18 +5,25 @@ const { saveScanFile } = require('../../utils/saveFile');
5
5
  const { ScanResultsModel } = require('../../scan/models/scanResultsModel');
6
6
  const { formatScanOutput } = require('../../scan/formatScanOutput');
7
7
  const { processSca } = require('./sca/scaAnalysis');
8
- const processScan = async (argvMain) => {
9
- let config = scanConfig.getScanConfig(argvMain);
8
+ const common = require('../../common/fail');
9
+ const { sendTelemetryConfigAsObject } = require('../../telemetry/telemetry');
10
+ const processScan = async (contrastConf, argv) => {
11
+ let config = await scanConfig.getScanConfig(contrastConf, 'scan', argv);
12
+ let output = undefined;
10
13
  if (config.experimental) {
11
- await processSca(config);
14
+ await processSca(config, argv);
12
15
  }
13
16
  let scanResults = new ScanResultsModel(await startScan(config));
17
+ await sendTelemetryConfigAsObject(config, 'scan', argv, 'SUCCESS', scanResults.scanDetail.language);
14
18
  if (scanResults.scanResultsInstances !== undefined) {
15
- formatScanOutput(scanResults);
19
+ output = formatScanOutput(scanResults);
16
20
  }
17
21
  if (config.save !== undefined) {
18
22
  await saveScanFile(config, scanResults);
19
23
  }
24
+ if (config.fail) {
25
+ common.processFail(config, output);
26
+ }
20
27
  };
21
28
  module.exports = {
22
29
  processScan
@@ -2,9 +2,8 @@
2
2
  const autoDetection = require('../../../scan/autoDetection');
3
3
  const javaAnalysis = require('../../../scaAnalysis/java');
4
4
  const treeUpload = require('../../../scaAnalysis/common/treeUpload');
5
- const { manualDetectAuditFilesAndLanguages } = require('../../../scan/autoDetection');
6
5
  const auditController = require('../../audit/auditController');
7
- const { supportedLanguages: { JAVA, GO, PYTHON, RUBY, JAVASCRIPT, NODE, PHP } } = require('../../../audit/languageAnalysisEngine/constants');
6
+ const { supportedLanguages: { JAVA, GO, PYTHON, RUBY, JAVASCRIPT, NODE, PHP, DOTNET } } = require('../../../constants/constants');
8
7
  const goAnalysis = require('../../../scaAnalysis/go/goAnalysis');
9
8
  const phpAnalysis = require('../../../scaAnalysis/php/index');
10
9
  const { rubyAnalysis } = require('../../../scaAnalysis/ruby');
@@ -15,15 +14,26 @@ const { returnOra, startSpinner, succeedSpinner } = require('../../../utils/oraW
15
14
  const i18n = require('i18n');
16
15
  const { vulnerabilityReportV2 } = require('../../../audit/languageAnalysisEngine/report/reportingFeature');
17
16
  const auditSave = require('../../../audit/save');
17
+ const { dotNetAnalysis } = require('../../../scaAnalysis/dotnet');
18
+ const { auditUsageGuide } = require('../../audit/help');
19
+ const rootFile = require('../../../audit/languageAnalysisEngine/getProjectRootFilenames');
20
+ const path = require('path');
18
21
  const processSca = async (config) => {
22
+ const startTime = performance.now();
19
23
  let filesFound;
20
- if (config.file) {
21
- config.file = config.file.concat('/');
22
- filesFound = await manualDetectAuditFilesAndLanguages(config.file);
24
+ if (config.help) {
25
+ console.log(auditUsageGuide);
26
+ process.exit(0);
23
27
  }
24
- else {
25
- filesFound = await autoDetection.autoDetectAuditFilesAndLanguages(config);
26
- config.file = process.cwd().concat('/');
28
+ const projectStats = await rootFile.getProjectStats(config.file);
29
+ let pathWithFile = projectStats.isFile();
30
+ config.fileName = config.file;
31
+ config.file = pathWithFile
32
+ ? rootFile.getDirectoryFromPathGiven(config.file).concat('/')
33
+ : config.file;
34
+ filesFound = await autoDetection.autoDetectAuditFilesAndLanguages(config.file);
35
+ if (filesFound.length > 1 && pathWithFile) {
36
+ filesFound = filesFound.filter(i => Object.values(i)[0].includes(path.basename(config.fileName)));
27
37
  }
28
38
  let messageToSend = undefined;
29
39
  if (filesFound.length === 1) {
@@ -52,27 +62,41 @@ const processSca = async (config) => {
52
62
  messageToSend = goAnalysis.goAnalysis(config, filesFound[0]);
53
63
  config.language = GO;
54
64
  break;
65
+ case DOTNET:
66
+ messageToSend = dotNetAnalysis(config, filesFound[0]);
67
+ config.language = DOTNET;
68
+ break;
55
69
  default:
56
- console.log('language detected not supported');
70
+ console.log('No supported language detected in project path');
57
71
  return;
58
72
  }
59
73
  if (!config.applicationId) {
60
74
  config.applicationId = await auditController.dealWithNoAppId(config);
61
75
  }
76
+ console.log('');
62
77
  const reportSpinner = returnOra(i18n.__('auditSCAAnalysisBegins'));
63
78
  startSpinner(reportSpinner);
64
79
  const snapshotResponse = await treeUpload.commonSendSnapShot(messageToSend, config);
65
80
  await pollForSnapshotCompletition(config, snapshotResponse.id, reportSpinner);
66
- succeedSpinner(reportSpinner, 'Contrast SCA audit complete');
81
+ succeedSpinner(reportSpinner, i18n.__('auditSCAAnalysisComplete'));
67
82
  await vulnerabilityReportV2(config, snapshotResponse.id);
68
- await auditSave.auditSave(config);
83
+ if (config.save !== undefined) {
84
+ await auditSave.auditSave(config);
85
+ }
86
+ const endTime = performance.now() - startTime;
87
+ const scanDurationMs = endTime - startTime;
88
+ console.log(`----- completed in ${(scanDurationMs / 1000).toFixed(2)}s -----`);
69
89
  }
70
90
  else {
71
91
  if (filesFound.length === 0) {
72
- console.log('no compatible dependency files detected. Continuing...');
92
+ console.log(i18n.__('languageAnalysisNoLanguage'));
93
+ console.log(i18n.__('languageAnalysisNoLanguageHelpLine'));
94
+ throw new Error();
73
95
  }
74
96
  else {
75
- console.log('multiple language files detected, please use --file to specify a directory or the file where dependencies are declared');
97
+ throw new Error(`multiple language files detected \n` +
98
+ JSON.stringify(filesFound) +
99
+ `\nplease use --file to audit one language only. Example: contrast audit --file package-lock.json`);
76
100
  }
77
101
  }
78
102
  };
@@ -242,9 +242,9 @@ HTTPClient.prototype.checkLibrary = function checkLibrary(data) {
242
242
  options.body = data;
243
243
  return requestUtils.sendRequest({ method: 'post', options });
244
244
  };
245
- HTTPClient.prototype.getSbom = function getSbom(config) {
245
+ HTTPClient.prototype.getSbom = function getSbom(config, type) {
246
246
  const options = _.cloneDeep(this.requestOptions);
247
- options.url = createSbomCycloneDXUrl(config);
247
+ options.url = createSbomUrl(config, type);
248
248
  return requestUtils.sendRequest({ method: 'get', options });
249
249
  };
250
250
  HTTPClient.prototype.getLatestVersion = function getLatestVersion() {
@@ -253,6 +253,12 @@ HTTPClient.prototype.getLatestVersion = function getLatestVersion() {
253
253
  'https://pkg.contrastsecurity.com/artifactory/cli/latest-version.txt';
254
254
  return requestUtils.sendRequest({ method: 'get', options });
255
255
  };
256
+ HTTPClient.prototype.postTelemetry = function postTelemetry(config, requestBody) {
257
+ const options = _.cloneDeep(this.requestOptions);
258
+ options.url = createTelemetryEventUrl(config);
259
+ options.body = requestBody;
260
+ return requestUtils.sendRequest({ method: 'post', options });
261
+ };
256
262
  HTTPClient.prototype.postAnalyticsFunction = function (config, provider, body) {
257
263
  const url = createAnalyticsFunctionPostUrl(config, provider);
258
264
  const options = { ...this.requestOptions, body, url };
@@ -304,11 +310,11 @@ const createAppNameUrl = config => {
304
310
  function createLibraryVulnerabilitiesUrl(config) {
305
311
  return `${config.host}/Contrast/api/ng/${config.organizationId}/libraries/artifactsByGroupNameVersion`;
306
312
  }
307
- function createSpecificReportUrl(config, reportId) {
308
- return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/reports/${reportId}`;
313
+ function createSpecificReportUrl(config, reportId, includeTree = false) {
314
+ return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/reports/${reportId}?&includeTree=${includeTree}`;
309
315
  }
310
- function createSpecificReportWithProdUrl(config, reportId) {
311
- return createSpecificReportUrl(config, reportId).concat(`?nodesToInclude=PROD`);
316
+ function createSpecificReportWithProdUrl(config, reportId, includeTree) {
317
+ return createSpecificReportUrl(config, reportId, includeTree).concat(`&nodesToInclude=PROD`);
312
318
  }
313
319
  function createSpecificReportStatusURL(config, reportId) {
314
320
  return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/snapshots/${reportId}/status`;
@@ -316,8 +322,11 @@ function createSpecificReportStatusURL(config, reportId) {
316
322
  function createDataUrl() {
317
323
  return `https://ardy.contrastsecurity.com/production`;
318
324
  }
319
- function createSbomCycloneDXUrl(config) {
320
- return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom/cyclonedx`;
325
+ function createSbomUrl(config, type) {
326
+ return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom/${type}`;
327
+ }
328
+ function createTelemetryEventUrl(config) {
329
+ return `${config.host}/Contrast/api/sast/organizations/${config.organizationId}/cli`;
321
330
  }
322
331
  module.exports = HTTPClient;
323
332
  module.exports.pollForAuthUrl = pollForAuthUrl;
@@ -48,8 +48,8 @@ const reportFailureError = () => {
48
48
  };
49
49
  exports.reportFailureError = reportFailureError;
50
50
  const genericError = (missingCliOption) => {
51
- console.log(`*************************** ${i18n_1.default.__('yamlMissingParametersHeader')} ***************************\n${missingCliOption}`);
52
- console.error(i18n_1.default.__('yamlMissingParametersMessage'));
51
+ console.log(missingCliOption);
52
+ console.error(i18n_1.default.__('genericErrorMessage'));
53
53
  process.exit(1);
54
54
  };
55
55
  exports.genericError = genericError;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ const i18n = require('i18n');
3
+ const processFail = (config, reportResults) => {
4
+ if (config.severity !== undefined) {
5
+ if (reportResults[config.severity] !== undefined &&
6
+ isSeverityViolation(config.severity, reportResults)) {
7
+ failPipeline('failSeverityOptionErrorMessage');
8
+ }
9
+ }
10
+ if (config.severity === undefined && reportResults.total > 0) {
11
+ failPipeline('failThresholdOptionErrorMessage');
12
+ }
13
+ };
14
+ const isSeverityViolation = (severity, reportResults) => {
15
+ let count = 0;
16
+ switch (severity) {
17
+ case 'critical':
18
+ count += reportResults.critical;
19
+ break;
20
+ case 'high':
21
+ count += reportResults.high + reportResults.critical;
22
+ break;
23
+ case 'medium':
24
+ count += reportResults.medium + reportResults.low + reportResults.critical;
25
+ break;
26
+ case 'low':
27
+ count +=
28
+ reportResults.high + reportResults.critical + reportResults.medium;
29
+ break;
30
+ case 'note':
31
+ if (reportResults.note == reportResults.total) {
32
+ count = 0;
33
+ }
34
+ else {
35
+ count = reportResults.total;
36
+ }
37
+ break;
38
+ default:
39
+ count = 0;
40
+ }
41
+ return count > 0;
42
+ };
43
+ const failPipeline = (message = '') => {
44
+ console.log('\n ******************************** ' +
45
+ i18n.__('snapshotFailureHeader') +
46
+ ' *********************************\n' +
47
+ i18n.__(message));
48
+ process.exit(1);
49
+ };
50
+ const parseSeverity = severity => {
51
+ const severities = ['NOTE', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
52
+ if (severities.includes(severity.toUpperCase())) {
53
+ return severity.toLowerCase();
54
+ }
55
+ else {
56
+ console.log(severity +
57
+ ' Not recognised as a severity type please use LOW, MEDIUM, HIGH, CRITICAL, NOTE');
58
+ return undefined;
59
+ }
60
+ };
61
+ module.exports = {
62
+ failPipeline,
63
+ processFail,
64
+ isSeverityViolation,
65
+ parseSeverity
66
+ };
@@ -23,7 +23,7 @@ const getLatestVersion = async (config) => {
23
23
  }
24
24
  };
25
25
  async function findLatestCLIVersion(config) {
26
- const messageHidden = config.get('updateMessageHidden');
26
+ const messageHidden = config.get('isCI');
27
27
  if (!messageHidden) {
28
28
  let latestCLIVersion = await getLatestVersion(config);
29
29
  latestCLIVersion = latestCLIVersion.substring(8);
@@ -12,7 +12,7 @@ const MEDIUM = 'MEDIUM';
12
12
  const HIGH = 'HIGH';
13
13
  const CRITICAL = 'CRITICAL';
14
14
  const APP_NAME = 'contrast';
15
- const APP_VERSION = '1.0.8';
15
+ const APP_VERSION = '1.0.11';
16
16
  const TIMEOUT = 120000;
17
17
  const HIGH_COLOUR = '#ff9900';
18
18
  const CRITICAL_COLOUR = '#e35858';
@@ -27,9 +27,12 @@ const NOTE_PRIORITY = 5;
27
27
  const AUTH_UI_URL = 'https://cli-auth.contrastsecurity.com';
28
28
  const AUTH_CALLBACK_URL = 'https://cli-auth-api.contrastsecurity.com';
29
29
  const SARIF_FILE = 'SARIF';
30
+ const SBOM_CYCLONE_DX_FILE = 'cyclonedx';
31
+ const SBOM_SPDX_FILE = 'spdx';
30
32
  const CE_URL = 'https://ce.contrastsecurity.com/';
31
33
  module.exports = {
32
34
  supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT },
35
+ supportedLanguagesScan: { JAVASCRIPT, DOTNET, JAVA },
33
36
  LOW,
34
37
  MEDIUM,
35
38
  HIGH,
@@ -50,5 +53,7 @@ module.exports = {
50
53
  HIGH_PRIORITY,
51
54
  MEDIUM_PRIORITY,
52
55
  LOW_PRIORITY,
53
- NOTE_PRIORITY
56
+ NOTE_PRIORITY,
57
+ SBOM_CYCLONE_DX_FILE,
58
+ SBOM_SPDX_FILE
54
59
  };