@contrast/contrast 1.0.8 → 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 (173) hide show
  1. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +3 -12
  2. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +88 -53
  3. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +4 -3
  4. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +58 -11
  5. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +38 -5
  6. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
  7. package/dist/audit/save.js +21 -13
  8. package/dist/commands/audit/auditConfig.js +0 -16
  9. package/dist/commands/audit/auditController.js +1 -10
  10. package/dist/commands/audit/help.js +7 -24
  11. package/dist/commands/audit/processAudit.js +1 -7
  12. package/dist/commands/audit/saveFile.js +2 -2
  13. package/dist/commands/scan/sca/scaAnalysis.js +22 -9
  14. package/dist/common/HTTPClient.js +8 -8
  15. package/dist/constants/constants.js +7 -2
  16. package/dist/constants/locales.js +24 -30
  17. package/dist/constants.js +11 -9
  18. package/dist/index.js +54 -45
  19. package/dist/lambda/lambda.js +5 -2
  20. package/dist/sbom/generateSbom.js +2 -2
  21. package/dist/scaAnalysis/common/formatMessage.js +7 -1
  22. package/dist/scaAnalysis/common/treeUpload.js +4 -5
  23. package/dist/scaAnalysis/dotnet/analysis.js +43 -0
  24. package/dist/scaAnalysis/dotnet/index.js +10 -0
  25. package/dist/scaAnalysis/javascript/analysis.js +4 -7
  26. package/dist/scaAnalysis/javascript/index.js +14 -5
  27. package/dist/scaAnalysis/php/analysis.js +14 -33
  28. package/dist/scaAnalysis/php/index.js +11 -4
  29. package/dist/scaAnalysis/ruby/analysis.js +2 -10
  30. package/dist/scan/autoDetection.js +18 -21
  31. package/dist/scan/fileUtils.js +31 -12
  32. package/dist/scan/formatScanOutput.js +3 -3
  33. package/dist/scan/scanConfig.js +2 -2
  34. package/dist/utils/getConfig.js +1 -6
  35. package/package.json +2 -3
  36. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +3 -32
  37. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +128 -68
  38. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
  39. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +41 -19
  40. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +43 -4
  41. package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
  42. package/src/audit/save.js +32 -16
  43. package/src/commands/audit/auditConfig.ts +0 -25
  44. package/src/commands/audit/auditController.ts +0 -11
  45. package/src/commands/audit/help.ts +7 -24
  46. package/src/commands/audit/processAudit.ts +1 -7
  47. package/src/commands/audit/saveFile.ts +2 -2
  48. package/src/commands/scan/processScan.js +0 -1
  49. package/src/commands/scan/sca/scaAnalysis.js +28 -13
  50. package/src/common/HTTPClient.js +9 -9
  51. package/src/constants/constants.js +9 -3
  52. package/src/constants/locales.js +47 -35
  53. package/src/constants.js +12 -10
  54. package/src/index.ts +76 -66
  55. package/src/lambda/lambda.ts +5 -2
  56. package/src/lambda/types.ts +1 -0
  57. package/src/sbom/generateSbom.ts +2 -2
  58. package/src/scaAnalysis/common/formatMessage.js +8 -1
  59. package/src/scaAnalysis/common/treeUpload.js +4 -5
  60. package/src/scaAnalysis/dotnet/analysis.js +54 -0
  61. package/src/scaAnalysis/dotnet/index.js +11 -0
  62. package/src/scaAnalysis/javascript/analysis.js +6 -7
  63. package/src/scaAnalysis/javascript/index.js +23 -7
  64. package/src/scaAnalysis/php/analysis.js +15 -35
  65. package/src/scaAnalysis/php/index.js +15 -4
  66. package/src/scaAnalysis/ruby/analysis.js +2 -11
  67. package/src/scan/autoDetection.js +18 -24
  68. package/src/scan/fileUtils.js +33 -12
  69. package/src/scan/formatScanOutput.ts +3 -3
  70. package/src/scan/scanConfig.js +2 -4
  71. package/src/utils/getConfig.ts +1 -12
  72. package/dist/audit/AnalysisEngine.js +0 -37
  73. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  74. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  75. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  76. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  77. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  78. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  79. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  80. package/dist/audit/goAnalysisEngine/index.js +0 -17
  81. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  82. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  83. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  84. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  85. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -155
  86. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  87. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  88. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  89. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -25
  90. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
  91. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  92. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
  93. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  94. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  95. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  96. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -66
  97. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -166
  98. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  99. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  100. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  101. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  102. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  103. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  104. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  105. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  106. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  107. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  108. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  109. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  110. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  111. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  112. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  113. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  114. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  115. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  116. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  117. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  118. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  119. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  120. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  121. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  122. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  123. package/src/audit/AnalysisEngine.js +0 -103
  124. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  125. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  126. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  127. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  128. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  129. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  130. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  131. package/src/audit/goAnalysisEngine/index.js +0 -18
  132. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  133. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  134. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  135. package/src/audit/javaAnalysisEngine/index.js +0 -41
  136. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -225
  137. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  138. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  139. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  140. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -36
  141. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
  142. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  143. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
  144. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  145. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  146. package/src/audit/languageAnalysisEngine/index.js +0 -45
  147. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -96
  148. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -251
  149. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  150. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  151. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  152. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  153. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  154. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  155. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  156. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  157. package/src/audit/phpAnalysisEngine/index.js +0 -27
  158. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  159. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  160. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  161. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  162. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  163. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  164. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  165. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  166. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  167. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  168. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  169. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  170. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  171. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  172. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  173. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
