@contrast/contrast 1.0.7 → 1.0.10

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 (196) hide show
  1. package/README.md +1 -1
  2. package/dist/audit/catalogueApplication/catalogueApplication.js +23 -5
  3. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +17 -26
  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 +40 -7
  10. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
  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 +2 -2
  16. package/dist/commands/audit/saveFile.js +8 -4
  17. package/dist/commands/scan/sca/scaAnalysis.js +54 -16
  18. package/dist/common/HTTPClient.js +14 -8
  19. package/dist/common/errorHandling.js +2 -2
  20. package/dist/common/versionChecker.js +19 -4
  21. package/dist/constants/constants.js +7 -2
  22. package/dist/constants/locales.js +44 -44
  23. package/dist/constants.js +31 -14
  24. package/dist/index.js +55 -45
  25. package/dist/lambda/lambda.js +5 -2
  26. package/dist/sbom/generateSbom.js +5 -4
  27. package/dist/scaAnalysis/common/formatMessage.js +33 -6
  28. package/dist/scaAnalysis/common/treeUpload.js +4 -6
  29. package/dist/scaAnalysis/dotnet/analysis.js +43 -0
  30. package/dist/scaAnalysis/dotnet/index.js +10 -0
  31. package/dist/scaAnalysis/go/goReadDepFile.js +1 -3
  32. package/dist/scaAnalysis/java/analysis.js +5 -5
  33. package/dist/scaAnalysis/javascript/analysis.js +107 -0
  34. package/dist/scaAnalysis/javascript/index.js +53 -0
  35. package/dist/scaAnalysis/php/analysis.js +70 -0
  36. package/dist/scaAnalysis/php/index.js +17 -0
  37. package/dist/scaAnalysis/python/analysis.js +8 -7
  38. package/dist/scaAnalysis/ruby/analysis.js +8 -16
  39. package/dist/scaAnalysis/ruby/index.js +2 -2
  40. package/dist/scan/autoDetection.js +13 -24
  41. package/dist/scan/fileUtils.js +44 -14
  42. package/dist/scan/formatScanOutput.js +3 -3
  43. package/dist/scan/scanConfig.js +2 -2
  44. package/dist/utils/commonApi.js +1 -1
  45. package/dist/utils/filterProjectPath.js +7 -2
  46. package/dist/utils/getConfig.js +1 -6
  47. package/package.json +2 -3
  48. package/src/audit/catalogueApplication/catalogueApplication.js +28 -6
  49. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +22 -58
  50. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +157 -47
  51. package/src/audit/languageAnalysisEngine/report/models/reportListModel.ts +4 -1
  52. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
  53. package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +4 -0
  54. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +86 -32
  55. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +44 -5
  56. package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
  57. package/src/audit/save.js +48 -0
  58. package/src/commands/audit/auditConfig.ts +0 -25
  59. package/src/commands/audit/auditController.ts +18 -20
  60. package/src/commands/audit/help.ts +31 -25
  61. package/src/commands/audit/processAudit.ts +2 -5
  62. package/src/commands/audit/saveFile.ts +6 -2
  63. package/src/commands/scan/processScan.js +0 -1
  64. package/src/commands/scan/sca/scaAnalysis.js +87 -32
  65. package/src/common/HTTPClient.js +16 -9
  66. package/src/common/errorHandling.ts +2 -3
  67. package/src/common/versionChecker.ts +23 -4
  68. package/src/constants/constants.js +9 -3
  69. package/src/constants/locales.js +72 -50
  70. package/src/constants.js +32 -15
  71. package/src/index.ts +70 -58
  72. package/src/lambda/lambda.ts +5 -2
  73. package/src/lambda/types.ts +1 -0
  74. package/src/sbom/generateSbom.ts +2 -2
  75. package/src/scaAnalysis/common/formatMessage.js +35 -6
  76. package/src/scaAnalysis/common/treeUpload.js +4 -6
  77. package/src/scaAnalysis/dotnet/analysis.js +54 -0
  78. package/src/scaAnalysis/dotnet/index.js +11 -0
  79. package/src/scaAnalysis/go/goReadDepFile.js +1 -3
  80. package/src/scaAnalysis/java/analysis.js +5 -5
  81. package/src/scaAnalysis/javascript/analysis.js +126 -0
  82. package/src/scaAnalysis/javascript/index.js +75 -0
  83. package/src/scaAnalysis/php/analysis.js +78 -0
  84. package/src/scaAnalysis/php/index.js +22 -0
  85. package/src/scaAnalysis/python/analysis.js +8 -7
  86. package/src/scaAnalysis/ruby/analysis.js +8 -17
  87. package/src/scaAnalysis/ruby/index.js +2 -2
  88. package/src/scan/autoDetection.js +14 -27
  89. package/src/scan/fileUtils.js +46 -14
  90. package/src/scan/formatScanOutput.ts +3 -3
  91. package/src/scan/scanConfig.js +2 -4
  92. package/src/utils/commonApi.js +1 -1
  93. package/src/utils/filterProjectPath.js +6 -2
  94. package/src/utils/getConfig.ts +1 -12
  95. package/dist/audit/AnalysisEngine.js +0 -37
  96. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  97. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  98. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  99. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  100. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  101. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  102. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  103. package/dist/audit/goAnalysisEngine/index.js +0 -17
  104. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  105. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  106. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  107. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  108. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -155
  109. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  110. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  111. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  112. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -25
  113. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
  114. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  115. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
  116. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  117. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  118. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  119. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -89
  120. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -159
  121. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  122. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  123. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  124. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  125. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  126. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  127. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  128. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  129. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  130. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  131. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  132. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  133. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  134. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  135. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  136. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  137. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  138. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  139. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  140. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  141. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  142. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  143. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  144. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  145. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  146. package/src/audit/AnalysisEngine.js +0 -103
  147. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  148. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  149. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  150. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  151. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  152. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  153. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  154. package/src/audit/goAnalysisEngine/index.js +0 -18
  155. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  156. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  157. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  158. package/src/audit/javaAnalysisEngine/index.js +0 -41
  159. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -225
  160. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  161. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  162. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  163. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -36
  164. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
  165. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  166. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
  167. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  168. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  169. package/src/audit/languageAnalysisEngine/index.js +0 -45
  170. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -124
  171. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -250
  172. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  173. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  174. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  175. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  176. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  177. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  178. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  179. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  180. package/src/audit/phpAnalysisEngine/index.js +0 -27
  181. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  182. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  183. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  184. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  185. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  186. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  187. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  188. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  189. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  190. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  191. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  192. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  193. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  194. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  195. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  196. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
