@contrast/contrast 1.0.6 → 1.0.9

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 (221) hide show
  1. package/.prettierignore +0 -6
  2. package/dist/audit/catalogueApplication/catalogueApplication.js +23 -5
  3. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +10 -19
  4. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +98 -37
  5. package/dist/audit/languageAnalysisEngine/report/models/reportListModel.js +2 -1
  6. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +4 -3
  7. package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +3 -0
  8. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +87 -19
  9. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +46 -16
  10. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +57 -19
  11. package/dist/audit/save.js +37 -0
  12. package/dist/commands/audit/auditConfig.js +0 -16
  13. package/dist/commands/audit/auditController.js +18 -11
  14. package/dist/commands/audit/help.js +31 -25
  15. package/dist/commands/audit/processAudit.js +3 -3
  16. package/dist/commands/audit/saveFile.js +8 -4
  17. package/dist/commands/scan/sca/scaAnalysis.js +55 -10
  18. package/dist/common/HTTPClient.js +64 -23
  19. package/dist/common/errorHandling.js +6 -1
  20. package/dist/common/versionChecker.js +20 -5
  21. package/dist/constants/constants.js +7 -2
  22. package/dist/constants/locales.js +35 -38
  23. package/dist/constants.js +20 -13
  24. package/dist/index.js +55 -45
  25. package/dist/lambda/analytics.js +11 -0
  26. package/dist/lambda/lambda.js +38 -4
  27. package/dist/lambda/types.js +13 -0
  28. package/dist/sbom/generateSbom.js +5 -4
  29. package/dist/scaAnalysis/common/formatMessage.js +44 -1
  30. package/dist/scaAnalysis/common/treeUpload.js +4 -6
  31. package/dist/scaAnalysis/dotnet/analysis.js +43 -0
  32. package/dist/scaAnalysis/dotnet/index.js +10 -0
  33. package/dist/scaAnalysis/go/goReadDepFile.js +1 -3
  34. package/dist/scaAnalysis/java/analysis.js +5 -8
  35. package/dist/scaAnalysis/java/index.js +2 -2
  36. package/dist/scaAnalysis/javascript/analysis.js +107 -0
  37. package/dist/scaAnalysis/javascript/index.js +50 -0
  38. package/dist/scaAnalysis/php/analysis.js +70 -0
  39. package/dist/scaAnalysis/php/index.js +17 -0
  40. package/dist/scaAnalysis/python/analysis.js +42 -0
  41. package/dist/scaAnalysis/python/index.js +10 -0
  42. package/dist/scaAnalysis/ruby/analysis.js +218 -0
  43. package/dist/scaAnalysis/ruby/index.js +10 -0
  44. package/dist/scan/autoDetection.js +23 -22
  45. package/dist/scan/fileUtils.js +57 -20
  46. package/dist/scan/formatScanOutput.js +12 -14
  47. package/dist/scan/models/groupedResultsModel.js +1 -1
  48. package/dist/scan/models/scanResultsModel.js +3 -1
  49. package/dist/scan/populateProjectIdAndProjectName.js +2 -1
  50. package/dist/scan/scan.js +1 -0
  51. package/dist/scan/scanConfig.js +8 -3
  52. package/dist/scan/scanController.js +16 -3
  53. package/dist/scan/scanResults.js +5 -1
  54. package/dist/utils/commonApi.js +4 -1
  55. package/dist/utils/filterProjectPath.js +7 -2
  56. package/dist/utils/getConfig.js +1 -6
  57. package/package.json +12 -9
  58. package/src/audit/catalogueApplication/catalogueApplication.js +28 -7
  59. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +10 -39
  60. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +183 -68
  61. package/src/audit/languageAnalysisEngine/report/models/reportLibraryModel.ts +3 -3
  62. package/src/audit/languageAnalysisEngine/report/models/reportListModel.ts +18 -11
  63. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
  64. package/src/audit/languageAnalysisEngine/report/models/reportSeverityModel.ts +6 -1
  65. package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +4 -0
  66. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +86 -32
  67. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +87 -32
  68. package/src/audit/languageAnalysisEngine/sendSnapshot.js +69 -20
  69. package/src/audit/save.js +48 -0
  70. package/src/commands/audit/auditConfig.ts +0 -25
  71. package/src/commands/audit/auditController.ts +18 -20
  72. package/src/commands/audit/help.ts +31 -25
  73. package/src/commands/audit/processAudit.ts +3 -6
  74. package/src/commands/audit/saveFile.ts +6 -2
  75. package/src/commands/scan/processScan.js +0 -1
  76. package/src/commands/scan/sca/scaAnalysis.js +84 -30
  77. package/src/common/HTTPClient.js +81 -34
  78. package/src/common/errorHandling.ts +10 -1
  79. package/src/common/versionChecker.ts +24 -5
  80. package/src/constants/constants.js +9 -3
  81. package/src/constants/locales.js +58 -43
  82. package/src/constants.js +21 -14
  83. package/src/index.ts +70 -58
  84. package/src/lambda/analytics.ts +9 -0
  85. package/src/lambda/arn.ts +2 -1
  86. package/src/lambda/lambda.ts +40 -17
  87. package/src/lambda/types.ts +36 -0
  88. package/src/lambda/utils.ts +2 -7
  89. package/src/sbom/generateSbom.ts +2 -2
  90. package/src/scaAnalysis/common/formatMessage.js +48 -1
  91. package/src/scaAnalysis/common/treeUpload.js +4 -6
  92. package/src/scaAnalysis/dotnet/analysis.js +54 -0
  93. package/src/scaAnalysis/dotnet/index.js +11 -0
  94. package/src/scaAnalysis/go/goAnalysis.js +2 -3
  95. package/src/scaAnalysis/go/goReadDepFile.js +1 -3
  96. package/src/scaAnalysis/java/analysis.js +7 -8
  97. package/src/scaAnalysis/java/index.js +2 -2
  98. package/src/scaAnalysis/javascript/analysis.js +126 -0
  99. package/src/scaAnalysis/javascript/index.js +72 -0
  100. package/src/scaAnalysis/php/analysis.js +78 -0
  101. package/src/scaAnalysis/php/index.js +22 -0
  102. package/src/scaAnalysis/python/analysis.js +49 -0
  103. package/src/scaAnalysis/python/index.js +11 -0
  104. package/src/scaAnalysis/ruby/analysis.js +273 -0
  105. package/src/scaAnalysis/ruby/index.js +11 -0
  106. package/src/scan/autoDetection.js +24 -26
  107. package/src/scan/fileUtils.js +60 -20
  108. package/src/scan/formatScanOutput.ts +14 -15
  109. package/src/scan/models/groupedResultsModel.ts +3 -3
  110. package/src/scan/models/resultContentModel.ts +1 -1
  111. package/src/scan/models/scanResultsModel.ts +5 -2
  112. package/src/scan/populateProjectIdAndProjectName.js +3 -1
  113. package/src/scan/scan.ts +1 -0
  114. package/src/scan/scanConfig.js +7 -5
  115. package/src/scan/scanController.js +18 -4
  116. package/src/scan/scanResults.js +10 -0
  117. package/src/utils/commonApi.js +4 -1
  118. package/src/utils/filterProjectPath.js +6 -2
  119. package/src/utils/getConfig.ts +1 -12
  120. package/dist/audit/AnalysisEngine.js +0 -37
  121. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  122. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  123. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  124. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  125. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  126. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  127. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  128. package/dist/audit/goAnalysisEngine/index.js +0 -17
  129. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  130. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  131. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  132. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  133. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -153
  134. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  135. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  136. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  137. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -24
  138. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -24
  139. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  140. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -23
  141. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  142. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  143. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  144. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -87
  145. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -150
  146. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  147. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  148. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  149. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  150. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  151. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  152. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  153. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  154. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  155. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  156. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  157. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  158. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  159. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  160. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  161. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  162. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  163. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  164. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  165. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  166. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  167. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  168. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  169. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  170. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  171. package/src/audit/AnalysisEngine.js +0 -103
  172. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  173. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  174. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  175. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  176. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  177. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  178. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  179. package/src/audit/goAnalysisEngine/index.js +0 -18
  180. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  181. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  182. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  183. package/src/audit/javaAnalysisEngine/index.js +0 -41
  184. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -222
  185. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  186. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  187. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  188. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -35
  189. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -41
  190. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  191. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -32
  192. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  193. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  194. package/src/audit/languageAnalysisEngine/index.js +0 -45
  195. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -116
  196. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -249
  197. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  198. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  199. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  200. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  201. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  202. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  203. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  204. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  205. package/src/audit/phpAnalysisEngine/index.js +0 -27
  206. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  207. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  208. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  209. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  210. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  211. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  212. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  213. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  214. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  215. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  216. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  217. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  218. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  219. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  220. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  221. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