@@ -1,9 +1,9 @@
1
1
  import { getHttpClient } from '../utils/commonApi'
2
2
 
3
- export const generateSbom = (config: any) => {
3
+ export const generateSbom = (config: any, type: string) => {
4
4
  const client = getHttpClient(config)
5
5
  return client
6
- .getSbom(config)
6
+ .getSbom(config, type)
7
7
  .then((res: { statusCode: number; body: any }) => {
8
8
  if (res.statusCode === 200) {
9
9
  return res.body
@@ -50,11 +50,18 @@ const createPhpTSMessage = phpTree => {
50
50
  }
51
51
  }
52
52
 
53
+ const createDotNetTSMessage = dotnetTree => {
54
+ return {
55
+ dotnet: dotnetTree
56
+ }
57
+ }
58
+
53
59
  module.exports = {
54
60
  createJavaScriptTSMessage,
55
61
  createJavaTSMessage,
56
62
  createGoTSMessage,
57
63
  createPhpTSMessage,
58
64
  createRubyTSMessage,
59
- createPythonTSMessage
65
+ createPythonTSMessage,
66
+ createDotNetTSMessage
60
67
  }
@@ -1,4 +1,4 @@
1
- const { getHttpClient } = require('../../utils/commonApi')
1
+ const commonApi = require('../../utils/commonApi')
2
2
  const { APP_VERSION } = require('../../constants/constants')
3
3
 
4
4
  const commonSendSnapShot = async (analysis, config) => {
@@ -8,19 +8,18 @@ const commonSendSnapShot = async (analysis, config) => {
8
8
  snapshot: analysis
9
9
  }
10
10
 
11
- const client = getHttpClient(config)
11
+ const client = commonApi.getHttpClient(config)
12
12
  return client
13
13
  .sendSnapshot(requestBody, config)
14
14
  .then(res => {
15
15
  if (res.statusCode === 201) {
16
16
  return res.body
17
17
  } else {
18
- console.log(res.statusCode)
19
- console.log('error processing dependencies')
18
+ throw new Error(res.statusCode + ` error processing dependencies`)
20
19
  }
21
20
  })
22
21
  .catch(err => {
23
- console.log(err)
22
+ throw err
24
23
  })
25
24
  }
26
25
 
@@ -0,0 +1,54 @@
1
+ const fs = require('fs')
2
+ const xml2js = require('xml2js')
3
+ const i18n = require('i18n')
4
+
5
+ const readAndParseProjectFile = projectFilePath => {
6
+ const projectFile = fs.readFileSync(projectFilePath)
7
+
8
+ return new xml2js.Parser({
9
+ explicitArray: false,
10
+ mergeAttrs: true
11
+ }).parseString(projectFile)
12
+ }
13
+
14
+ const readAndParseLockFile = lockFilePath => {
15
+ const lockFile = JSON.parse(fs.readFileSync(lockFilePath).toString())
16
+
17
+ let count = 0 // Used to test if some nodes are deleted
18
+
19
+ for (const dependenciesNode in lockFile.dependencies) {
20
+ for (const innerNode in lockFile.dependencies[dependenciesNode]) {
21
+ const nodeValidation = JSON.stringify(
22
+ lockFile.dependencies[dependenciesNode][innerNode]
23
+ )
24
+ if (nodeValidation.includes('"type":"Project"')) {
25
+ count += 1
26
+ delete lockFile.dependencies[dependenciesNode][innerNode]
27
+ lockFile.additionalInfo = 'dependenciesNote'
28
+ }
29
+ }
30
+ }
31
+
32
+ if (count > 0) {
33
+ const multiLevelProjectWarning = () => {
34
+ console.log('')
35
+ console.log(i18n.__('dependenciesNote'))
36
+ }
37
+ setTimeout(multiLevelProjectWarning, 7000)
38
+ }
39
+
40
+ return lockFile
41
+ }
42
+
43
+ const getDotNetDeps = (filePath, languageFiles) => {
44
+ const projectFile = readAndParseProjectFile(filePath + `/${languageFiles[0]}`)
45
+ const lockFile = readAndParseLockFile(filePath + `/${languageFiles[1]}`)
46
+
47
+ return { projectFile, lockFile }
48
+ }
49
+
50
+ module.exports = {
51
+ getDotNetDeps,
52
+ readAndParseProjectFile,
53
+ readAndParseLockFile
54
+ }
@@ -0,0 +1,11 @@
1
+ const { getDotNetDeps } = require('./analysis')
2
+ const { createDotNetTSMessage } = require('../common/formatMessage')
3
+
4
+ const dotNetAnalysis = (config, languageFiles) => {
5
+ const dotNetDeps = getDotNetDeps(config.file, languageFiles.DOTNET)
6
+ return createDotNetTSMessage(dotNetDeps)
7
+ }
8
+
9
+ module.exports = {
10
+ dotNetAnalysis
11
+ }
@@ -12,7 +12,7 @@ const readFile = async (config, languageFiles, nameOfFile) => {
12
12
  if (config.file) {
13
13
  return fs.readFileSync(config.file.concat(languageFiles[index]), 'utf8')
14
14
  } else {
15
- console.log('could not find file')
15
+ throw new Error('could not find file')
16
16
  }
17
17
  }
18
18
 
@@ -40,8 +40,7 @@ const readYarn = async (config, languageFiles, nameOfFile) => {
40
40
 
41
41
  return yarn
42
42
  } catch (err) {
43
- console.log(i18n.__('nodeReadYarnLockFileError') + `${err.message}`)
44
- return
43
+ throw new Error(i18n.__('nodeReadYarnLockFileError') + `${err.message}`)
45
44
  }
46
45
  }
47
46
 
@@ -80,8 +79,7 @@ const parseNpmLockFile = async js => {
80
79
  return js.npmLockFile
81
80
  }
82
81
  } catch (err) {
83
- console.log(i18n.__('NodeParseNPM') + `${err.message}`)
84
- return
82
+ throw new Error(i18n.__('NodeParseNPM') + `${err.message}`)
85
83
  }
86
84
  }
87
85
 
@@ -113,8 +111,9 @@ const parseYarnLockFile = async js => {
113
111
  return js
114
112
  }
115
113
  } catch (err) {
116
- console.log(i18n.__('NodeParseYarn') + `${err.message}`)
117
- return
114
+ throw new Error(
115
+ i18n.__('NodeParseYarn', js.yarn.yarnVersion) + `${err.message}`
116
+ )
118
117
  }
