@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
@@ -1,32 +0,0 @@
1
- const i18n = require('i18n')
2
- /**
3
- * Checks that a single identified language in the list of languages and files
4
- * that has been reduced has a single project file. This is important in the
5
- * (uncommon) case that a project has a lock file without a project file.
6
- */
7
- module.exports = exports = (analysis, next) => {
8
- const { languageAnalysis } = analysis
9
- try {
10
- checkIdentifiedLanguageHasProjectFile(languageAnalysis.identifiedLanguages)
11
- } catch (err) {
12
- next(err)
13
- return
14
- }
15
- next()
16
- }
17
-
18
- const checkIdentifiedLanguageHasProjectFile = identifiedLanguages => {
19
- // Handle the error case where only a single language has been identified...
20
- if (Object.keys(identifiedLanguages).length == 1) {
21
- let { projectFilenames } = Object.values(identifiedLanguages)[0]
22
-
23
- // ...but no project files for that language have been found
24
- if (projectFilenames.length == 0) {
25
- const [language] = Object.keys(identifiedLanguages)
26
- throw new Error(i18n.__('languageAnalysisProjectFileError', language))
27
- }
28
- }
29
- }
30
-
31
- //For testing purposes
32
- exports.checkIdentifiedLanguageHasProjectFile = checkIdentifiedLanguageHasProjectFile
@@ -1,23 +0,0 @@
1
- // Language identifiers
2
- const NODE = 'NODE'
3
- const JAVASCRIPT = 'JAVASCRIPT'
4
- const DOTNET = 'DOTNET'
5
- const JAVA = 'JAVA'
6
- const RUBY = 'RUBY'
7
- const PYTHON = 'PYTHON'
8
- const GO = 'GO'
9
- // we set the langauge as Node instead of PHP since we're using the Node engine in TS
10
- const PHP = 'PHP'
11
-
12
- const LOW = 'LOW'
13
- const MEDIUM = 'MEDIUM'
14
- const HIGH = 'HIGH'
15
- const CRITICAL = 'CRITICAL'
16
-
17
- module.exports = {
18
- supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT },
19
- LOW: LOW,
20
- MEDIUM: MEDIUM,
21
- HIGH: HIGH,
22
- CRITICAL: CRITICAL
23
- }
@@ -1,41 +0,0 @@
1
- const path = require('path')
2
-
3
- /**
4
- * Assemble analysis results into a common object to provide
5
- * language, project file name and paths
6
- */
7
- module.exports = exports = (analysis, next) => {
8
- const { projectPath, languageAnalysis } = analysis
9
- languageAnalysis.identifiedLanguageInfo = getIdentifiedLanguageInfo(
10
- projectPath,
11
- languageAnalysis.identifiedLanguages
12
- )
13
- next()
14
- }
15
-
16
- const getIdentifiedLanguageInfo = (projectPath, identifiedLanguages) => {
17
- const [language] = Object.keys(identifiedLanguages)
18
- const {
19
- projectFilenames: [projectFilename],
20
- lockFilenames: [lockFilename]
21
- } = Object.values(identifiedLanguages)[0]
22
-
23
- let identifiedLanguageInfo = {
24
- language,
25
- projectFilename,
26
- projectFilePath: path.join(projectPath, projectFilename)
27
- }
28
-
29
- if (lockFilename) {
30
- identifiedLanguageInfo = {
31
- ...identifiedLanguageInfo,
32
- lockFilename,
33
- lockFilePath: path.join(projectPath, lockFilename)
34
- }
35
- }
36
-
37
- return identifiedLanguageInfo
38
- }
39
-
40
- //For testing purposes
41
- exports.getIdentifiedLanguageInfo = getIdentifiedLanguageInfo
@@ -1,45 +0,0 @@
1
- const AnalysisEngine = require('./../AnalysisEngine')
2
- const i18n = require('i18n')
3
-
4
- const getProjectRootFilenames = require('./getProjectRootFilenames')
5
- const reduceIdentifiedLanguages = require('./reduceIdentifiedLanguages')
6
- const checkForMultipleIdentifiedLanguages = require('./checkForMultipleIdentifiedLanguages')
7
- const checkForMultipleIdentifiedProjectFiles = require('./checkForMultipleIdentifiedProjectFiles')
8
- const checkIdentifiedLanguageHasProjectFile = require('./checkIdentifiedLanguageHasProjectFile')
9
- const checkIdentifiedLanguageHasLockFile = require('./checkIdentifiedLanguageHasLockFile')
10
- const getIdentifiedLanguageInfo = require('./getIdentifiedLanguageInfo')
11
- const { libraryAnalysisError } = require('../../common/errorHandling')
12
-
13
- module.exports = exports = (projectPath, callback, appId, config) => {
14
- // Create an analysis engine to identify the project language
15
- const ae = new AnalysisEngine({
16
- projectPath,
17
- appId,
18
- languageAnalysis: { appId: appId },
19
- config
20
- })
21
-
22
- ae.use([
23
- getProjectRootFilenames,
24
- reduceIdentifiedLanguages,
25
- checkForMultipleIdentifiedLanguages,
26
- checkForMultipleIdentifiedProjectFiles,
27
- checkIdentifiedLanguageHasProjectFile,
28
- checkIdentifiedLanguageHasLockFile,
29
- getIdentifiedLanguageInfo
30
- ])
31
-
32
- ae.analyze((err, analysis) => {
33
- if (err) {
34
- console.log(
35
- '*******************' +
36
- i18n.__('languageAnalysisFailureMessage') +
37
- '****************'
38
- )
39
- console.error(`${err.message}`)
40
- libraryAnalysisError()
41
- process.exit(1)
42
- }
43
- callback(null, analysis)
44
- })
45
- }
@@ -1,116 +0,0 @@
1
- const {
2
- supportedLanguages: { DOTNET, NODE, JAVA, RUBY, PYTHON, GO, PHP }
3
- } = require('../languageAnalysisEngine/constants')
4
- const i18n = require('i18n')
5
- const dotnetAE = require('../dotnetAnalysisEngine')
6
- const nodeAE = require('../nodeAnalysisEngine')
7
- const javaAE = require('../javaAnalysisEngine')
8
- const rubyAE = require('../rubyAnalysisEngine')
9
- const pythonAE = require('../pythonAnalysisEngine')
10
- const phpAE = require('../phpAnalysisEngine')
11
- const goAE = require('../goAnalysisEngine')
12
- const { vulnerabilityReport } = require('./report/reportingFeature')
13
- const { newSendSnapShot } = require('../languageAnalysisEngine/sendSnapshot')
14
- const fs = require('fs')
15
- const chalk = require('chalk')
16
- const saveFile = require('../../commands/audit/saveFile').default
17
- const generateSbom = require('../../sbom/generateSbom').default
18
- const {
19
- failSpinner,
20
- returnOra,
21
- startSpinner,
22
- succeedSpinner
23
- } = require('../../utils/oraWrapper')
24
-
25
- module.exports = exports = (err, analysis) => {
26
- const { identifiedLanguageInfo } = analysis.languageAnalysis
27
- const catalogueAppId = analysis.languageAnalysis.appId
28
-
29
- if (err) {
30
- console.error(err)
31
- return
32
- }
33
-
34
- // this callback is the end of the chain
35
- const langCallback = async (err, analysis) => {
36
- const config = analysis.config
37
- if (err) {
38
- console.log()
39
- console.log(
40
- '***********' +
41
- i18n.__('languageAnalysisFactoryFailureHeader') +
42
- '****************'
43
- )
44
- console.log(identifiedLanguageInfo.language)
45
- console.log()
46
- console.error(
47
- `${identifiedLanguageInfo.language}` +
48
- i18n.__('languageAnalysisFailure') +
49
- err
50
- )
51
- return process.exit(5)
52
- }
53
-
54
- const reportSpinner = returnOra(i18n.__('auditSCAAnalysisBegins'))
55
- startSpinner(reportSpinner)
56
- const snapshotResponse = await newSendSnapShot(analysis, catalogueAppId)
57
- succeedSpinner(reportSpinner, 'Contrast SCA analysis complete')
58
-
59
- await vulnerabilityReport(analysis, catalogueAppId, snapshotResponse.id)
60
-
61
- //should be moved to processAudit.ts once promises implemented
62
- await auditSave(config)
63
- }
64
-
65
- if (identifiedLanguageInfo.language === DOTNET) {
66
- dotnetAE(identifiedLanguageInfo, analysis.config, langCallback)
67
- }
68
-
69
- if (identifiedLanguageInfo.language === NODE) {
70
- nodeAE(identifiedLanguageInfo, analysis.config, langCallback)
71
- }
72
-
73
- if (identifiedLanguageInfo.language === JAVA) {
74
- javaAE(identifiedLanguageInfo, analysis.config, langCallback)
75
- }
76
-
77
- if (identifiedLanguageInfo.language === RUBY) {
78
- rubyAE(identifiedLanguageInfo, analysis.config, langCallback)
79
- }
80
-
81
- if (identifiedLanguageInfo.language === PYTHON) {
82
- pythonAE(identifiedLanguageInfo, analysis.config, langCallback)
83
- }
84
-
85
- if (identifiedLanguageInfo.language === PHP) {
86
- phpAE(identifiedLanguageInfo, analysis.config, langCallback)
87
- }
88
-
89
- if (identifiedLanguageInfo.language === GO) {
90
- goAE(identifiedLanguageInfo, analysis.config, langCallback)
91
- }
92
- }
93
-
94
- async function auditSave(config) {
95
- //should be moved to processAudit.ts once promises implemented
96
- if (config.save) {
97
- if (config.save.toLowerCase() === 'sbom') {
98
- saveFile(config, await generateSbom(config))
99
-
100
- const filename = `${config.applicationId}-sbom-cyclonedx.json`
101
- if (fs.existsSync(filename)) {
102
- console.log(i18n.__('auditSBOMSaveSuccess') + ` - ${filename}`)
103
- } else {
104
- console.log(
105
- chalk.yellow.bold(
106
- `\n Unable to save ${filename} Software Bill of Materials (SBOM)`
107
- )
108
- )
109
- }
110
- } else {
111
- console.log(i18n.__('auditBadFiletypeSpecifiedForSave'))
112
- }
113
- } else if (config.save === null) {
114
- console.log(i18n.__('auditNoFiletypeSpecifiedForSave'))
115
- }
116
- }
@@ -1,249 +0,0 @@
1
- const {
2
- supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT }
3
- } = require('./constants')
4
- const i18n = require('i18n')
5
-
6
- const DOT_NET_PROJECT_FILE_REGEX = /.+\.csproj$/
7
- const DOT_NET_LOCK_FILENAME = 'packages.lock.json'
8
-
9
- const isDotNetProjectFilename = filename =>
10
- filename.search(DOT_NET_PROJECT_FILE_REGEX) !== -1
11
- const isDotNetLockFilename = filename => filename === DOT_NET_LOCK_FILENAME
12
- function isJavaMavenProjectFilename(filename) {
13
- return filename === 'pom.xml'
14
- }
15
- function isJavaGradleProjectFilename(filename) {
16
- return filename === 'build.gradle' || filename === 'build.gradle.kts'
17
- }
18
- const isRubyProjectFilename = filename => filename === 'Gemfile'
19
- const isNodeProjectFilename = filename => filename === 'package.json'
20
- const isPythonProjectFilename = filename =>
21
- filename === 'requirements.txt' || filename === 'Pipfile'
22
- const isPhpProjectFilename = filename => filename === 'composer.json'
23
- const isPhpLockFilename = filename => filename === 'composer.lock'
24
- function isNodeLockFilename(filename) {
25
- return filename === 'package-lock.json' || filename === 'yarn.lock'
26
- }
27
- const isRubyLockFilename = filename => filename === 'Gemfile.lock'
28
- const isPipfileLockLockFilename = filename => filename === 'Pipfile.lock'
29
- const isGoProjectFilename = filename => filename === 'go.mod'
30
-
31
- const deduceLanguageScaAnalysis = filenames => {
32
- const deducedLanguages = []
33
- let language = ''
34
-
35
- filenames.forEach(filename => {
36
- // Check for project filenames...
37
- if (isJavaMavenProjectFilename(filename)) {
38
- deducedLanguages.push(filename)
39
- language = JAVA
40
- }
41
-
42
- if (isJavaGradleProjectFilename(filename)) {
43
- deducedLanguages.push(filename)
44
- language = JAVA
45
- }
46
-
47
- if (isNodeProjectFilename(filename)) {
48
- deducedLanguages.push(filename)
49
- language = NODE
50
- }
51
- //
52
- // if (isDotNetProjectFilename(filename)) {
53
- // deducedLanguages.push({language: DOTNET, projectFilename: filename})
54
- // }
55
- //
56
- // if (isRubyProjectFilename(filename)) {
57
- // deducedLanguages.push({language: RUBY, projectFilename: filename})
58
- // }
59
- //
60
- // if (isPythonProjectFilename(filename)) {
61
- // deducedLanguages.push({language: PYTHON, projectFilename: filename})
62
- // }
63
- //
64
- // if (isPhpProjectFilename(filename)) {
65
- // deducedLanguages.push({language: PHP, projectFilename: filename})
66
- // }
67
- //
68
- // // Check for lock filenames...
69
- // if (isDotNetLockFilename(filename)) {
70
- // deducedLanguages.push({language: DOTNET, lockFilename: filename})
71
- // }
72
- //
73
- if (isNodeLockFilename(filename)) {
74
- deducedLanguages.push(filename)
75
- language = NODE
76
- }
77
- //
78
- // if (isRubyLockFilename(filename)) {
79
- // deducedLanguages.push({language: RUBY, lockFilename: filename})
80
- // }
81
- //
82
- // // this is pipfileLock rather than python lock as there can be different python locks
83
- // if (isPipfileLockLockFilename(filename)) {
84
- // deducedLanguages.push({language: PYTHON, lockFilename: filename})
85
- // }
86
- //
87
- // if (isPhpLockFilename(filename)) {
88
- // deducedLanguages.push({language: PHP, lockFilename: filename})
89
- // }
90
- //
91
- // go does not have a lockfile, it should have a go.mod file containing the modules
92
- if (isGoProjectFilename(filename)) {
93
- deducedLanguages.push({ language: GO, projectFilename: filename })
94
- language = GO
95
- }
96
- })
97
- let identifiedLanguages = { [language]: deducedLanguages }
98
-
99
- return identifiedLanguages
100
- }
101
-
102
- const deduceLanguage = filename => {
103
- const deducedLanguages = []
104
-
105
- // In theory there shouldn't be multiple languages supported for a single
106
- // project filename or lock filename but to protect ourselves and consumers we
107
- // will try to detect it
108
-
109
- // Check for project filenames...
110
- if (isJavaMavenProjectFilename(filename)) {
111
- deducedLanguages.push({ language: JAVA, projectFilename: filename })
112
- }
113
-
114
- if (isJavaGradleProjectFilename(filename)) {
115
- deducedLanguages.push({ language: JAVA, projectFilename: filename })
116
- }
117
-
118
- if (isNodeProjectFilename(filename)) {
119
- deducedLanguages.push({ language: NODE, projectFilename: filename })
120
- }
121
-
122
- if (isDotNetProjectFilename(filename)) {
123
- deducedLanguages.push({ language: DOTNET, projectFilename: filename })
124
- }
125
-
126
- if (isRubyProjectFilename(filename)) {
127
- deducedLanguages.push({ language: RUBY, projectFilename: filename })
128
- }
129
-
130
- if (isPythonProjectFilename(filename)) {
131
- deducedLanguages.push({ language: PYTHON, projectFilename: filename })
132
- }
133
-
134
- if (isPhpProjectFilename(filename)) {
135
- deducedLanguages.push({ language: PHP, projectFilename: filename })
136
- }
137
-
138
- // Check for lock filenames...
139
- if (isDotNetLockFilename(filename)) {
140
- deducedLanguages.push({ language: DOTNET, lockFilename: filename })
141
- }
142
-
143
- if (isNodeLockFilename(filename)) {
144
- deducedLanguages.push({ language: NODE, lockFilename: filename })
145
- }
146
-
147
- if (isRubyLockFilename(filename)) {
148
- deducedLanguages.push({ language: RUBY, lockFilename: filename })
149
- }
150
-
151
- // this is pipfileLock rather than python lock as there can be different python locks
152
- if (isPipfileLockLockFilename(filename)) {
153
- deducedLanguages.push({ language: PYTHON, lockFilename: filename })
154
- }
155
-
156
- if (isPhpLockFilename(filename)) {
157
- deducedLanguages.push({ language: PHP, lockFilename: filename })
158
- }
159
-
160
- // go does not have a lockfile, it should have a go.mod file containing the modules
161
- if (isGoProjectFilename(filename)) {
162
- deducedLanguages.push({ language: GO, projectFilename: filename })
163
- }
164
-
165
- return deducedLanguages
166
- }
167
-
168
- const reduceIdentifiedLanguages = identifiedLanguages =>
169
- identifiedLanguages.reduce((accumulator, identifiedLanguageInfo) => {
170
- const { language, projectFilename, lockFilename } = identifiedLanguageInfo
171
-
172
- // Add an entry to our map for an identified language (and its filename)
173
- // if we haven't accumulated it yet. Otherwise simply add the filename to the
174
- // existing list.
175
- if (!(language in accumulator)) {
176
- accumulator[language] = { projectFilenames: [], lockFilenames: [] }
177
- }
178
-
179
- if (projectFilename) {
180
- accumulator[language].projectFilenames.push(projectFilename)
181
- } else {
182
- accumulator[language].lockFilenames.push(lockFilename)
183
- }
184
-
185
- return accumulator
186
- }, {})
187
-
188
- /**
189
- * Look at each filename and using a heuristic see if we can determine that it
190
- * specifies a specific language
191
- */
192
- module.exports = exports = (analysis, next) => {
193
- const { projectPath, languageAnalysis, config } = analysis
194
-
195
- let identifiedLanguages = languageAnalysis.projectRootFilenames.reduce(
196
- (accumulator, filename) => {
197
- const deducedLanguages = deduceLanguage(filename)
198
- return [...accumulator, ...deducedLanguages]
199
- },
200
- []
201
- )
202
-
203
- if (Object.keys(identifiedLanguages).length === 0) {
204
- next(new Error(i18n.__('languageAnalysisNoLanguage', projectPath)))
205
- return
206
- }
207
-
208
- let language = config.language
209
- if (language === undefined) {
210
- languageAnalysis.identifiedLanguages = reduceIdentifiedLanguages(
211
- identifiedLanguages
212
- )
213
- } else {
214
- let refinedIdentifiedLanguages = []
215
- for (let x in identifiedLanguages) {
216
- if (
217
- identifiedLanguages[x].language === language.toUpperCase() ||
218
- (identifiedLanguages[x].language === NODE &&
219
- language.toUpperCase() === JAVASCRIPT)
220
- ) {
221
- refinedIdentifiedLanguages.push(identifiedLanguages[x])
222
- }
223
- }
224
- //languages found do not meet that supplied by the user
225
- if (refinedIdentifiedLanguages.length === 0) {
226
- console.log(`Could not detect language as specified: ${config.language}`)
227
- process.exit(1)
228
- }
229
-
230
- languageAnalysis.identifiedLanguages = reduceIdentifiedLanguages(
231
- refinedIdentifiedLanguages
232
- )
233
- }
234
-
235
- next()
236
- }
237
-
238
- //For testing purposes
239
- exports.isJavaMavenProjectFilename = isJavaMavenProjectFilename
240
- exports.isJavaGradleProjectFilename = isJavaGradleProjectFilename
241
- exports.isNodeProjectFilename = isNodeProjectFilename
242
- exports.isDotNetProjectFilename = isDotNetProjectFilename
243
- exports.isDotNetLockFilename = isDotNetLockFilename
244
- exports.isGoProjectFilename = isGoProjectFilename
245
- exports.isPhpProjectFilename = isPhpProjectFilename
246
- exports.isPhpLockFilename = isPhpLockFilename
247
- exports.deduceLanguage = deduceLanguage
248
- exports.reduceIdentifiedLanguages = reduceIdentifiedLanguages
249
- exports.deduceLanguageScaAnalysis = deduceLanguageScaAnalysis
@@ -1,49 +0,0 @@
1
- const i18n = require('i18n')
2
- module.exports = exports = (analysis, next) => {
3
- const {
4
- language: { lockFilePath },
5
- node
6
- } = analysis
7
-
8
- try {
9
- if (node.npmLockFile && node.npmLockFile.lockfileVersion > 1) {
10
- const listOfTopDep = Object.keys(node.npmLockFile.dependencies)
11
- Object.entries(node.npmLockFile.dependencies).forEach(([key, value]) => {
12
- if (value.requires) {
13
- const listOfRequiresDep = Object.keys(value.requires)
14
- listOfRequiresDep.forEach(dep => {
15
- if (!listOfTopDep.includes(dep)) {
16
- addDepToLockFile(value['requires'], dep)
17
- }
18
- })
19
- }
20
-
21
- if (value.dependencies) {
22
- Object.entries(value.dependencies).forEach(
23
- ([childKey, childValue]) => {
24
- if (childValue.requires) {
25
- const listOfRequiresDep = Object.keys(childValue.requires)
26
- listOfRequiresDep.forEach(dep => {
27
- if (!listOfTopDep.includes(dep)) {
28
- addDepToLockFile(childValue['requires'], dep)
29
- }
30
- })
31
- }
32
- }
33
- )
34
- }
35
- })
36
- }
37
- } catch (err) {
38
- next(
39
- next(new Error(i18n.__('NodeParseNPM', lockFilePath) + `${err.message}`))
40
- )
41
- return
42
- }
43
-
44
- function addDepToLockFile(depObj, key) {
45
- node.npmLockFile.dependencies[key] = { version: depObj[key] }
46
- }
47
-
48
- next()
49
- }
@@ -1,35 +0,0 @@
1
- const AnalysisEngine = require('../AnalysisEngine')
2
-
3
- const readProjectFileContents = require('./readProjectFileContents')
4
- const readNPMLockFileContents = require('./readNPMLockFileContents')
5
- const parseNPMLockFileContents = require('./parseNPMLockFileContents')
6
- const readYarnLockFileContents = require('./readYarnLockFileContents')
7
- const parseYarnLockFileContents = require('./parseYarnLockFileContents')
8
- const parseYarn2LockFileContents = require('./parseYarn2LockFileContents')
9
- const handleNPMLockFileV2 = require('./handleNPMLockFileV2')
10
- const sanitizer = require('./sanitizer')
11
- const i18n = require('i18n')
12
-
13
- module.exports = exports = (language, config, callback) => {
14
- const ae = new AnalysisEngine({ language, config, node: {} })
15
-
16
- ae.use([
17
- readProjectFileContents,
18
- readNPMLockFileContents,
19
- parseNPMLockFileContents,
20
- readYarnLockFileContents,
21
- parseYarnLockFileContents,
22
- parseYarn2LockFileContents,
23
- handleNPMLockFileV2,
24
- sanitizer
25
- ])
26
-
27
- ae.analyze((err, analysis) => {
28
- if (err) {
29
- callback(new Error(i18n.__('NodeAnalysisFailure') + `${err.message}`))
30
- return
31
- }
32
-
33
- callback(null, analysis)
34
- })
35
- }
@@ -1,20 +0,0 @@
1
- const i18n = require('i18n')
2
- module.exports = exports = ({ language: { lockFilePath }, node }, next) => {
3
- // If we never read the package-lock file then pass priority
4
- if (node.rawLockFileContents === undefined) {
5
- next()
6
- } else {
7
- try {
8
- node.npmLockFile = JSON.parse(node.rawLockFileContents)
9
- } catch (err) {
10
- next(
11
- new Error(
12
- i18n.__('NodeParseNPM', lockFilePath ? lockFilePath : 'undefined') +
13
- `${err.message}`
14
- )
15
- )
16
- return
17
- }
18
- next()
19
- }
20
- }
@@ -1,26 +0,0 @@
1
- const yarnParser = require('@yarnpkg/lockfile')
2
- const i18n = require('i18n')
3
-
4
- module.exports = exports = ({ language: { lockFilename }, node }, next) => {
5
- // If we never read the lock file then pass priority
6
- if (node.rawYarnLockFileContents === undefined || node.yarnVersion === 2) {
7
- next()
8
- } else {
9
- try {
10
- node.yarnLockFile = yarnParser.parse(node.rawYarnLockFileContents)
11
- } catch (err) {
12
- next(
13
- new Error(
14
- i18n.__(
15
- 'NodeParseYarn',
16
- lockFilename.lockFilePath ? lockFilename.lockFilePath : 'undefined'
17
- ) + `${err.message}`
18
- )
19
- )
20
-
21
- return
22
- }
23
-
24
- next()
25
- }
26
- }
@@ -1,23 +0,0 @@
1
- const fs = require('fs')
2
- const i18n = require('i18n')
3
-
4
- module.exports = exports = ({ language: { lockFilePath }, node }, next) => {
5
- // check if the lockFilename is populated and if it is check to
6
- // see if it has the package-lock if not then go on to next handler
7
- if (!lockFilePath || !lockFilePath.includes('package-lock.json')) {
8
- next()
9
- return
10
- }
11
-
12
- try {
13
- node.rawLockFileContents = fs.readFileSync(lockFilePath)
14
- } catch (err) {
15
- next(
16
- new Error(i18n.__('NodeReadNpmError', lockFilePath) + `${err.message}`)
17
- )
18
-
19
- return
20
- }
21
-
22
- next()
23
- }
@@ -1,27 +0,0 @@
1
- const fs = require('fs')
2
- const i18n = require('i18n')
3
-
4
- module.exports = exports = (analysis, next) => {
5
- const {
6
- language: { projectFilePath },
7
- node
8
- } = analysis
9
-
10
- // Read the NODE project file contents. We are reading into memory presuming
11
- // that the contents of the file aren't large which may be bad... Could look
12
- // into streaming in the future
13
-
14
- try {
15
- // package.json is stored in the projectFilePath other files have the word lock so are stored in lockFilename arr
16
- node.packageJSON = JSON.parse(fs.readFileSync(projectFilePath, 'utf8'))
17
- } catch (err) {
18
- next(
19
- new Error(
20
- i18n.__('nodeReadProjectFileError', projectFilePath) + `${err.message}`
21
- )
22
- )
23
- return
24
- }
25
-
26
- next()
27
- }