@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
@@ -3,7 +3,7 @@ import {
3
3
  ReportLibraryModel
4
4
  } from '../models/reportLibraryModel'
5
5
  import { ReportSeverityModel } from '../models/reportSeverityModel'
6
- import languageAnalysisEngine from '../../../languageAnalysisEngine/constants'
6
+ import languageAnalysisEngine from './../../../../constants/constants'
7
7
  import {
8
8
  CRITICAL_COLOUR,
9
9
  CRITICAL_PRIORITY,
@@ -17,7 +17,8 @@ import {
17
17
  NOTE_PRIORITY
18
18
  } from '../../../../constants/constants'
19
19
  import { orderBy } from 'lodash'
20
- import {SeverityCountModel} from "../models/severityCountModel";
20
+ import { SeverityCountModel } from '../models/severityCountModel'
21
+ import { ReportModelStructure } from '../models/reportListModel'
21
22
  const {
22
23
  supportedLanguages: { GO }
23
24
  } = languageAnalysisEngine
@@ -29,19 +30,37 @@ export function findHighestSeverityCVE(cveArray: ReportCVEModel[]) {
29
30
  return orderBy(mappedToReportSeverityModels, cve => cve?.priority)[0]
30
31
  }
31
32
 
32
-
33
- export function findCVESeveritiesAndOrderByHighestPriority(cves: ReportCVEModel[]) {
34
- return orderBy(cves.map(cve => findCVESeverity(cve)), ['priority'], ['asc'])
33
+ export function findCVESeveritiesAndOrderByHighestPriority(
34
+ cves: ReportCVEModel[]
35
+ ) {
36
+ return orderBy(
37
+ cves.map(cve => findCVESeverity(cve)),
38
+ ['priority'],
39
+ ['asc']
40
+ )
35
41
  }
36
42
 
37
43
  export function findCVESeverity(cve: ReportCVEModel) {
38
44
  const cveName = cve.name as string
39
45
  if (cve.cvss3SeverityCode === 'CRITICAL' || cve.severityCode === 'CRITICAL') {
40
- return new ReportSeverityModel('CRITICAL', CRITICAL_PRIORITY, CRITICAL_COLOUR, cveName)
46
+ return new ReportSeverityModel(
47
+ 'CRITICAL',
48
+ CRITICAL_PRIORITY,
49
+ CRITICAL_COLOUR,
50
+ cveName
51
+ )
41
52
  } else if (cve.cvss3SeverityCode === 'HIGH' || cve.severityCode === 'HIGH') {
42
53
  return new ReportSeverityModel('HIGH', HIGH_PRIORITY, HIGH_COLOUR, cveName)
43
- } else if (cve.cvss3SeverityCode === 'MEDIUM' || cve.severityCode === 'MEDIUM') {
44
- return new ReportSeverityModel('MEDIUM', MEDIUM_PRIORITY, MEDIUM_COLOUR, cveName)
54
+ } else if (
55
+ cve.cvss3SeverityCode === 'MEDIUM' ||
56
+ cve.severityCode === 'MEDIUM'
57
+ ) {
58
+ return new ReportSeverityModel(
59
+ 'MEDIUM',
60
+ MEDIUM_PRIORITY,
61
+ MEDIUM_COLOUR,
62
+ cveName
63
+ )
45
64
  } else if (cve.cvss3SeverityCode === 'LOW' || cve.severityCode === 'LOW') {
46
65
  return new ReportSeverityModel('LOW', LOW_PRIORITY, LOW_COLOUR, cveName)
47
66
  } else if (cve.cvss3SeverityCode === 'NOTE' || cve.severityCode === 'NOTE') {
@@ -49,49 +68,47 @@ export function findCVESeverity(cve: ReportCVEModel) {
49
68
  }
50
69
  }
51
70
 
52
- export function convertGenericToTypedLibraries(libraries: any) {
71
+ export function convertGenericToTypedLibraryVulns(libraries: any) {
53
72
  return Object.entries(libraries).map(([name, cveArray]) => {
54
73
  return new ReportLibraryModel(name, cveArray as ReportCVEModel[])
55
74
  })
56
75
  }
57
76
 
58
- export function severityCountAllLibraries(vulnerableLibraries: ReportLibraryModel[]) {
77
+ export function severityCountAllLibraries(
78
+ vulnerableLibraries: ReportLibraryModel[]
79
+ ) {
59
80
  const severityCount = new SeverityCountModel()
60
- vulnerableLibraries.forEach(lib => severityCountAllCVEs(lib.cveArray, severityCount))
81
+ vulnerableLibraries.forEach(lib =>
82
+ severityCountAllCVEs(lib.cveArray, severityCount)
83
+ )
61
84
  return severityCount
62
85
  }
63
86
 
64
- export function severityCountAllCVEs(cveArray: ReportCVEModel[], severityCount: SeverityCountModel) {
87
+ export function severityCountAllCVEs(
88
+ cveArray: ReportCVEModel[],
89
+ severityCount: SeverityCountModel
90
+ ) {
65
91
  const severityCountInner = severityCount
66
92
  cveArray.forEach(cve => severityCountSingleCVE(cve, severityCountInner))
67
93
  return severityCountInner
68
94
  }
69
95
 
70
- export function severityCountSingleCVE(cve: ReportCVEModel, severityCount: SeverityCountModel) {
71
- if (
72
- cve.cvss3SeverityCode === 'CRITICAL' ||
73
- cve.severityCode === 'CRITICAL'
74
- ) {
96
+ export function severityCountSingleCVE(
97
+ cve: ReportCVEModel,
98
+ severityCount: SeverityCountModel
99
+ ) {
100
+ if (cve.cvss3SeverityCode === 'CRITICAL' || cve.severityCode === 'CRITICAL') {
75
101
  severityCount.critical += 1
76
- } else if (
77
- cve.cvss3SeverityCode === 'HIGH' ||
78
- cve.severityCode === 'HIGH'
79
- ) {
102
+ } else if (cve.cvss3SeverityCode === 'HIGH' || cve.severityCode === 'HIGH') {
80
103
  severityCount.high += 1
81
104
  } else if (
82
105
  cve.cvss3SeverityCode === 'MEDIUM' ||
83
106
  cve.severityCode === 'MEDIUM'
84
107
  ) {
85
108
  severityCount.medium += 1
86
- } else if (
87
- cve.cvss3SeverityCode === 'LOW' ||
88
- cve.severityCode === 'LOW'
89
- ) {
109
+ } else if (cve.cvss3SeverityCode === 'LOW' || cve.severityCode === 'LOW') {
90
110
  severityCount.low += 1
91
- } else if (
92
- cve.cvss3SeverityCode === 'NOTE' ||
93
- cve.severityCode === 'NOTE'
94
- ) {
111
+ } else if (cve.cvss3SeverityCode === 'NOTE' || cve.severityCode === 'NOTE') {
95
112
  severityCount.note += 1
96
113
  }
97
114
 
@@ -106,11 +123,49 @@ export function findNameAndVersion(library: ReportLibraryModel, config: any) {
106
123
 
107
124
  return { name, version }
108
125
  } else {
109
- const splitLibraryName = library.name.split('/')
110
- const nameVersion = splitLibraryName[1].split('@')
111
- const name = nameVersion[0]
126
+ //spreads items from split into set so no duplicates appear
127
+ const uniqueSplitLibraryName = [...new Set(library.name.split('/'))]
128
+ const nameVersion = uniqueSplitLibraryName[1].split('@')
129
+
130
+ let parentLibrary
131
+ let name
132
+ if (
133
+ uniqueSplitLibraryName[0] !== 'null' &&
134
+ uniqueSplitLibraryName[0] !== '' &&
135
+ !uniqueSplitLibraryName[1].includes(uniqueSplitLibraryName[0])
136
+ ) {
137
+ //if the parent lib (element 0) is not null, not blank and not already part of the library name
138
+ //e.g. shared-ini-file-loader-1.0.0-rc.3 is very generic - converts to @aws-sdk/shared-ini-file-loader-1.0.0-rc.3
139
+ parentLibrary = uniqueSplitLibraryName[0]
140
+ name = `${parentLibrary}/${nameVersion[0]}`
141
+ } else {
142
+ name = nameVersion[0]
143
+ }
144
+
112
145
  const version = nameVersion[1]
113
146
 
114
147
  return { name, version }
115
148
  }
116
149
  }
150
+
151
+ export function countVulnerableLibrariesBySeverity(
152
+ reportModelStructure: ReportModelStructure[]
153
+ ) {
154
+ const severityCount = new SeverityCountModel()
155
+ reportModelStructure.forEach(vuln => {
156
+ const currentSeverity = vuln.compositeKey.highestSeverity.severity
157
+ if (currentSeverity === 'CRITICAL') {
158
+ severityCount.critical += 1
159
+ } else if (currentSeverity === 'HIGH') {
160
+ severityCount.high += 1
161
+ } else if (currentSeverity === 'MEDIUM') {
162
+ severityCount.medium += 1
163
+ } else if (currentSeverity === 'LOW') {
164
+ severityCount.low += 1
165
+ } else if (currentSeverity === 'NOTE') {
166
+ severityCount.note += 1
167
+ }
168
+ })
169
+
170
+ return severityCount
171
+ }
@@ -1,31 +1,80 @@
1
- const { getHttpClient } = require('../../utils/commonApi')
2
- const { handleResponseErrors } = require('../../common/errorHandling')
3
- const { APP_VERSION } = require('../../constants/constants')
4
-
5
- const newSendSnapShot = async analysis => {
6
- const analysisLanguage = analysis.config.language.toLowerCase()
7
- const requestBody = {
8
- appID: analysis.config.applicationId,
9
- cliVersion: APP_VERSION,
10
- snapshot: { [analysisLanguage]: analysis[analysisLanguage] }
11
- }
12
-
13
- const client = getHttpClient(analysis.config)
1
+ const commonApi = require('../../utils/commonApi')
2
+ const _ = require('lodash')
3
+ const oraFunctions = require('../../utils/oraWrapper')
4
+ const i18n = require('i18n')
5
+ const oraWrapper = require('../../utils/oraWrapper')
6
+ const requestUtils = require('../../utils/requestUtils')
7
+ const { performance } = require('perf_hooks')
14
8
 
9
+ const pollSnapshotResults = async (config, snapshotId, client) => {
10
+ await requestUtils.sleep(5000)
15
11
  return client
16
- .sendSnapshot(requestBody, analysis.config)
12
+ .getReportStatusById(config, snapshotId)
17
13
  .then(res => {
18
- if (res.statusCode === 201) {
19
- return res.body
20
- } else {
21
- handleResponseErrors(res, 'snapshot')
22
- }
14
+ return res
23
15
  })
24
16
  .catch(err => {
25
17
  console.log(err)
26
18
  })
27
19
  }
28
20
 
21
+ const getTimeout = config => {
22
+ if (config.timeout) {
23
+ return config.timeout
24
+ } else {
25
+ if (config.verbose) {
26
+ console.log('Timeout set to 5 minutes')
27
+ }
28
+ return 300
29
+ }
30
+ }
31
+
32
+ const pollForSnapshotCompletition = async (
33
+ config,
34
+ snapshotId,
35
+ reportSpinner
36
+ ) => {
37
+ const client = commonApi.getHttpClient(config)
38
+ const startTime = performance.now()
39
+ const timeout = getTimeout(config)
40
+
41
+ let complete = false
42
+ if (!_.isNil(snapshotId)) {
43
+ while (!complete) {
44
+ let result = await pollSnapshotResults(config, snapshotId, client)
45
+ if (result.statusCode === 200) {
46
+ if (result.body.status === 'PROCESSED') {
47
+ complete = true
48
+ return result.body
49
+ }
50
+ if (result.body.status === 'FAILED') {
51
+ complete = true
52
+ if (config.debug) {
53
+ oraFunctions.failSpinner(
54
+ reportSpinner,
55
+ i18n.__('auditNotCompleted')
56
+ )
57
+ }
58
+ console.log(result.body.errorMessage)
59
+ oraWrapper.stopSpinner(reportSpinner)
60
+ console.log('Contrast audit finished')
61
+ process.exit(1)
62
+ }
63
+ }
64
+ const endTime = performance.now() - startTime
65
+ if (requestUtils.millisToSeconds(endTime) > timeout) {
66
+ oraFunctions.failSpinner(
67
+ reportSpinner,
68
+ 'Contrast audit timed out at the specified timeout of ' +
69
+ timeout +
70
+ ' seconds.'
71
+ )
72
+ throw new Error('You can update the timeout using --timeout')
73
+ }
74
+ }
75
+ }
76
+ }
77
+
29
78
  module.exports = {
30
- newSendSnapShot: newSendSnapShot
79
+ pollForSnapshotCompletition: pollForSnapshotCompletition
31
80
  }
@@ -0,0 +1,48 @@
1
+ const fs = require('fs')
2
+ const i18n = require('i18n')
3
+ const chalk = require('chalk')
4
+ const save = require('../commands/audit/saveFile')
5
+ const sbom = require('../sbom/generateSbom')
6
+ const {
7
+ SBOM_CYCLONE_DX_FILE,
8
+ SBOM_SPDX_FILE
9
+ } = require('../constants/constants')
10
+
11
+ async function auditSave(config) {
12
+ let fileFormat
13
+ switch (config.save) {
14
+ case null:
15
+ case SBOM_CYCLONE_DX_FILE:
16
+ fileFormat = SBOM_CYCLONE_DX_FILE
17
+ break
18
+ case SBOM_SPDX_FILE:
19
+ fileFormat = SBOM_SPDX_FILE
20
+ break
21
+ default:
22
+ break
23
+ }
24
+
25
+ if (fileFormat) {
26
+ save.saveFile(
27
+ config,
28
+ fileFormat,
29
+ await sbom.generateSbom(config, fileFormat)
30
+ )
31
+ const filename = `${config.applicationId}-sbom-${fileFormat}.json`
32
+ if (fs.existsSync(filename)) {
33
+ console.log(i18n.__('auditSBOMSaveSuccess') + ` - ${filename}`)
34
+ } else {
35
+ console.log(
36
+ chalk.yellow.bold(
37
+ `\n Unable to save ${filename} Software Bill of Materials (SBOM)`
38
+ )
39
+ )
40
+ }
41
+ } else {
42
+ console.log(i18n.__('auditBadFiletypeSpecifiedForSave'))
43
+ }
44
+ }
45
+
46
+ module.exports = {
47
+ auditSave
48
+ }
@@ -1,15 +1,6 @@
1
1
  import paramHandler from '../../utils/paramsUtil/paramHandler'
2
2
  import constants from '../../constants'
3
3
  import cliOptions from '../../utils/parsedCLIOptions'
4
- import languageAnalysisEngine from '../../audit/languageAnalysisEngine/constants'
5
- import {
6
- determineProjectLanguage,
7
- identifyLanguages
8
- } from '../../audit/autodetection/autoDetectLanguage'
9
-
10
- const {
11
- supportedLanguages: { NODE, JAVASCRIPT }
12
- } = languageAnalysisEngine
13
4
 
14
5
  export const getAuditConfig = (argv: string[]): { [key: string]: string } => {
15
6
  const auditParameters = cliOptions.getCommandLineArgsCustom(
@@ -18,22 +9,6 @@ export const getAuditConfig = (argv: string[]): { [key: string]: string } => {
18
9
  )
19
10
  const paramsAuth = paramHandler.getAuth(auditParameters)
20
11
 
21
- if (
22
- auditParameters.language === undefined ||
23
- auditParameters.language === null
24
- ) {
25
- try {
26
- auditParameters.language = determineProjectLanguage(
27
- identifyLanguages(auditParameters)
28
- )
29
- } catch (err: any) {
30
- console.log(err.message)
31
- process.exit(1)
32
- }
33
- } else if (auditParameters.language.toUpperCase() === JAVASCRIPT) {
34
- auditParameters.language = NODE.toLowerCase()
35
- }
36
-
37
12
  // @ts-ignore
38
13
  return { ...paramsAuth, ...auditParameters }
39
14
  }
@@ -1,10 +1,6 @@
1
1
  import { catalogueApplication } from '../../audit/catalogueApplication/catalogueApplication'
2
2
  import commonApi from '../../audit/languageAnalysisEngine/commonApi'
3
3
 
4
- const identifyLanguageAE = require('./../../audit/languageAnalysisEngine')
5
- const languageFactory = require('../../audit/languageAnalysisEngine/languageAnalysisFactory')
6
- const { v4: uuidv4 } = require('uuid')
7
-
8
4
  export const dealWithNoAppId = async (config: { [x: string]: string }) => {
9
5
  let appID: string
10
6
  try {
@@ -14,14 +10,15 @@ export const dealWithNoAppId = async (config: { [x: string]: string }) => {
14
10
  return await catalogueApplication(config)
15
11
  }
16
12
  if (!appID && !config.applicationName) {
17
- config.applicationName = uuidv4()
18
- return await catalogueApplication(config)
13
+ config.applicationName = getAppName(config.file) as string
14
+ // @ts-ignore
15
+ appID = await commonApi.returnAppId(config)
16
+ if (!appID) {
17
+ return await catalogueApplication(config)
18
+ }
19
19
  }
20
- // @ts-ignore
21
- } catch (e) {
22
- // @ts-ignore
20
+ } catch (e: any) {
23
21
  if (e.toString().includes('tunneling socket could not be established')) {
24
- // @ts-ignore
25
22
  console.log(e.message.toString())
26
23
  console.log(
27
24
  'There seems to be an issue with your proxy, please check and try again'
@@ -32,15 +29,16 @@ export const dealWithNoAppId = async (config: { [x: string]: string }) => {
32
29
  return appID
33
30
  }
34
31
 
35
- export const startAudit = async (config: { [key: string]: string }) => {
36
- if (!config.applicationId) {
37
- // @ts-ignore
38
- config.applicationId = await dealWithNoAppId(config)
32
+ export const getAppName = (file: string) => {
33
+ const last = file.charAt(file.length - 1)
34
+ if (last !== '/') {
35
+ return file.split('/').pop()
36
+ } else {
37
+ const str = removeLastChar(file)
38
+ return str.split('/').pop()
39
39
  }
40
- identifyLanguageAE(
41
- config.projectPath,
42
- languageFactory,
43
- config.applicationId,
44
- config
45
- )
40
+ }
41
+
42
+ const removeLastChar = (str: string) => {
43
+ return str.substring(0, str.length - 1)
46
44
  }
@@ -13,35 +13,41 @@ const auditUsageGuide = commandLineUsage([
13
13
  '{bold ' +
14
14
  i18n.__('constantsAuditPrerequisitesContentSupportedLanguages') +
15
15
  '}',
16
- '{bold ' +
17
- i18n.__('constantsAuditPrerequisitesContentJava') +
18
- '}' +
19
- i18n.__('constantsAuditPrerequisitesContentMessage'),
20
- '',
21
- '{italic ' + i18n.__('constantsJavaNote') + '}',
22
- '{italic ' + i18n.__('constantsJavaNoteGradle') + '}',
23
- '',
24
- '{bold ' +
25
- i18n.__('constantsAuditPrerequisitesContentDotNet') +
26
- '}' +
27
- i18n.__('constantsAuditPrerequisitesContentDotNetMessage'),
28
- '{bold ' +
29
- i18n.__('constantsAuditPrerequisitesContentLanguageNode') +
30
- '}' +
31
- i18n.__('constantsAuditPrerequisitesContentLanguageNodeMessage'),
32
- '{bold ' +
33
- i18n.__('constantsAuditPrerequisitesContentLanguageRuby') +
34
- '}' +
35
- i18n.__('constantsAuditPrerequisitesContentLanguageRubyMessage'),
36
- '{bold ' +
37
- i18n.__('constantsAuditPrerequisitesContentLanguagePython') +
38
- '}' +
39
- i18n.__('constantsAuditPrerequisitesContentLanguagePythonMessage')
16
+ i18n.__('constantsAuditPrerequisitesJavaContentMessage'),
17
+ i18n.__('constantsAuditPrerequisitesContentDotNetMessage'),
18
+ i18n.__('constantsAuditPrerequisitesContentNodeMessage'),
19
+ i18n.__('constantsAuditPrerequisitesContentRubyMessage'),
20
+ i18n.__('constantsAuditPrerequisitesContentPythonMessage'),
21
+ i18n.__('constantsAuditPrerequisitesContentGoMessage'),
22
+ i18n.__('constantsAuditPrerequisitesContentPHPMessage')
40
23
  ]
41
24
  },
42
25
  {
43
26
  header: i18n.__('constantsAuditOptions'),
44
- optionList: constants.commandLineDefinitions.auditOptionDefinitions
27
+ optionList: constants.commandLineDefinitions.auditOptionDefinitions,
28
+ hide: [
29
+ 'application-id',
30
+ 'application-name',
31
+ 'organization-id',
32
+ 'api-key',
33
+ 'authorization',
34
+ 'host',
35
+ 'proxy',
36
+ 'help',
37
+ 'ff',
38
+ 'ignore-cert-errors',
39
+ 'verbose',
40
+ 'debug',
41
+ 'experimental',
42
+ 'tags',
43
+ 'sub-project',
44
+ 'code',
45
+ 'maven-settings-path',
46
+ 'language',
47
+ 'experimental',
48
+ 'app-groups',
49
+ 'metadata'
50
+ ]
45
51
  }
46
52
  ])
47
53
 
@@ -1,19 +1,16 @@
1
- import { startAudit } from './auditController'
2
1
  import { getAuditConfig } from './auditConfig'
3
2
  import { auditUsageGuide } from './help'
3
+ import { processSca } from '../scan/sca/scaAnalysis'
4
4
 
5
5
  export type parameterInput = string[]
6
6
 
7
7
  export const processAudit = async (argv: parameterInput) => {
8
8
  if (argv.indexOf('--help') != -1) {
9
9
  printHelpMessage()
10
- process.exit(1)
10
+ process.exit(0)
11
11
  }
12
12
  const config = getAuditConfig(argv)
13
-
14
- // console.log(config)
15
-
16
- const auditResults = await startAudit(config)
13
+ await processSca(config)
17
14
  }
18
15
 
19
16
  const printHelpMessage = () => {
@@ -1,6 +1,10 @@
1
1
  import fs from 'fs'
2
2
 
3
- export default function saveFile(config: any, rawResults: any) {
4
- const fileName = `${config.applicationId}-sbom-cyclonedx.json`
3
+ export const saveFile = (config: any, type: string, rawResults: any) => {
4
+ const fileName = `${config.applicationId}-sbom-${type}.json`
5
5
  fs.writeFileSync(fileName, JSON.stringify(rawResults))
6
6
  }
7
+
8
+ module.exports = {
9
+ saveFile
10
+ }
@@ -7,7 +7,6 @@ const { processSca } = require('./sca/scaAnalysis')
7
7
 
8
8
  const processScan = async argvMain => {
9
9
  let config = scanConfig.getScanConfig(argvMain)
10
- // console.log(config)
11
10
  //try SCA analysis first
12
11
  if (config.experimental) {
13
12
  await processSca(config)