119
118
  }
120
119
 
@@ -3,13 +3,8 @@ const i18n = require('i18n')
3
3
  const formatMessage = require('../common/formatMessage')
4
4
 
5
5
  const jsAnalysis = async (config, languageFiles) => {
6
- if (
7
- languageFiles.JAVASCRIPT.includes('package-lock.json') &&
8
- languageFiles.JAVASCRIPT.includes('yarn.lock')
9
- ) {
10
- console.log(i18n.__('languageAnalysisMultipleLanguages1'))
11
- return
12
- }
6
+ checkForCorrectFiles(languageFiles)
7
+
13
8
  return buildNodeTree(config, languageFiles.JAVASCRIPT)
14
9
  }
15
10
  const buildNodeTree = async (config, files) => {
@@ -51,6 +46,27 @@ const parseFiles = async (config, files, js) => {
51
46
  return js
52
47
  }
53
48
 
49
+ const checkForCorrectFiles = languageFiles => {
50
+ if (
51
+ languageFiles.JAVASCRIPT.includes('package-lock.json') &&
52
+ languageFiles.JAVASCRIPT.includes('yarn.lock')
53
+ ) {
54
+ throw new Error(
55
+ i18n.__('languageAnalysisHasMultipleLockFiles', 'javascript')
56
+ )
57
+ }
58
+
59
+ if (
60
+ !languageFiles.JAVASCRIPT.includes('package-lock.json') &&
61
+ !languageFiles.JAVASCRIPT.includes('yarn.lock')
62
+ ) {
63
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'javascript'))
64
+ }
65
+
66
+ if (!languageFiles.JAVASCRIPT.includes('package.json')) {
67
+ throw new Error(i18n.__('languageAnalysisHasNoPackageJsonFile'))
68
+ }
69
+ }
54
70
  module.exports = {
55
71
  jsAnalysis
56
72
  }