@@ -10,69 +10,87 @@ const findFile = async () => {
10
10
  onlyFiles: true
11
11
  });
12
12
  };
13
- const findFilesJava = async (languagesFound) => {
13
+ const findFilesJava = async (languagesFound, filePath) => {
14
14
  const result = await fg(['**/pom.xml', '**/build.gradle', '**/build.gradle.kts'], {
15
15
  dot: false,
16
16
  deep: 1,
17
- onlyFiles: true
17
+ onlyFiles: true,
18
+ cwd: filePath ? filePath : process.cwd()
18
19
  });
19
20
  if (result.length > 0) {
20
- return languagesFound.push({ java: result });
21
+ return languagesFound.push({ JAVA: result });
21
22
  }
22
23
  return languagesFound;
23
24
  };
24
- const findFilesJavascript = async (languagesFound) => {
25
- const result = await fg(['**/package.json', '**/yarn.lock', '**/package.lock.json'], {
25
+ const findFilesJavascript = async (languagesFound, filePath) => {
26
+ const result = await fg(['**/package.json', '**/yarn.lock', '**/package-lock.json'], {
26
27
  dot: false,
27
28
  deep: 1,
28
- onlyFiles: true
29
+ onlyFiles: true,
30
+ cwd: filePath ? filePath : process.cwd()
29
31
  });
30
32
  if (result.length > 0) {
31
- return languagesFound.push({ javascript: result });
33
+ return languagesFound.push({ JAVASCRIPT: result });
32
34
  }
33
35
  return languagesFound;
34
36
  };
35
- const findFilesPython = async (languagesFound) => {
37
+ const findFilesPython = async (languagesFound, filePath) => {
36
38
  const result = await fg(['**/Pipfile.lock', '**/Pipfile'], {
37
39
  dot: false,
38
40
  deep: 3,
39
- onlyFiles: true
41
+ onlyFiles: true,
42
+ cwd: filePath ? filePath : process.cwd()
40
43
  });
41
44
  if (result.length > 0) {
42
- return languagesFound.push({ python: result });
45
+ return languagesFound.push({ PYTHON: result });
43
46
  }
44
47
  return languagesFound;
45
48
  };
46
- const findFilesGo = async (languagesFound) => {
49
+ const findFilesGo = async (languagesFound, filePath) => {
47
50
  const result = await fg(['**/go.mod'], {
48
51
  dot: false,
49
52
  deep: 3,
50
- onlyFiles: true
53
+ onlyFiles: true,
54
+ cwd: filePath ? filePath : process.cwd()
51
55
  });
52
56
  if (result.length > 0) {
53
- return languagesFound.push({ go: result });
57
+ return languagesFound.push({ GO: result });
54
58
  }
55
59
  return languagesFound;
56
60
  };
57
- const findFilesRuby = async (languagesFound) => {
61
+ const findFilesRuby = async (languagesFound, filePath) => {
58
62
  const result = await fg(['**/Gemfile', '**/Gemfile.lock'], {
59
63
  dot: false,
60
64
  deep: 3,
61
- onlyFiles: true
65
+ onlyFiles: true,
66
+ cwd: filePath ? filePath : process.cwd()
62
67
  });
63
68
  if (result.length > 0) {
64
- return languagesFound.push({ ruby: result });
69
+ return languagesFound.push({ RUBY: result });
65
70
  }
66
71
  return languagesFound;
67
72
  };
68
- const findFilesPhp = async (languagesFound) => {
73
+ const findFilesPhp = async (languagesFound, filePath) => {
69
74
  const result = await fg(['**/composer.json', '**/composer.lock'], {
70
75
  dot: false,
71
76
  deep: 3,
72
- onlyFiles: true
77
+ onlyFiles: true,
78
+ cwd: filePath ? filePath : process.cwd()
73
79
  });
74
80
  if (result.length > 0) {
75
- return languagesFound.push({ php: result });
81
+ return languagesFound.push({ PHP: result });
82
+ }
83
+ return languagesFound;
84
+ };
85
+ const findFilesDotNet = async (languagesFound, filePath) => {
86
+ const result = await fg(['**/*.csproj', '**/packages.lock.json'], {
87
+ dot: false,
88
+ deep: 3,
89
+ onlyFiles: true,
90
+ cwd: filePath ? filePath : process.cwd()
91
+ });
92
+ if (result.length > 0) {
93
+ return languagesFound.push({ DOTNET: result });
76
94
  }
77
95
  return languagesFound;
78
96
  };
@@ -90,6 +108,23 @@ const checkFilePermissions = file => {
90
108
  const fileExists = path => {
91
109
  return fs.existsSync(path);
92
110
  };
111
+ const fileIsEmpty = path => {
112
+ if (fileExists(path) && checkFilePermissions(path)) {
113
+ try {
114
+ return fs.readFileSync(path).length === 0;
115
+ }
116
+ catch (e) {
117
+ if (e.message.toString().includes('illegal operation on a directory, read')) {
118
+ console.log('file provided cannot be a directory');
119
+ }
120
+ else {
121
+ console.log(e.message.toString());
122
+ }
123
+ process.exit(0);
124
+ }
125
+ }
126
+ return false;
127
+ };
93
128
  module.exports = {
94
129
  findFile,
95
130
  fileExists,
@@ -99,5 +134,7 @@ module.exports = {
99
134
  findFilesPython,
100
135
  findFilesGo,
101
136
  findFilesPhp,
102
- findFilesRuby
137
+ findFilesRuby,
138
+ findFilesDotNet,
139
+ fileIsEmpty
103
140
  };
@@ -12,7 +12,7 @@ const cli_table3_1 = __importDefault(require("cli-table3"));
12
12
  const constants_1 = require("../constants/constants");
13
13
  function formatScanOutput(scanResults) {
14
14
  const { scanResultsInstances } = scanResults;
15
- let projectOverview = getProjectOverview(scanResultsInstances);
15
+ const projectOverview = getProjectOverview(scanResultsInstances);
16
16
  if (scanResultsInstances.content.length === 0) {
17
17
  console.log(i18n_1.default.__('scanNoVulnerabilitiesFound'));
18
18
  console.log(i18n_1.default.__('scanNoVulnerabilitiesFoundSecureCode'));
@@ -25,8 +25,9 @@ function formatScanOutput(scanResults) {
25
25
  console.log(chalk_1.default.bold(message));
26
26
  console.log();
27
27
  let defaultView = getDefaultView(scanResultsInstances.content);
28
- let count = defaultView.length;
28
+ let count = 0;
29
29
  defaultView.forEach(entry => {
30
+ count++;
30
31
  let table = new cli_table3_1.default({
31
32
  chars: {
32
33
  top: '',
@@ -52,7 +53,7 @@ function formatScanOutput(scanResults) {
52
53
  });
53
54
  let learnRow = [];
54
55
  let adviceRow = [];
55
- let headerRow = [
56
+ const headerRow = [
56
57
  chalk_1.default
57
58
  .hex(entry.colour)
58
59
  .bold(`CONTRAST-${count.toString().padStart(3, '0')}`),
@@ -60,12 +61,13 @@ function formatScanOutput(scanResults) {
60
61
  chalk_1.default.hex(entry.colour).bold(`[${entry.severity}] ${entry.ruleId}`) +
61
62
  entry.message
62
63
  ];
63
- let codeRow = [
64
+ const codePath = entry.codePath?.replace(/^@/, '');
65
+ const codeRow = [
64
66
  chalk_1.default.hex('#F6F5F5').bold(`Code`),
65
67
  chalk_1.default.hex('#F6F5F5').bold(`:`),
66
- chalk_1.default.hex('#F6F5F5').bold(`${entry.codePath}`)
68
+ chalk_1.default.hex('#F6F5F5').bold(`${codePath}`)
67
69
  ];
68
- let issueRow = [chalk_1.default.bold(`Issue`), chalk_1.default.bold(`:`), `${entry.issue}`];
70
+ const issueRow = [chalk_1.default.bold(`Issue`), chalk_1.default.bold(`:`), `${entry.issue}`];
69
71
  table.push(headerRow, codeRow, issueRow);
70
72
  if (entry?.advice) {
71
73
  adviceRow = [
@@ -83,7 +85,6 @@ function formatScanOutput(scanResults) {
83
85
  ];
84
86
  table.push(learnRow);
85
87
  }
86
- count--;
87
88
  console.log(table.toString());
88
89
  console.log();
89
90
  });
@@ -98,7 +99,7 @@ function printVulnInfo(projectOverview) {
98
99
  console.log(i18n_1.default.__('foundDetailedVulnerabilities', String(projectOverview.critical), String(projectOverview.high), String(projectOverview.medium), String(projectOverview.low), String(projectOverview.note)));
99
100
  }
100
101
  function getProjectOverview(scanResultsInstances) {
101
- let acc = {
102
+ const acc = {
102
103
  critical: 0,
103
104
  high: 0,
104
105
  medium: 0,
@@ -118,7 +119,7 @@ function getProjectOverview(scanResultsInstances) {
118
119
  }
119
120
  exports.getProjectOverview = getProjectOverview;
120
121
  function formatLinks(objName, entry) {
121
- let line = chalk_1.default.bold(objName + ' : ');
122
+ const line = chalk_1.default.bold(objName + ' : ');
122
123
  if (entry.length === 1) {
123
124
  console.log(line + chalk_1.default.hex('#97DCF7').bold.underline(entry[0]));
124
125
  }
@@ -148,7 +149,7 @@ function getDefaultView(content) {
148
149
  groupTypeResults.push(groupResultsObj);
149
150
  assignBySeverity(resultEntry, groupResultsObj);
150
151
  });
151
- return (0, lodash_1.sortBy)(groupTypeResults, ['priority']).reverse();
152
+ return (0, lodash_1.sortBy)(groupTypeResults, ['priority']);
152
153
  }
153
154
  exports.getDefaultView = getDefaultView;
154
155
  function editVulName(message) {
@@ -179,10 +180,7 @@ function getCodeFlowInfo(resultEntry) {
179
180
  }
180
181
  exports.getCodeFlowInfo = getCodeFlowInfo;
181
182
  function stripTags(oldString) {
182
- return oldString
183
- .replace(/\n/g, ' ')
184
- .replace(/\s+/g, ' ')
185
- .trim();
183
+ return oldString.replace(/\n/g, ' ').replace(/\s+/g, ' ').trim();
186
184
  }
187
185
  exports.stripTags = stripTags;
188
186
  function assignBySeverity(entry, assignedObj) {
@@ -5,7 +5,7 @@ class GroupedResultsModel {
5
5
  constructor(ruleId) {
6
6
  this.ruleId = ruleId;
7
7
  this.colour = '#999999';
8
- this.codePathSet = new Set;
8
+ this.codePathSet = new Set();
9
9
  }
10
10
  }
11
11
  exports.GroupedResultsModel = GroupedResultsModel;
@@ -5,7 +5,9 @@ class ScanResultsModel {
5
5
  constructor(scan) {
6
6
  this.projectOverview = scan.projectOverview;
7
7
  this.scanDetail = scan.scanDetail;
8
- this.scanResultsInstances = scan.scanResultsInstances;
8
+ this.scanResultsInstances =
9
+ scan.scanResultsInstances;
10
+ this.newProject = scan.newProject;
9
11
  }
10
12
  }
11
13
  exports.ScanResultsModel = ScanResultsModel;
@@ -8,8 +8,9 @@ const populateProjectId = async (config) => {
8
8
  proj = await getExistingProjectIdByName(config, client).then(res => {
9
9
  return res;
10
10
  });
11
+ return { projectId: proj, isNewProject: false };
11
12
  }
12
- return proj;
13
+ return { projectId: proj, isNewProject: true };
13
14
  };
14
15
  const createProjectId = async (config, client) => {
15
16
  return client
package/dist/scan/scan.js CHANGED
@@ -55,6 +55,7 @@ const sendScan = async (config) => {
55
55
  }
56
56
  })
57
57
  .catch(err => {
58
+ oraWrapper_1.default.stopSpinner(startUploadSpinner);
58
59
  console.log(err);
59
60
  });
60
61
  }
@@ -3,7 +3,7 @@ const paramHandler = require('../utils/paramsUtil/paramHandler');
3
3
  const constants = require('../../src/constants.js');
4
4
  const parsedCLIOptions = require('../../src/utils/parsedCLIOptions');
5
5
  const path = require('path');
6
- const { supportedLanguages } = require('../audit/languageAnalysisEngine/constants');
6
+ const { supportedLanguagesScan } = require('../constants/constants');
7
7
  const i18n = require('i18n');
8
8
  const { scanUsageGuide } = require('./help');
9
9
  const getScanConfig = argv => {
@@ -15,16 +15,21 @@ const getScanConfig = argv => {
15
15
  const paramsAuth = paramHandler.getAuth(scanParams);
16
16
  if (scanParams.language) {
17
17
  scanParams.language = scanParams.language.toUpperCase();
18
- if (!Object.values(supportedLanguages).includes(scanParams.language)) {
18
+ if (!Object.values(supportedLanguagesScan).includes(scanParams.language)) {
19
19
  console.log(`Did not recognise --language ${scanParams.language}`);
20
20
  console.log(i18n.__('constantsHowToRunDev3'));
21
21
  process.exit(1);
22
22
  }
23
23
  }
24
+ let projectNameSource;
24
25
  if (!scanParams.name && scanParams.file) {
25
26
  scanParams.name = getFileName(scanParams.file);
27
+ projectNameSource = 'AUTO';
26
28
  }
27
- return { ...paramsAuth, ...scanParams };
29
+ else {
30
+ projectNameSource = 'USER';
31
+ }
32
+ return { ...paramsAuth, ...scanParams, projectNameSource };
28
33
  };
29
34
  const getFileName = file => {
30
35
  return file.split(path.sep).pop();
@@ -24,6 +24,10 @@ const fileAndLanguageLogic = async (configToUse) => {
24
24
  console.log(i18n.__('fileNotExist'));
25
25
  process.exit(1);
26
26
  }
27
+ if (fileFunctions.fileIsEmpty(configToUse.file)) {
28
+ console.log(i18n.__('scanFileIsEmpty'));
29
+ process.exit(1);
30
+ }
27
31
  return configToUse;
28
32
  }
29
33
  else {
@@ -35,14 +39,20 @@ const fileAndLanguageLogic = async (configToUse) => {
35
39
  const startScan = async (configToUse) => {
36
40
  const startTime = performance.now();
37
41
  await fileAndLanguageLogic(configToUse);
42
+ let newProject;
38
43
  if (!configToUse.projectId) {
39
- configToUse.projectId = await populateProjectIdAndProjectName.populateProjectId(configToUse);
44
+ const { projectId, isNewProject } = await populateProjectIdAndProjectName.populateProjectId(configToUse);
45
+ configToUse.projectId = projectId;
46
+ newProject = isNewProject;
47
+ }
48
+ else {
49
+ newProject = false;
40
50
  }
41
51
  const codeArtifactId = await scan.sendScan(configToUse);
42
52
  if (!configToUse.ff) {
43
53
  const startScanSpinner = returnOra('🚀 Contrast Scan started');
44
54
  startSpinner(startScanSpinner);
45
- const scanDetail = await scanResults.returnScanResults(configToUse, codeArtifactId, getTimeout(configToUse), startScanSpinner);
55
+ const scanDetail = await scanResults.returnScanResults(configToUse, codeArtifactId, newProject, getTimeout(configToUse), startScanSpinner);
46
56
  const scanResultsInstances = await scanResults.returnScanResultsInstances(configToUse, scanDetail.id);
47
57
  const endTime = performance.now();
48
58
  const scanDurationMs = endTime - startTime;
@@ -54,7 +64,10 @@ const startScan = async (configToUse) => {
54
64
  else {
55
65
  succeedSpinner(startScanSpinner, 'Contrast Scan complete');
56
66
  console.log(`----- Scan completed in ${(scanDurationMs / 1000).toFixed(2)}s -----`);
57
- return { scanDetail, scanResultsInstances: scanResultsInstances.body };
67
+ return {
68
+ scanDetail,
69
+ scanResultsInstances: scanResultsInstances.body
70
+ };
58
71
  }
59
72
  }
60
73
  };
@@ -26,9 +26,13 @@ const pollScanResults = async (config, scanId, client) => {
26
26
  console.log(err);
27
27
  });
28
28
  };
29
- const returnScanResults = async (config, codeArtifactId, timeout, startScanSpinner) => {
29
+ const returnScanResults = async (config, codeArtifactId, newProject, timeout, startScanSpinner) => {
30
30
  const client = commonApi.getHttpClient(config);
31
31
  let scanId = await getScanId(config, codeArtifactId, client);
32
+ if (process.env.CODESEC_INVOCATION_ENVIRONMENT &&
33
+ process.env.CODESEC_INVOCATION_ENVIRONMENT.toUpperCase() === 'GITHUB') {
34
+ await client.createNewEvent(config, scanId, newProject);
35
+ }
32
36
  let startTime = new Date();
33
37
  let complete = false;
34
38
  if (!_.isNil(scanId)) {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  const HttpClient = require('./../common/HTTPClient');
3
- const { badRequestError, unauthenticatedError, forbiddenError, proxyError, genericError } = require('../common/errorHandling');
3
+ const { badRequestError, unauthenticatedError, forbiddenError, proxyError, genericError, maxAppError } = require('../common/errorHandling');
4
4
  const handleResponseErrors = (res, api) => {
5
5
  if (res.statusCode === 400) {
6
6
  api === 'catalogue' ? badRequestError(true) : badRequestError(false);
@@ -14,6 +14,9 @@ const handleResponseErrors = (res, api) => {
14
14
  else if (res.statusCode === 407) {
15
15
  proxyError();
16
16
  }
17
+ else if (res.statusCode === 412) {
18
+ maxAppError();
19
+ }
17
20
  else {
18
21
  genericError();
19
22
  }
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  const path = require('path');
3
+ const child_process = require('child_process');
3
4
  function resolveFilePath(filepath) {
4
5
  if (filepath[0] === '~') {
5
6
  return path.join(process.env.HOME, filepath.slice(1));
@@ -7,11 +8,15 @@ function resolveFilePath(filepath) {
7
8
  return filepath;
8
9
  }
9
10
  const returnProjectPath = () => {
10
- if (process.env.PWD !== (undefined || null || 'undefined')) {
11
+ if (process.platform == 'win32') {
12
+ let winPath = child_process.execSync('cd').toString();
13
+ return winPath.replace(/\//g, '\\').trim();
14
+ }
15
+ else if (process.env.PWD !== (undefined || null || 'undefined')) {
11
16
  return process.env.PWD;
12
17
  }
13
18
  else {
14
- return process.argv[process.argv.indexOf('--project_path') + 1];
19
+ return process.argv[process.argv.indexOf('--file') + 1];
15
20
  }
16
21
  };
17
22
  module.exports = {
@@ -3,7 +3,7 @@ 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.setConfigValues = exports.createConfigFromYaml = exports.localConfig = void 0;
6
+ exports.setConfigValues = exports.localConfig = void 0;
7
7
  const conf_1 = __importDefault(require("conf"));
8
8
  const localConfig = (name, version) => {
9
9
  const config = new conf_1.default({
@@ -19,11 +19,6 @@ const localConfig = (name, version) => {
19
19
  return config;
20
20
  };
21
21
  exports.localConfig = localConfig;
22
- const createConfigFromYaml = (yamlPath) => {
23
- const yamlConfig = {};
24
- return yamlConfig;
25
- };
26
- exports.createConfigFromYaml = createConfigFromYaml;
27
22
  const setConfigValues = (config, values) => {
28
23
  config.set('apiKey', values.apiKey);
29
24
  config.set('organizationId', values.orgId);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contrast/contrast",
3
- "version": "1.0.6",
3
+ "version": "1.0.9",
4
4
  "description": "Contrast Security's command line tool",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -23,9 +23,9 @@
23
23
  "test": "jest --testPathIgnorePatterns=./test-integration/",
24
24
  "test-int": "jest ./test-integration/",
25
25
  "test-int-scan": "jest ./test-integration/scan",
26
- "test-int-audit": "jest ./test-integration/audit",
27
- "format": "prettier --write \"**/*.{ts,tsx,js,css,scss,json,md,yml}\" .eslintrc.* .babelrc",
28
- "check-format": "prettier --check \"**/*.{ts,tsx,js,css,scss,json,md,yml}\" .eslintrc.* .babelrc",
26
+ "test-int-audit": "jest test-integration/audit/audit-int.spec.js",
27
+ "format": "prettier --write \"**/*.{ts,tsx,js,json,md,yml}\" .eslintrc.*",
28
+ "check-format": "prettier --check \"**/*.{ts,tsx,js,json,md,yml}\" .eslintrc.*",
29
29
  "coverage-local": "nyc --reporter=text mocha './test/**/*.spec.js'",
30
30
  "coverage": "yarn test --coverage",
31
31
  "lint": "eslint --config .eslintrc.json . --ext .ts",
@@ -53,7 +53,6 @@
53
53
  "fast-glob": "^3.2.11",
54
54
  "i18n": "^0.14.2",
55
55
  "js-yaml": "^4.1.0",
56
- "latest-version": "5.1.0",
57
56
  "lodash": "^4.17.21",
58
57
  "log-symbols": "^4.1.0",
59
58
  "open": "^8.4.0",
@@ -74,12 +73,13 @@
74
73
  "@types/i18n": "^0.13.2",
75
74
  "@types/jest": "^27.4.1",
76
75
  "@types/lodash": "^4.14.182",
76
+ "@types/node": "*",
77
77
  "@typescript-eslint/eslint-plugin": "^5.21.0",
78
78
  "@typescript-eslint/parser": "^5.21.0",
79
79
  "csv-writer": "^1.6.0",
80
80
  "eslint": "^8.14.0",
81
81
  "eslint-config-prettier": "^8.5.0",
82
- "eslint-plugin-prettier": "^4.0.0",
82
+ "eslint-plugin-prettier": "^4.2.1",
83
83
  "husky": "^3.1.0",
84
84
  "jest": "^27.5.1",
85
85
  "jest-junit": "^13.2.0",
@@ -87,7 +87,7 @@
87
87
  "npm-license-crawler": "^0.2.1",
88
88
  "nyc": "^15.1.0",
89
89
  "pkg": "^5.6.0",
90
- "prettier": "^1.19.1",
90
+ "prettier": "^2.7.1",
91
91
  "tmp": "^0.2.1",
92
92
  "ts-jest": "^27.1.4",
93
93
  "ts-node": "^10.7.0",
@@ -103,12 +103,15 @@
103
103
  ],
104
104
  "prettier": {
105
105
  "semi": false,
106
+ "trailingComma": "none",
107
+ "arrowParens": "avoid",
108
+ "bracketSpacing": true,
106
109
  "singleQuote": true,
110
+ "bracketSameLine": true,
107
111
  "overrides": [
108
112
  {
109
113
  "files": [
110
- ".eslintrc.ng",
111
- ".babelrc"
114
+ ".eslintrc"
112
115
  ],
113
116
  "options": {
114
117
  "parser": "json"
@@ -1,10 +1,5 @@
1
- const i18n = require('i18n')
2
1
  const { getHttpClient, handleResponseErrors } = require('../../utils/commonApi')
3
2
 
4
- const displaySuccessMessage = () => {
5
- console.log(i18n.__('catalogueSuccessCommand'))
6
- }
7
-
8
3
  const catalogueApplication = async config => {
9
4
  const client = getHttpClient(config)
10
5
  let appId
@@ -14,8 +9,9 @@ const catalogueApplication = async config => {
14
9
  if (res.statusCode === 201) {
15
10
  //displaySuccessMessage(config, res.body.application.app_id)
16
11
  appId = res.body.application.app_id
12
+ } else if (doesMessagesContainAppId(res)) {
13
+ appId = tryRetrieveAppIdFromMessages(res.body.messages)
17
14
  } else {
18
- // console.log(res.statusCode)
19
15
  handleResponseErrors(res, 'catalogue')
20
16
  }
21
17
  })
@@ -25,6 +21,31 @@ const catalogueApplication = async config => {
25
21
  return appId
26
22
  }
27
23
 
24
+ const doesMessagesContainAppId = res => {
25
+ const regex = /(Application ID =)/
26
+ if (
27
+ res.statusCode === 400 &&
28
+ res.body.messages.filter(message => regex.exec(message))[0]
29
+ ) {
30
+ return true
31
+ }
32
+
33
+ return false
34
+ }
35
+
36
+ const tryRetrieveAppIdFromMessages = messages => {
37
+ let appId
38
+ messages.forEach(message => {
39
+ if (message.includes('Application ID')) {
40
+ appId = message.split('=')[1].replace(/\s+/g, '')
41
+ }
42
+ })
43
+
44
+ return appId
45
+ }
46
+
28
47
  module.exports = {
29
- catalogueApplication: catalogueApplication
48
+ catalogueApplication: catalogueApplication,
49
+ doesMessagesContainAppId,
50
+ tryRetrieveAppIdFromMessages
30
51
  }
@@ -1,43 +1,14 @@
1
1
  const fs = require('fs')
2
2
  const path = require('path')
3
3
  const i18n = require('i18n')
4
- /**
5
- * Will get the filenames from the project path provided to the SCA CLI tool. If
6
- * the project path points to a file and not a directory will return the
7
- * filename in the same fashion as if a directory had been read.
8
- *
9
- * Will fail and throw for a manner of reasons when doing file/directory
10
- * inspection.
11
- *
12
- * @param {string} projectPath - The path to a projects root directory or a
13
- * specific project file
14
- *
15
- * @return {string[]} List of filenames associated with a projects root
16
- * directory or the name of the specific project file if that was provided to
17
- * the 'projectPath' parameter
18
- *
19
- * @throws {Error} If the project path doesn't exist
20
- * @throws {Error} If the project path information can't be collected
21
- * @throws {Error} If a non-file or non-directory inspected
22
- */
23
- module.exports = exports = (analysis, next) => {
24
- const { projectPath, languageAnalysis } = analysis
25
- try {
26
- languageAnalysis.projectRootFilenames = getProjectRootFilenames(projectPath)
27
- } catch (err) {
28
- next(err)
29
- return
30
- }
31
- next()
32
- }
33
4
 
34
- const getProjectRootFilenames = projectPath => {
5
+ const getProjectRootFilenames = file => {
35
6
  let projectStats = null
36
7
  try {
37
- projectStats = fs.statSync(projectPath)
8
+ projectStats = fs.statSync(file)
38
9
  } catch (err) {
39
10
  throw new Error(
40
- i18n.__('languageAnalysisProjectRootFileNameFailure', projectPath) +
11
+ i18n.__('languageAnalysisProjectRootFileNameFailure', file) +
41
12
  `${err.message}`
42
13
  )
43
14
  }
@@ -45,10 +16,10 @@ const getProjectRootFilenames = projectPath => {
45
16
  // Return the contents of a directory...
46
17
  if (projectStats.isDirectory()) {
47
18
  try {
48
- return fs.readdirSync(projectPath)
19
+ return fs.readdirSync(file)
49
20
  } catch (err) {
50
21
  throw new Error(
51
- i18n.__('languageAnalysisProjectRootFileNameReadError', projectPath) +
22
+ i18n.__('languageAnalysisProjectRootFileNameReadError', file) +
52
23
  `${err.message}`
53
24
  )
54
25
  }
@@ -57,16 +28,16 @@ const getProjectRootFilenames = projectPath => {
57
28
  // If we are working with a file return it in a list as we do when we work
58
29
  // with a directory...
59
30
  if (projectStats.isFile()) {
60
- return [path.basename(projectPath)]
31
+ return [path.basename(file)]
61
32
  }
62
33
 
63
34
  // Error out if we are working with something like a socket file or some
64
35
  // other craziness...
65
36
  throw new Error(
66
37
  i18n.__('languageAnalysisProjectRootFileNameMissingError'),
67
- projectPath
38
+ file
68
39
  )
69
40
  }
70
-
71
- //For testing purposes
72
- exports.getProjectRootFilenames = getProjectRootFilenames
41
+ module.exports = {
42
+ getProjectRootFilenames
43
+ }