@@ -0,0 +1,22 @@
1
+ const { readFile, parseProjectFiles } = require('./analysis')
2
+ const { createPhpTSMessage } = require('../common/formatMessage')
3
+
4
+ const phpAnalysis = (config, files) => {
5
+ let analysis = readFiles(config, files.PHP)
6
+ const phpDep = parseProjectFiles(analysis)
7
+ return createPhpTSMessage(phpDep)
8
+ }
9
+
10
+ const readFiles = (config, files) => {
11
+ let php = {}
12
+
13
+ php.composerJSON = JSON.parse(readFile(config, 'composer.json'))
14
+
15
+ php.rawLockFileContents = JSON.parse(readFile(config, 'composer.lock'))
16
+
17
+ return php
18
+ }
19
+
20
+ module.exports = {
21
+ phpAnalysis
22
+ }
@@ -1,8 +1,8 @@
1
1
  const multiReplace = require('string-multiple-replace')
2
2
  const fs = require('fs')
3
3
 
4
- const readAndParseProjectFile = projectPath => {
5
- const filePath = filePathForWindows(projectPath + '/Pipfile')
4
+ const readAndParseProjectFile = file => {
5
+ const filePath = filePathForWindows(file + '/Pipfile')
6
6
  const pipFile = fs.readFileSync(filePath, 'utf8')
7
7
 
8
8
  const matcherObj = { '"': '' }
@@ -14,20 +14,21 @@ const readAndParseProjectFile = projectPath => {
14
14
  return pythonArray.filter(element => element !== '' && !element.includes('#'))
15
15
  }
16
16
 
17
- const readAndParseLockFile = projectPath => {
18
- const filePath = filePathForWindows(projectPath + '/Pipfile.lock')
17
+ const readAndParseLockFile = file => {
18
+ const filePath = filePathForWindows(file + '/Pipfile.lock')
19
19
  const lockFile = fs.readFileSync(filePath, 'utf8')
20
20
  let parsedPipLock = JSON.parse(lockFile)
21
21
  parsedPipLock['defaults'] = parsedPipLock['default']
22
+ delete parsedPipLock['default']
22
23
  return parsedPipLock
23
24
  }
24
25
 
25
26
  const getPythonDeps = config => {
26
27
  try {
27
- const parseProject = readAndParseProjectFile(config.projectPath)
28
- const parsePip = readAndParseLockFile(config.projectPath)
28
+ const parseProject = readAndParseProjectFile(config.file)
29
+ const parsePip = readAndParseLockFile(config.file)
29
30
 
30
- return { pipfileLock: parseProject, pipfilDependanceies: parsePip }
31
+ return { pipfileLock: parsePip, pipfilDependanceies: parseProject }
31
32
  } catch (err) {
32
33
  console.log(err.message.toString())
33
34
  process.exit(1)
@@ -1,8 +1,7 @@
1
1
  const fs = require('fs')
2
2
 
3
- const readAndParseGemfile = projectPath => {
4
- const fileName = filePathForWindows(projectPath + '/Gemfile')
5
- const gemFile = fs.readFileSync(fileName, 'utf8')
3
+ const readAndParseGemfile = file => {
4
+ const gemFile = fs.readFileSync(file + '/Gemfile', 'utf8')
6
5
  const rubyArray = gemFile.split('\n')
7
6
 
8
7
  let filteredRubyDep = rubyArray.filter(element => {
@@ -20,9 +19,8 @@ const readAndParseGemfile = projectPath => {
20
19
  return filteredRubyDep
21
20
  }
22
21
 
23
- const readAndParseGemLockFile = projectPath => {
24
- const fileName = filePathForWindows(projectPath + '/Gemfile.lock')
25
- const lockFile = fs.readFileSync(fileName, 'utf8')
22
+ const readAndParseGemLockFile = file => {
23
+ const lockFile = fs.readFileSync(file + '/Gemfile.lock', 'utf8')
26
24
  const dependencyRegEx = /^\s*([A-Za-z0-9.!@#$%\-^&*_+]*)\s*(\((.*?)\))/
27
25
 
28
26
  const lines = lockFile.split('\n')
@@ -35,7 +33,7 @@ const readAndParseGemLockFile = projectPath => {
35
33
  }
36
34
 
37
35
  const nonDependencyKeys = (line, sourceObject) => {
38
- const GEMFILE_KEY_VALUE = /^\s*([^:(]*)\s*\s*(.*)/
36
+ const GEMFILE_KEY_VALUE = /^\s*([^:(]*)\s*\:*\s*(.*)/
39
37
  let parts = GEMFILE_KEY_VALUE.exec(line)
40
38
  let key = parts[1].trim()
41
39
  let value = parts[2] || ''
@@ -206,7 +204,7 @@ const getSourceArray = (lines, dependencyRegEx) => {
206
204
  if (
207
205
  (currentWS === 4 && nexlineWS === 4) ||
208
206
  (currentWS === 6 && nexlineWS === 4) ||
209
- nexlineWS === ''
207
+ nexlineWS == ''
210
208
  ) {
211
209
  let newObj = {}
212
210
  newObj = JSON.parse(JSON.stringify(sourceObject))
@@ -245,8 +243,8 @@ const buildSourceDependencyWithVersion = (
245
243
 
246
244
  const getRubyDeps = config => {
247
245
  try {
248
- const parsedGem = readAndParseGemfile(config.projectPath)
249
- const parsedLock = readAndParseGemLockFile(config.projectPath)
246
+ const parsedGem = readAndParseGemfile(config.file)
247
+ const parsedLock = readAndParseGemLockFile(config.file)
250
248
 
251
249
  return { gemfilesDependanceies: parsedGem, gemfileLock: parsedLock }
252
250
  } catch (err) {
@@ -259,13 +257,6 @@ const trimWhiteSpace = string => {
259
257
  return string.replace(/\s+/g, '')
260
258
  }
261
259
 
262
- const filePathForWindows = path => {
263
- if (process.platform === 'win32') {
264
- path = path.replace(/\//g, '\\')
265
- }
266
- return path
267
- }
268
-
269
260
  module.exports = {
270
261
  getRubyDeps,
271
262
  readAndParseGemfile,
@@ -1,8 +1,8 @@
1
- const { getRubyDeps } = require('./analysis')
1
+ const analysis = require('./analysis')
2
2
  const { createRubyTSMessage } = require('../common/formatMessage')
3
3
 
4
4
  const rubyAnalysis = (config, languageFiles) => {
5
- const rubyDeps = getRubyDeps(config, languageFiles.RUBY)
5
+ const rubyDeps = analysis.getRubyDeps(config, languageFiles.RUBY)
6
6
  return createRubyTSMessage(rubyDeps)
7
7
  }
8
8
 
@@ -1,7 +1,7 @@
1
1
  const i18n = require('i18n')
2
2
  const fileFinder = require('./fileUtils')
3
- const languageResolver = require('../audit/languageAnalysisEngine/reduceIdentifiedLanguages')
4
3
  const rootFile = require('../audit/languageAnalysisEngine/getProjectRootFilenames')
4
+ const path = require('path')
5
5
 
6
6
  const autoDetectFileAndLanguage = async configToUse => {
7
7
  const entries = await fileFinder.findFile()
@@ -28,36 +28,24 @@ const autoDetectFileAndLanguage = async configToUse => {
28
28
  }
29
29
  }
30
30
 
31
- const autoDetectAuditFilesAndLanguages = async () => {
31
+ const autoDetectAuditFilesAndLanguages = async filePath => {
32
32
  let languagesFound = []
33
- console.log(i18n.__('searchingAuditFileDirectory', process.cwd()))
34
33
 
35
- await fileFinder.findFilesJava(languagesFound)
36
- await fileFinder.findFilesJavascript(languagesFound)
37
- await fileFinder.findFilesPython(languagesFound)
38
- await fileFinder.findFilesGo(languagesFound)
39
- await fileFinder.findFilesPhp(languagesFound)
40
- await fileFinder.findFilesRuby(languagesFound)
34
+ console.log(i18n.__('searchingAuditFileDirectory', filePath))
41
35
 
42
- if (languagesFound.length === 1) {
36
+ await fileFinder.findFilesJava(languagesFound, filePath)
37
+ await fileFinder.findFilesJavascript(languagesFound, filePath)
38
+ await fileFinder.findFilesPython(languagesFound, filePath)
39
+ await fileFinder.findFilesGo(languagesFound, filePath)
40
+ await fileFinder.findFilesPhp(languagesFound, filePath)
41
+ await fileFinder.findFilesRuby(languagesFound, filePath)
42
+ await fileFinder.findFilesDotNet(languagesFound, filePath)
43
+
44
+ if (languagesFound) {
43
45
  return languagesFound
44
- } else {
45
- console.log(
46
- 'found multiple languages, please specify one using --file to run SCA analysis'
47
- )
48
46
  }
49
- }
50
47
 
51
- const manualDetectAuditFilesAndLanguages = projectPath => {
52
- let projectRootFilenames = rootFile.getProjectRootFilenames(projectPath)
53
- let identifiedLanguages =
54
- languageResolver.deduceLanguageScaAnalysis(projectRootFilenames)
55
-
56
- if (Object.keys(identifiedLanguages).length === 0) {
57
- console.log(i18n.__('languageAnalysisNoLanguage', projectPath))
58
- return []
59
- }
60
- return [identifiedLanguages]
48
+ return []
61
49
  }
62
50
 
63
51
  const hasWhiteSpace = s => {
@@ -100,6 +88,5 @@ module.exports = {
100
88
  autoDetectFileAndLanguage,
101
89
  errorOnFileDetection,
102
90
  autoDetectAuditFilesAndLanguages,
103
- errorOnAuditFileDetection,
104
- manualDetectAuditFilesAndLanguages
91
+ errorOnAuditFileDetection
105
92
  }
@@ -11,13 +11,14 @@ const findFile = async () => {
11
11
  })
12
12
  }
13
13
 
14
- const findFilesJava = async languagesFound => {
14
+ const findFilesJava = async (languagesFound, filePath) => {
15
15
  const result = await fg(
16
16
  ['**/pom.xml', '**/build.gradle', '**/build.gradle.kts'],
17
17
  {
18
18
  dot: false,
19
19
  deep: 1,
20
- onlyFiles: true
20
+ onlyFiles: true,
21
+ cwd: filePath ? filePath : process.cwd()
21
22
  }
22
23
  )
23
24
 
@@ -27,13 +28,14 @@ const findFilesJava = async languagesFound => {
27
28
  return languagesFound
28
29
  }
29
30
 
30
- const findFilesJavascript = async languagesFound => {
31
+ const findFilesJavascript = async (languagesFound, filePath) => {
31
32
  const result = await fg(
32
- ['**/package.json', '**/yarn.lock', '**/package.lock.json'],
33
+ ['**/package.json', '**/yarn.lock', '**/package-lock.json'],
33
34
  {
34
35
  dot: false,
35
36
  deep: 1,
36
- onlyFiles: true
37
+ onlyFiles: true,
38
+ cwd: filePath ? filePath : process.cwd()
37
39
  }
38
40
  )
39
41
 
@@ -43,11 +45,12 @@ const findFilesJavascript = async languagesFound => {
43
45
  return languagesFound
44
46
  }
45
47
 
46
- const findFilesPython = async languagesFound => {
48
+ const findFilesPython = async (languagesFound, filePath) => {
47
49
  const result = await fg(['**/Pipfile.lock', '**/Pipfile'], {
48
50
  dot: false,
49
51
  deep: 3,
50
- onlyFiles: true
52
+ onlyFiles: true,
53
+ cwd: filePath ? filePath : process.cwd()
51
54
  })
52
55
 
53
56
  if (result.length > 0) {
@@ -56,11 +59,12 @@ const findFilesPython = async languagesFound => {
56
59
  return languagesFound
57
60
  }
58
61
 
59
- const findFilesGo = async languagesFound => {
62
+ const findFilesGo = async (languagesFound, filePath) => {
60
63
  const result = await fg(['**/go.mod'], {
61
64
  dot: false,
62
65
  deep: 3,
63
- onlyFiles: true
66
+ onlyFiles: true,
67
+ cwd: filePath ? filePath : process.cwd()
64
68
  })
65
69
 
66
70
  if (result.length > 0) {
@@ -69,11 +73,12 @@ const findFilesGo = async languagesFound => {
69
73
  return languagesFound
70
74
  }
71
75
 
72
- const findFilesRuby = async languagesFound => {
76
+ const findFilesRuby = async (languagesFound, filePath) => {
73
77
  const result = await fg(['**/Gemfile', '**/Gemfile.lock'], {
74
78
  dot: false,
75
79
  deep: 3,
76
- onlyFiles: true
80
+ onlyFiles: true,
81
+ cwd: filePath ? filePath : process.cwd()
77
82
  })
78
83
 
79
84
  if (result.length > 0) {
@@ -82,11 +87,12 @@ const findFilesRuby = async languagesFound => {
82
87
  return languagesFound
83
88
  }
84
89
 
85
- const findFilesPhp = async languagesFound => {
90
+ const findFilesPhp = async (languagesFound, filePath) => {
86
91
  const result = await fg(['**/composer.json', '**/composer.lock'], {
87
92
  dot: false,
88
93
  deep: 3,
89
- onlyFiles: true
94
+ onlyFiles: true,
95
+ cwd: filePath ? filePath : process.cwd()
90
96
  })
91
97
 
92
98
  if (result.length > 0) {
@@ -95,6 +101,20 @@ const findFilesPhp = async languagesFound => {
95
101
  return languagesFound
96
102
  }
97
103
 
104
+ const findFilesDotNet = async (languagesFound, filePath) => {
105
+ const result = await fg(['**/*.csproj', '**/packages.lock.json'], {
106
+ dot: false,
107
+ deep: 3,
108
+ onlyFiles: true,
109
+ cwd: filePath ? filePath : process.cwd()
110
+ })
111
+
112
+ if (result.length > 0) {
113
+ return languagesFound.push({ DOTNET: result })
114
+ }
115
+ return languagesFound
116
+ }
117
+
98
118
  const checkFilePermissions = file => {
99
119
  let readableFile = false
100
120
  try {
@@ -112,7 +132,18 @@ const fileExists = path => {
112
132
 
113
133
  const fileIsEmpty = path => {
114
134
  if (fileExists(path) && checkFilePermissions(path)) {
115
- return fs.readFileSync(path).length === 0
135
+ try {
136
+ return fs.readFileSync(path).length === 0
137
+ } catch (e) {
138
+ if (
139
+ e.message.toString().includes('illegal operation on a directory, read')
140
+ ) {
141
+ console.log('file provided cannot be a directory')
142
+ } else {
143
+ console.log(e.message.toString())
144
+ }
145
+ process.exit(0)
146
+ }
116
147
  }
117
148
  return false
118
149
  }
@@ -127,5 +158,6 @@ module.exports = {
127
158
  findFilesGo,
128
159
  findFilesPhp,
129
160
  findFilesRuby,
161
+ findFilesDotNet,
130
162
  fileIsEmpty
131
163
  }
@@ -34,8 +34,9 @@ export function formatScanOutput(scanResults: ScanResultsModel) {
34
34
 
35
35
  let defaultView = getDefaultView(scanResultsInstances.content)
36
36
 
37
- let count = defaultView.length
37
+ let count = 0
38
38
  defaultView.forEach(entry => {
39
+ count++
39
40
  let table = new Table({
40
41
  chars: {
41
42
  top: '',
@@ -98,7 +99,6 @@ export function formatScanOutput(scanResults: ScanResultsModel) {
98
99
  ]
99
100
  table.push(learnRow)
100
101
  }
101
- count--
102
102
  console.log(table.toString())
103
103
  console.log()
104
104
  })
@@ -179,7 +179,7 @@ export function getDefaultView(content: ResultContent[]) {
179
179
  assignBySeverity(resultEntry, groupResultsObj)
180
180
  })
181
181
 
182
- return sortBy(groupTypeResults, ['priority']).reverse()
182
+ return sortBy(groupTypeResults, ['priority'])
183
183
  }
184
184
  export function editVulName(message: string) {
185
185
  return message.substring(message.indexOf(' in '))
@@ -2,9 +2,7 @@ const paramHandler = require('../utils/paramsUtil/paramHandler')
2
2
  const constants = require('../../src/constants.js')
3
3
  const parsedCLIOptions = require('../../src/utils/parsedCLIOptions')
4
4
  const path = require('path')
5
- const {
6
- supportedLanguages
7
- } = require('../audit/languageAnalysisEngine/constants')
5
+ const { supportedLanguagesScan } = require('../constants/constants')
8
6
  const i18n = require('i18n')
9
7
  const { scanUsageGuide } = require('./help')
10
8
 
@@ -23,7 +21,7 @@ const getScanConfig = argv => {
23
21
 
24
22
  if (scanParams.language) {
25
23
  scanParams.language = scanParams.language.toUpperCase()
26
- if (!Object.values(supportedLanguages).includes(scanParams.language)) {
24
+ if (!Object.values(supportedLanguagesScan).includes(scanParams.language)) {
27
25
  console.log(`Did not recognise --language ${scanParams.language}`)
28
26
  console.log(i18n.__('constantsHowToRunDev3'))
29
27
  process.exit(1)
@@ -20,7 +20,7 @@ const handleResponseErrors = (res, api) => {
20
20
  } else if (res.statusCode === 412) {
21
21
  maxAppError()
22
22
  } else {
23
- genericError()
23
+ genericError(res)
24
24
  }
25
25
  }
26
26
 
@@ -1,4 +1,5 @@
1
1
  const path = require('path')
2
+ const child_process = require('child_process')
2
3
 
3
4
  function resolveFilePath(filepath) {
4
5
  if (filepath[0] === '~') {
@@ -8,10 +9,13 @@ function resolveFilePath(filepath) {
8
9
  }
9
10
 
10
11
  const returnProjectPath = () => {
11
- if (process.env.PWD !== (undefined || null || 'undefined')) {
12
+ if (process.platform == 'win32') {
13
+ let winPath = child_process.execSync('cd').toString()
14
+ return winPath.replace(/\//g, '\\').trim()
15
+ } else if (process.env.PWD !== (undefined || null || 'undefined')) {
12
16
  return process.env.PWD
13
17
  } else {
14
- return process.argv[process.argv.indexOf('--project_path') + 1]
18
+ return process.argv[process.argv.indexOf('--file') + 1]
15
19
  }
16
20
  }
17
21
 
@@ -33,11 +33,6 @@ const localConfig = (name: string, version: string) => {
33
33
  return config
34
34
  }
35
35
 
36
- const createConfigFromYaml = (yamlPath: string) => {
37
- const yamlConfig = {}
38
- return yamlConfig
39
- }
40
-
41
36
  const setConfigValues = (config: ContrastConf, values: ContrastConfOptions) => {
42
37
  config.set('apiKey', values.apiKey)
43
38
  config.set('organizationId', values.orgId)
@@ -45,10 +40,4 @@ const setConfigValues = (config: ContrastConf, values: ContrastConfOptions) => {
45
40
  values.host ? config.set('host', values.host) : null
46
41
  }
47
42
 
48
- export {
49
- localConfig,
50
- createConfigFromYaml,
51
- setConfigValues,
52
- ContrastConf,
53
- ContrastConfOptions
54
- }
43
+ export { localConfig, setConfigValues, ContrastConf, ContrastConfOptions }
@@ -1,37 +0,0 @@
1
- "use strict";
2
- class AnalysisEngine {
3
- constructor(initAnalysis = {}) {
4
- this.analyzers = [];
5
- this.analysis = { ...initAnalysis };
6
- }
7
- use(analyzer) {
8
- if (Array.isArray(analyzer)) {
9
- this.analyzers = [...this.analyzers, ...analyzer];
10
- return;
11
- }
12
- this.analyzers.push(analyzer);
13
- }
14
- analyze(callback, config) {
15
- let i = 0;
16
- const next = err => {
17
- if (err) {
18
- return setImmediate(() => callback(err, this.analysis));
19
- }
20
- if (i >= this.analyzers.length) {
21
- return setImmediate(() => callback(null, this.analysis));
22
- }
23
- const analyzer = this.analyzers[i];
24
- i++;
25
- setImmediate(() => {
26
- try {
27
- analyzer(this.analysis, next, config);
28
- }
29
- catch (uncaughtErr) {
30
- next(uncaughtErr);
31
- }
32
- });
33
- };
34
- next();
35
- }
36
- }
37
- module.exports = exports = AnalysisEngine;
@@ -1,32 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.determineProjectLanguage = exports.identifyLanguages = void 0;
7
- const i18n_1 = __importDefault(require("i18n"));
8
- const reduceIdentifiedLanguages_1 = require("../languageAnalysisEngine/reduceIdentifiedLanguages");
9
- const getProjectRootFilenames_1 = require("../languageAnalysisEngine/getProjectRootFilenames");
10
- function identifyLanguages(config) {
11
- const { projectPath } = config;
12
- const projectRootFilenames = (0, getProjectRootFilenames_1.getProjectRootFilenames)(projectPath);
13
- const identifiedLanguages = projectRootFilenames.reduce((accumulator, filename) => {
14
- const deducedLanguages = (0, reduceIdentifiedLanguages_1.deduceLanguage)(filename);
15
- return [...accumulator, ...deducedLanguages];
16
- }, []);
17
- if (Object.keys(identifiedLanguages).length === 0) {
18
- throw new Error(i18n_1.default.__('languageAnalysisNoLanguage', projectPath));
19
- }
20
- return (0, reduceIdentifiedLanguages_1.reduceIdentifiedLanguages)(identifiedLanguages);
21
- }
22
- exports.identifyLanguages = identifyLanguages;
23
- function determineProjectLanguage(reducedLanguages) {
24
- const reducedLanguagesKeys = Object.keys(reducedLanguages);
25
- if (reducedLanguagesKeys.length === 1) {
26
- return reducedLanguagesKeys[0];
27
- }
28
- else {
29
- throw new Error('Detected multiple languages. Please specify a single language using --language');
30
- }
31
- }
32
- exports.determineProjectLanguage = determineProjectLanguage;
@@ -1,25 +0,0 @@
1
- "use strict";
2
- const AnalysisEngine = require('../AnalysisEngine');
3
- const readProjectFileContents = require('./readProjectFileContents');
4
- const parseProjectFileContents = require('./parseProjectFileContents');
5
- const readLockFileContents = require('./readLockFileContents');
6
- const parseLockFileContents = require('./parseLockFileContents');
7
- const sanitizer = require('./sanitizer');
8
- const i18n = require('i18n');
9
- module.exports = exports = (language, config, callback) => {
10
- const ae = new AnalysisEngine({ language, config, dotnet: {} });
11
- ae.use([
12
- readProjectFileContents,
13
- parseProjectFileContents,
14
- readLockFileContents,
15
- parseLockFileContents,
16
- sanitizer
17
- ]);
18
- ae.analyze((err, analysis) => {
19
- if (err) {
20
- callback(new Error(i18n.__('dotnetAnalysisFailure') + err.message));
21
- return;
22
- }
23
- callback(null, analysis);
24
- });
25
- };
@@ -1,35 +0,0 @@
1
- "use strict";
2
- const i18n = require('i18n');
3
- module.exports = exports = ({ language: { lockFilePath }, dotnet }, next) => {
4
- const { rawLockFileContents } = dotnet;
5
- if (!rawLockFileContents) {
6
- next();
7
- return;
8
- }
9
- try {
10
- let count = 0;
11
- dotnet.lockFile = JSON.parse(rawLockFileContents);
12
- for (const dependenciesNode in dotnet.lockFile.dependencies) {
13
- for (const innerNode in dotnet.lockFile.dependencies[dependenciesNode]) {
14
- const nodeValidation = JSON.stringify(dotnet.lockFile.dependencies[dependenciesNode][innerNode]);
15
- if (nodeValidation.includes('"type":"Project"')) {
16
- count += 1;
17
- delete dotnet.lockFile.dependencies[dependenciesNode][innerNode];
18
- dotnet.additionalInfo = 'dependenciesNote';
19
- }
20
- }
21
- }
22
- if (count > 0) {
23
- const multiLevelProjectWarning = () => {
24
- console.log('');
25
- console.log(i18n.__('dependenciesNote'));
26
- };
27
- setTimeout(multiLevelProjectWarning, 7000);
28
- }
29
- }
30
- catch (err) {
31
- next(new Error(i18n.__('dotnetParseLockfile', lockFilePath) + `${err.message}`));
32
- return;
33
- }
34
- next();
35
- };
@@ -1,15 +0,0 @@
1
- "use strict";
2
- const xml2js = require('xml2js');
3
- const i18n = require('i18n');
4
- module.exports = exports = ({ language: { projectFilePath }, dotnet }, next) => {
5
- const { rawProjectFileContents } = dotnet;
6
- const parser = new xml2js.Parser({ explicitArray: false, mergeAttrs: true });
7
- parser.parseString(rawProjectFileContents, (err, projectFileXML) => {
8
- if (err) {
9
- next(new Error(i18n.__('dotnetParseProjectFile', projectFilePath) + `${err}`));
10
- return;
11
- }
12
- dotnet.projectFile = projectFileXML;
13
- next();
14
- });
15
- };
@@ -1,18 +0,0 @@
1
- "use strict";
2
- const fs = require('fs');
3
- const i18n = require('i18n');
4
- module.exports = exports = (analysis, next) => {
5
- const { language: { lockFilePath }, dotnet } = analysis;
6
- if (!lockFilePath) {
7
- next();
8
- return;
9
- }
10
- try {
11
- dotnet.rawLockFileContents = fs.readFileSync(lockFilePath);
12
- }
13
- catch (err) {
14
- next(new Error(i18n.__('dotnetReadLockfile', lockFilePath) + `${err.message}`));
15
- return;
16
- }
17
- next();
18
- };
@@ -1,14 +0,0 @@
1
- "use strict";
2
- const fs = require('fs');
3
- const i18n = require('i18n');
4
- module.exports = exports = (analysis, next) => {
5
- const { language: { projectFilePath }, dotnet } = analysis;
6
- try {
7
- dotnet.rawProjectFileContents = fs.readFileSync(projectFilePath);
8
- }
9
- catch (err) {
10
- next(new Error(i18n.__('dotnetReadProjectFile', projectFilePath) + `${err.message}`));
11
- return;
12
- }
13
- next();
14
- };
@@ -1,9 +0,0 @@
1
- "use strict";
2
- module.exports = exports = ({ dotnet }, next) => {
3
- delete dotnet.rawProjectFileContents;
4
- delete dotnet.parsedProjectFileContents;
5
- delete dotnet.projectFileXML;
6
- delete dotnet.packageReferences;
7
- delete dotnet.rawLockFileContents;
8
- next();
9
- };
@@ -1,17 +0,0 @@
1
- "use strict";
2
- const AnalysisEngine = require('../AnalysisEngine');
3
- const readProjectFileContents = require('./readProjectFileContents');
4
- const parseProjectFileContents = require('./parseProjectFileContents');
5
- const sanitizer = require('./sanitizer');
6
- const i18n = require('i18n');
7
- module.exports = exports = (language, config, callback) => {
8
- const ae = new AnalysisEngine({ language, config, go: {} });
9
- ae.use([readProjectFileContents, parseProjectFileContents, sanitizer]);
10
- ae.analyze((err, analysis) => {
11
- if (err) {
12
- callback(new Error(i18n.__('goAnalysisError') + `${err.message}`));
13
- return;
14
- }
15
- callback(null, analysis);
16
- });
17
- };