@@ -2,24 +2,24 @@ const fs = require('fs')
2
2
  const i18n = require('i18n')
3
3
  const _ = require('lodash')
4
4
 
5
- let php = {}
5
+ const readFile = (config, nameOfFile) => {
6
+ if (config.file) {
7
+ try {
8
+ return fs.readFileSync(config.file + '/' + nameOfFile)
9
+ } catch (error) {
10
+ console.log('Unable to find file')
11
+ console.log(error)
12
+ }
13
+ }
14
+ }
6
15
 
7
- const readProjectFile = (projectPath, customFile) => {
8
- const filePath = filePathForWindows(projectPath + customFile)
16
+ const parseProjectFiles = php => {
9
17
  try {
10
- php.composerJSON = JSON.parse(fs.readFileSync(filePath, 'utf8')) //wrong here
18
+ // composer.json
11
19
  php.composerJSON.dependencies = php.composerJSON.require
12
20
  php.composerJSON.devDependencies = php.composerJSON['require-dev']
13
- return php
14
- } catch (err) {
15
- console.log(err.message.toString())
16
- }
17
- }
18
21
 
19
- const readAndParseLockFile = (projectPath, customFile) => {
20
- const filePath = filePathForWindows(projectPath + customFile)
21
- try {
22
- php.rawLockFileContents = JSON.parse(fs.readFileSync(filePath, 'utf8'))
22
+ // composer.lock
23
23
  php.lockFile = php.rawLockFileContents
24
24
  let packages = _.keyBy(php.lockFile.packages, 'name')
25
25
  let packagesDev = _.keyBy(php.lockFile['packages-dev'], 'name')
@@ -54,25 +54,6 @@ const readAndParseLockFile = (projectPath, customFile) => {
54
54
  }
55
55
  }
56
56
 
57
- const getPhpDeps = (config, files) => {
58
- try {
59
- return (
60
- readProjectFile(config.file, files[0].projectFilename),
61
- readAndParseLockFile(config.file, files[1].lockFilename)
62
- )
63
- } catch (err) {
64
- console.log(err.message.toString())
65
- process.exit(1)
66
- }
67
- }
68
-
69
- const filePathForWindows = path => {
70
- if (process.platform === 'win32') {
71
- path = path.replace(/\//g, '\\')
72
- }
73
- return path
74
- }
75
-
76
57
  function addChildDepToLockFileAsOwnObj(php, depObj, key) {
77
58
  php.lockFile.dependencies[key] = { version: depObj[key] }
78
59
  }
@@ -92,7 +73,6 @@ function formatParentDepToLockFile(php) {
92
73
  }
93
74
 
94
75
  module.exports = {
95
- getPhpDeps,
96
- readAndParseLockFile,
97
- readProjectFile
76
+ parseProjectFiles,
77
+ readFile
98
78
  }
@@ -1,9 +1,20 @@
1
- const { getPhpDeps } = require('./analysis')
1
+ const { readFile, parseProjectFiles } = require('./analysis')
2
2
  const { createPhpTSMessage } = require('../common/formatMessage')
3
3
 
4
- const phpAnalysis = (config, languageFiles) => {
5
- const phpDeps = getPhpDeps(config, languageFiles.PHP)
6
- return createPhpTSMessage(phpDeps)
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
7
18
  }
8
19
 
9
20
  module.exports = {
@@ -1,8 +1,7 @@
1
1
  const fs = require('fs')
2
2
 
3
3
  const readAndParseGemfile = file => {
4
- const fileName = filePathForWindows(file + '/Gemfile')
5
- const gemFile = fs.readFileSync(fileName, 'utf8')
4
+ const gemFile = fs.readFileSync(file + '/Gemfile', 'utf8')
6
5
  const rubyArray = gemFile.split('\n')
7
6
 
8
7
  let filteredRubyDep = rubyArray.filter(element => {
@@ -21,8 +20,7 @@ const readAndParseGemfile = file => {
21
20
  }
22
21
 
23
22
  const readAndParseGemLockFile = file => {
24
- const fileName = filePathForWindows(file + '/Gemfile.lock')
25
- const lockFile = fs.readFileSync(fileName, 'utf8')
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')
@@ -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,6 +1,5 @@
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')
5
4
 
6
5
  const autoDetectFileAndLanguage = async configToUse => {
@@ -28,18 +27,26 @@ const autoDetectFileAndLanguage = async configToUse => {
28
27
  }
29
28
  }
30
29
 
31
- const autoDetectAuditFilesAndLanguages = async () => {
30
+ const autoDetectAuditFilesAndLanguages = async file => {
31
+ const filePath = file
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
+ if (filePath) {
35
+ rootFile.getProjectRootFilenames(filePath)
36
+ console.log(i18n.__('searchingAuditFileDirectory', filePath))
37
+ } else {
38
+ console.log(i18n.__('searchingAuditFileDirectory', process.cwd()))
39
+ }
41
40
 
42
- if (languagesFound.length === 1) {
41
+ await fileFinder.findFilesJava(languagesFound, filePath)
42
+ await fileFinder.findFilesJavascript(languagesFound, filePath)
43
+ await fileFinder.findFilesPython(languagesFound, filePath)
44
+ await fileFinder.findFilesGo(languagesFound, filePath)
45
+ await fileFinder.findFilesPhp(languagesFound, filePath)
46
+ await fileFinder.findFilesRuby(languagesFound, filePath)
47
+ await fileFinder.findFilesDotNet(languagesFound, filePath)
48
+
49
+ if (languagesFound.length <= 1) {
43
50
  return languagesFound
44
51
  } else {
45
52
  console.log(
@@ -48,18 +55,6 @@ const autoDetectAuditFilesAndLanguages = async () => {
48
55
  }
49
56
  }
50
57
 
51
- const manualDetectAuditFilesAndLanguages = file => {
52
- let projectRootFilenames = rootFile.getProjectRootFilenames(file)
53
- let identifiedLanguages =
54
- languageResolver.deduceLanguageScaAnalysis(projectRootFilenames)
55
-
56
- if (Object.keys(identifiedLanguages).length === 0) {
57
- console.log(i18n.__('languageAnalysisNoLanguage', file))
58
- return []
59
- }
60
- return [identifiedLanguages]
61
- }
62
-
63
58
  const hasWhiteSpace = s => {
64
59
  const filename = s.split('/').pop()
65
60
  return filename.indexOf(' ') >= 0
@@ -100,6 +95,5 @@ module.exports = {
100
95
  autoDetectFileAndLanguage,
101
96
  errorOnFileDetection,
102
97
  autoDetectAuditFilesAndLanguages,
103
- errorOnAuditFileDetection,
104
- manualDetectAuditFilesAndLanguages
98
+ errorOnAuditFileDetection
105
99
  }
@@ -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
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 {
@@ -138,5 +158,6 @@ module.exports = {
138
158
  findFilesGo,
139
159
  findFilesPhp,
140
160
  findFilesRuby,
161
+ findFilesDotNet,
141
162
  fileIsEmpty
142
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)
@@ -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 { file } = config;
12
- const projectRootFilenames = (0, getProjectRootFilenames_1.getProjectRootFilenames)(file);
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', file));
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;