@contrast/contrast 1.0.8 → 1.0.11

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 (217) hide show
  1. package/README.md +2 -2
  2. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +16 -25
  3. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +103 -57
  4. package/dist/audit/languageAnalysisEngine/report/models/reportGuidanceModel.js +6 -0
  5. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +3 -3
  6. package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +1 -0
  7. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +68 -17
  8. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +39 -7
  9. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
  10. package/dist/audit/save.js +21 -13
  11. package/dist/commands/audit/auditConfig.js +3 -19
  12. package/dist/commands/audit/auditController.js +1 -10
  13. package/dist/commands/audit/help.js +7 -24
  14. package/dist/commands/audit/processAudit.js +5 -9
  15. package/dist/commands/audit/saveFile.js +2 -2
  16. package/dist/commands/auth/auth.js +1 -1
  17. package/dist/commands/config/config.js +2 -2
  18. package/dist/commands/scan/processScan.js +11 -4
  19. package/dist/commands/scan/sca/scaAnalysis.js +37 -13
  20. package/dist/common/HTTPClient.js +17 -8
  21. package/dist/common/errorHandling.js +2 -2
  22. package/dist/common/fail.js +66 -0
  23. package/dist/common/versionChecker.js +1 -1
  24. package/dist/constants/constants.js +7 -2
  25. package/dist/constants/locales.js +40 -38
  26. package/dist/constants.js +62 -12
  27. package/dist/index.js +57 -45
  28. package/dist/lambda/lambda.js +5 -2
  29. package/dist/sbom/generateSbom.js +2 -2
  30. package/dist/scaAnalysis/common/formatMessage.js +7 -1
  31. package/dist/scaAnalysis/common/scaParserForGoAndJava.js +32 -0
  32. package/dist/scaAnalysis/common/treeUpload.js +24 -10
  33. package/dist/scaAnalysis/dotnet/analysis.js +55 -0
  34. package/dist/scaAnalysis/dotnet/index.js +10 -0
  35. package/dist/scaAnalysis/go/goAnalysis.js +8 -2
  36. package/dist/scaAnalysis/java/analysis.js +10 -6
  37. package/dist/scaAnalysis/java/index.js +7 -1
  38. package/dist/scaAnalysis/java/javaBuildDepsParser.js +19 -3
  39. package/dist/scaAnalysis/javascript/analysis.js +4 -7
  40. package/dist/scaAnalysis/javascript/index.js +16 -4
  41. package/dist/scaAnalysis/php/analysis.js +14 -33
  42. package/dist/scaAnalysis/php/index.js +11 -4
  43. package/dist/scaAnalysis/python/analysis.js +43 -5
  44. package/dist/scaAnalysis/python/index.js +7 -2
  45. package/dist/scaAnalysis/ruby/analysis.js +16 -14
  46. package/dist/scan/autoDetection.js +13 -24
  47. package/dist/scan/fileUtils.js +31 -12
  48. package/dist/scan/formatScanOutput.js +9 -8
  49. package/dist/scan/populateProjectIdAndProjectName.js +5 -0
  50. package/dist/scan/scan.js +4 -0
  51. package/dist/scan/scanConfig.js +5 -5
  52. package/dist/scan/scanResults.js +39 -3
  53. package/dist/telemetry/telemetry.js +137 -0
  54. package/dist/utils/commonApi.js +1 -1
  55. package/dist/utils/getConfig.js +3 -8
  56. package/dist/utils/parsedCLIOptions.js +3 -1
  57. package/dist/utils/requestUtils.js +7 -1
  58. package/package.json +2 -3
  59. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +21 -57
  60. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +155 -77
  61. package/src/audit/languageAnalysisEngine/report/models/reportGuidanceModel.ts +5 -0
  62. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +5 -5
  63. package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +2 -0
  64. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +56 -27
  65. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +45 -6
  66. package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
  67. package/src/audit/save.js +32 -16
  68. package/src/commands/audit/auditConfig.ts +10 -28
  69. package/src/commands/audit/auditController.ts +0 -11
  70. package/src/commands/audit/help.ts +7 -24
  71. package/src/commands/audit/processAudit.ts +16 -8
  72. package/src/commands/audit/saveFile.ts +2 -2
  73. package/src/commands/auth/auth.js +3 -1
  74. package/src/commands/config/config.js +4 -2
  75. package/src/commands/scan/processScan.js +18 -5
  76. package/src/commands/scan/sca/scaAnalysis.js +50 -18
  77. package/src/common/HTTPClient.js +23 -9
  78. package/src/common/errorHandling.ts +2 -3
  79. package/src/common/fail.js +75 -0
  80. package/src/common/versionChecker.ts +1 -1
  81. package/src/constants/constants.js +9 -3
  82. package/src/constants/locales.js +70 -45
  83. package/src/constants.js +67 -13
  84. package/src/index.ts +91 -66
  85. package/src/lambda/lambda.ts +5 -2
  86. package/src/lambda/types.ts +1 -0
  87. package/src/sbom/generateSbom.ts +2 -2
  88. package/src/scaAnalysis/common/formatMessage.js +8 -1
  89. package/src/scaAnalysis/common/scaParserForGoAndJava.js +41 -0
  90. package/src/scaAnalysis/common/treeUpload.js +25 -11
  91. package/src/scaAnalysis/dotnet/analysis.js +72 -0
  92. package/src/scaAnalysis/dotnet/index.js +11 -0
  93. package/src/scaAnalysis/go/goAnalysis.js +9 -2
  94. package/src/scaAnalysis/java/analysis.js +11 -6
  95. package/src/scaAnalysis/java/index.js +9 -1
  96. package/src/scaAnalysis/java/javaBuildDepsParser.js +25 -6
  97. package/src/scaAnalysis/javascript/analysis.js +6 -7
  98. package/src/scaAnalysis/javascript/index.js +25 -6
  99. package/src/scaAnalysis/php/analysis.js +15 -35
  100. package/src/scaAnalysis/php/index.js +15 -4
  101. package/src/scaAnalysis/python/analysis.js +49 -5
  102. package/src/scaAnalysis/python/index.js +7 -2
  103. package/src/scaAnalysis/ruby/analysis.js +18 -15
  104. package/src/scan/autoDetection.js +14 -27
  105. package/src/scan/fileUtils.js +33 -12
  106. package/src/scan/formatScanOutput.ts +10 -8
  107. package/src/scan/populateProjectIdAndProjectName.js +5 -1
  108. package/src/scan/scan.ts +4 -0
  109. package/src/scan/scanConfig.js +7 -7
  110. package/src/scan/scanResults.js +46 -3
  111. package/src/telemetry/telemetry.ts +154 -0
  112. package/src/utils/commonApi.js +1 -1
  113. package/src/utils/getConfig.ts +5 -18
  114. package/src/utils/parsedCLIOptions.js +14 -1
  115. package/src/utils/requestUtils.js +8 -1
  116. package/dist/audit/AnalysisEngine.js +0 -37
  117. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  118. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  119. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  120. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  121. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  122. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  123. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  124. package/dist/audit/goAnalysisEngine/index.js +0 -17
  125. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  126. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  127. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  128. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  129. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -155
  130. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  131. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  132. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  133. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -25
  134. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
  135. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  136. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
  137. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  138. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  139. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  140. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -66
  141. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -166
  142. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  143. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  144. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  145. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  146. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  147. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  148. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  149. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  150. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  151. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  152. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  153. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  154. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  155. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  156. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  157. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  158. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  159. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  160. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  161. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  162. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  163. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  164. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  165. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  166. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  167. package/src/audit/AnalysisEngine.js +0 -103
  168. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  169. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  170. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  171. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  172. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  173. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  174. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  175. package/src/audit/goAnalysisEngine/index.js +0 -18
  176. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  177. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  178. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  179. package/src/audit/javaAnalysisEngine/index.js +0 -41
  180. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -225
  181. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  182. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  183. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  184. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -36
  185. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
  186. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  187. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
  188. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  189. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  190. package/src/audit/languageAnalysisEngine/index.js +0 -45
  191. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -96
  192. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -251
  193. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  194. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  195. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  196. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  197. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  198. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  199. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  200. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  201. package/src/audit/phpAnalysisEngine/index.js +0 -27
  202. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  203. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  204. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  205. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  206. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  207. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  208. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  209. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  210. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  211. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  212. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  213. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  214. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  215. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  216. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  217. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
package/src/audit/save.js CHANGED
@@ -3,27 +3,43 @@ const i18n = require('i18n')
3
3
  const chalk = require('chalk')
4
4
  const save = require('../commands/audit/saveFile')
5
5
  const sbom = require('../sbom/generateSbom')
6
+ const {
7
+ SBOM_CYCLONE_DX_FILE,
8
+ SBOM_SPDX_FILE
9
+ } = require('../constants/constants')
6
10
 
7
11
  async function auditSave(config) {
8
- if (config.save) {
9
- if (config.save.toLowerCase() === 'sbom') {
10
- save.saveFile(config, await sbom.generateSbom(config))
12
+ let fileFormat
13
+ switch (config.save) {
14
+ case null:
15
+ case SBOM_CYCLONE_DX_FILE:
16
+ fileFormat = SBOM_CYCLONE_DX_FILE
17
+ break
18
+ case SBOM_SPDX_FILE:
19
+ fileFormat = SBOM_SPDX_FILE
20
+ break
21
+ default:
22
+ break
23
+ }
11
24
 
12
- const filename = `${config.applicationId}-sbom-cyclonedx.json`
13
- if (fs.existsSync(filename)) {
14
- console.log(i18n.__('auditSBOMSaveSuccess') + ` - ${filename}`)
15
- } else {
16
- console.log(
17
- chalk.yellow.bold(
18
- `\n Unable to save ${filename} Software Bill of Materials (SBOM)`
19
- )
20
- )
21
- }
25
+ if (fileFormat) {
26
+ save.saveFile(
27
+ config,
28
+ fileFormat,
29
+ await sbom.generateSbom(config, fileFormat)
30
+ )
31
+ const filename = `${config.applicationId}-sbom-${fileFormat}.json`
32
+ if (fs.existsSync(filename)) {
33
+ console.log(i18n.__('auditSBOMSaveSuccess') + ` - ${filename}`)
22
34
  } else {
23
- console.log(i18n.__('auditBadFiletypeSpecifiedForSave'))
35
+ console.log(
36
+ chalk.yellow.bold(
37
+ `\n Unable to save ${filename} Software Bill of Materials (SBOM)`
38
+ )
39
+ )
24
40
  }
25
- } else if (config.save === null) {
26
- console.log(i18n.__('auditNoFiletypeSpecifiedForSave'))
41
+ } else {
42
+ console.log(i18n.__('auditBadFiletypeSpecifiedForSave'))
27
43
  }
28
44
  }
29
45
 
@@ -1,39 +1,21 @@
1
1
  import paramHandler from '../../utils/paramsUtil/paramHandler'
2
2
  import constants from '../../constants'
3
- import cliOptions from '../../utils/parsedCLIOptions'
4
- import languageAnalysisEngine from '../../audit/languageAnalysisEngine/constants'
5
- import {
6
- determineProjectLanguage,
7
- identifyLanguages
8
- } from '../../audit/autodetection/autoDetectLanguage'
3
+ import { getCommandLineArgsCustom } from '../../utils/parsedCLIOptions'
4
+ import { ContrastConf } from '../../utils/getConfig'
9
5
 
10
- const {
11
- supportedLanguages: { NODE, JAVASCRIPT }
12
- } = languageAnalysisEngine
13
-
14
- export const getAuditConfig = (argv: string[]): { [key: string]: string } => {
15
- const auditParameters = cliOptions.getCommandLineArgsCustom(
6
+ export const getAuditConfig = async (
7
+ contrastConf: ContrastConf,
8
+ command: string,
9
+ argv: string[]
10
+ ): Promise<{ [key: string]: string }> => {
11
+ const auditParameters = await getCommandLineArgsCustom(
12
+ contrastConf,
13
+ command,
16
14
  argv,
17
15
  constants.commandLineDefinitions.auditOptionDefinitions
18
16
  )
19
17
  const paramsAuth = paramHandler.getAuth(auditParameters)
20
18
 
21
- if (
22
- auditParameters.language === undefined ||
23
- auditParameters.language === null
24
- ) {
25
- try {
26
- auditParameters.language = determineProjectLanguage(
27
- identifyLanguages(auditParameters)
28
- )
29
- } catch (err: any) {
30
- console.log(err.message)
31
- process.exit(1)
32
- }
33
- } else if (auditParameters.language.toUpperCase() === JAVASCRIPT) {
34
- auditParameters.language = NODE.toLowerCase()
35
- }
36
-
37
19
  // @ts-ignore
38
20
  return { ...paramsAuth, ...auditParameters }
39
21
  }
@@ -1,9 +1,6 @@
1
1
  import { catalogueApplication } from '../../audit/catalogueApplication/catalogueApplication'
2
2
  import commonApi from '../../audit/languageAnalysisEngine/commonApi'
3
3
 
4
- const identifyLanguageAE = require('./../../audit/languageAnalysisEngine')
5
- const languageFactory = require('../../audit/languageAnalysisEngine/languageAnalysisFactory')
6
-
7
4
  export const dealWithNoAppId = async (config: { [x: string]: string }) => {
8
5
  let appID: string
9
6
  try {
@@ -32,14 +29,6 @@ export const dealWithNoAppId = async (config: { [x: string]: string }) => {
32
29
  return appID
33
30
  }
34
31
 
35
- export const startAudit = async (config: { [key: string]: string }) => {
36
- if (!config.applicationId) {
37
- // @ts-ignore
38
- config.applicationId = await dealWithNoAppId(config)
39
- }
40
- identifyLanguageAE(config.file, languageFactory, config.applicationId, config)
41
- }
42
-
43
32
  export const getAppName = (file: string) => {
44
33
  const last = file.charAt(file.length - 1)
45
34
  if (last !== '/') {
@@ -13,30 +13,13 @@ const auditUsageGuide = commandLineUsage([
13
13
  '{bold ' +
14
14
  i18n.__('constantsAuditPrerequisitesContentSupportedLanguages') +
15
15
  '}',
16
- '{bold ' +
17
- i18n.__('constantsAuditPrerequisitesContentJava') +
18
- '}' +
19
- i18n.__('constantsAuditPrerequisitesContentMessage'),
20
- '',
21
- '{italic ' + i18n.__('constantsJavaNote') + '}',
22
- '{italic ' + i18n.__('constantsJavaNoteGradle') + '}',
23
- '',
24
- '{bold ' +
25
- i18n.__('constantsAuditPrerequisitesContentDotNet') +
26
- '}' +
27
- i18n.__('constantsAuditPrerequisitesContentDotNetMessage'),
28
- '{bold ' +
29
- i18n.__('constantsAuditPrerequisitesContentLanguageNode') +
30
- '}' +
31
- i18n.__('constantsAuditPrerequisitesContentLanguageNodeMessage'),
32
- '{bold ' +
33
- i18n.__('constantsAuditPrerequisitesContentLanguageRuby') +
34
- '}' +
35
- i18n.__('constantsAuditPrerequisitesContentLanguageRubyMessage'),
36
- '{bold ' +
37
- i18n.__('constantsAuditPrerequisitesContentLanguagePython') +
38
- '}' +
39
- i18n.__('constantsAuditPrerequisitesContentLanguagePythonMessage')
16
+ i18n.__('constantsAuditPrerequisitesJavaContentMessage'),
17
+ i18n.__('constantsAuditPrerequisitesContentDotNetMessage'),
18
+ i18n.__('constantsAuditPrerequisitesContentNodeMessage'),
19
+ i18n.__('constantsAuditPrerequisitesContentRubyMessage'),
20
+ i18n.__('constantsAuditPrerequisitesContentPythonMessage'),
21
+ i18n.__('constantsAuditPrerequisitesContentGoMessage'),
22
+ i18n.__('constantsAuditPrerequisitesContentPHPMessage')
40
23
  ]
41
24
  },
42
25
  {
@@ -1,22 +1,30 @@
1
- import { startAudit } from './auditController'
2
1
  import { getAuditConfig } from './auditConfig'
3
2
  import { auditUsageGuide } from './help'
4
3
  import { processSca } from '../scan/sca/scaAnalysis'
4
+ import { sendTelemetryConfigAsObject } from '../../telemetry/telemetry'
5
+ import { ContrastConf } from '../../utils/getConfig'
5
6
 
6
7
  export type parameterInput = string[]
7
8
 
8
- export const processAudit = async (argv: parameterInput) => {
9
+ export const processAudit = async (
10
+ contrastConf: ContrastConf,
11
+ argv: parameterInput
12
+ ) => {
9
13
  if (argv.indexOf('--help') != -1) {
10
14
  printHelpMessage()
11
15
  process.exit(0)
12
16
  }
13
- const config = getAuditConfig(argv)
14
17
 
15
- if (config.experimental) {
16
- await processSca(config)
17
- } else {
18
- await startAudit(config)
19
- }
18
+ const config = await getAuditConfig(contrastConf, 'audit', argv)
19
+ await processSca(config)
20
+ await sendTelemetryConfigAsObject(
21
+ config,
22
+ 'audit',
23
+ argv,
24
+ 'SUCCESS',
25
+ // @ts-ignore
26
+ config.language
27
+ )
20
28
  }
21
29
 
22
30
  const printHelpMessage = () => {
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs'
2
2
 
3
- export const saveFile = (config: any, rawResults: any) => {
4
- const fileName = `${config.applicationId}-sbom-cyclonedx.json`
3
+ export const saveFile = (config: any, type: string, rawResults: any) => {
4
+ const fileName = `${config.applicationId}-sbom-${type}.json`
5
5
  fs.writeFileSync(fileName, JSON.stringify(rawResults))
6
6
  }
7
7
 
@@ -16,7 +16,9 @@ const constants = require('../../constants')
16
16
  const commandLineUsage = require('command-line-usage')
17
17
 
18
18
  const processAuth = async (argv, config) => {
19
- let authParams = parsedCLIOptions.getCommandLineArgsCustom(
19
+ let authParams = await parsedCLIOptions.getCommandLineArgsCustom(
20
+ config,
21
+ 'auth',
20
22
  argv,
21
23
  constants.commandLineDefinitions.authOptionDefinitions
22
24
  )
@@ -3,9 +3,11 @@ const constants = require('../../constants')
3
3
  const commandLineUsage = require('command-line-usage')
4
4
  const i18n = require('i18n')
5
5
 
6
- const processConfig = (argv, config) => {
6
+ const processConfig = async (argv, config) => {
7
7
  try {
8
- let configParams = parsedCLIOptions.getCommandLineArgsCustom(
8
+ let configParams = await parsedCLIOptions.getCommandLineArgsCustom(
9
+ config,
10
+ 'config',
9
11
  argv,
10
12
  constants.commandLineDefinitions.configOptionDefinitions
11
13
  )
@@ -4,24 +4,37 @@ const { saveScanFile } = require('../../utils/saveFile')
4
4
  const { ScanResultsModel } = require('../../scan/models/scanResultsModel')
5
5
  const { formatScanOutput } = require('../../scan/formatScanOutput')
6
6
  const { processSca } = require('./sca/scaAnalysis')
7
+ const common = require('../../common/fail')
8
+ const { sendTelemetryConfigAsObject } = require('../../telemetry/telemetry')
7
9
 
8
- const processScan = async argvMain => {
9
- let config = scanConfig.getScanConfig(argvMain)
10
- // console.log(config)
10
+ const processScan = async (contrastConf, argv) => {
11
+ let config = await scanConfig.getScanConfig(contrastConf, 'scan', argv)
12
+ let output = undefined
11
13
  //try SCA analysis first
12
14
  if (config.experimental) {
13
- await processSca(config)
15
+ await processSca(config, argv)
14
16
  }
15
17
 
16
18
  let scanResults = new ScanResultsModel(await startScan(config))
19
+ await sendTelemetryConfigAsObject(
20
+ config,
21
+ 'scan',
22
+ argv,
23
+ 'SUCCESS',
24
+ scanResults.scanDetail.language
25
+ )
17
26
 
18
27
  if (scanResults.scanResultsInstances !== undefined) {
19
- formatScanOutput(scanResults)
28
+ output = formatScanOutput(scanResults)
20
29
  }
21
30
 
22
31
  if (config.save !== undefined) {
23
32
  await saveScanFile(config, scanResults)
24
33
  }
34
+
35
+ if (config.fail) {
36
+ common.processFail(config, output)
37
+ }
25
38
  }
26
39
 
27
40
  module.exports = {
@@ -1,13 +1,10 @@
1
1
  const autoDetection = require('../../../scan/autoDetection')
2
2
  const javaAnalysis = require('../../../scaAnalysis/java')
3
3
  const treeUpload = require('../../../scaAnalysis/common/treeUpload')
4
- const {
5
- manualDetectAuditFilesAndLanguages
6
- } = require('../../../scan/autoDetection')
7
4
  const auditController = require('../../audit/auditController')
8
5
  const {
9
- supportedLanguages: { JAVA, GO, PYTHON, RUBY, JAVASCRIPT, NODE, PHP }
10
- } = require('../../../audit/languageAnalysisEngine/constants')
6
+ supportedLanguages: { JAVA, GO, PYTHON, RUBY, JAVASCRIPT, NODE, PHP, DOTNET }
7
+ } = require('../../../constants/constants')
11
8
  const goAnalysis = require('../../../scaAnalysis/go/goAnalysis')
12
9
  const phpAnalysis = require('../../../scaAnalysis/php/index')
13
10
  const { rubyAnalysis } = require('../../../scaAnalysis/ruby')
@@ -26,15 +23,33 @@ const {
26
23
  vulnerabilityReportV2
27
24
  } = require('../../../audit/languageAnalysisEngine/report/reportingFeature')
28
25
  const auditSave = require('../../../audit/save')
29
-
26
+ const { dotNetAnalysis } = require('../../../scaAnalysis/dotnet')
27
+ const { auditUsageGuide } = require('../../audit/help')
28
+ const rootFile = require('../../../audit/languageAnalysisEngine/getProjectRootFilenames')
29
+ const path = require('path')
30
30
  const processSca = async config => {
31
+ const startTime = performance.now()
31
32
  let filesFound
32
- if (config.file) {
33
- config.file = config.file.concat('/')
34
- filesFound = await manualDetectAuditFilesAndLanguages(config.file)
35
- } else {
36
- filesFound = await autoDetection.autoDetectAuditFilesAndLanguages(config)
37
- config.file = process.cwd().concat('/')
33
+
34
+ if (config.help) {
35
+ console.log(auditUsageGuide)
36
+ process.exit(0)
37
+ }
38
+
39
+ const projectStats = await rootFile.getProjectStats(config.file)
40
+ let pathWithFile = projectStats.isFile()
41
+
42
+ config.fileName = config.file
43
+ config.file = pathWithFile
44
+ ? rootFile.getDirectoryFromPathGiven(config.file).concat('/')
45
+ : config.file
46
+
47
+ filesFound = await autoDetection.autoDetectAuditFilesAndLanguages(config.file)
48
+
49
+ if (filesFound.length > 1 && pathWithFile) {
50
+ filesFound = filesFound.filter(i =>
51
+ Object.values(i)[0].includes(path.basename(config.fileName))
52
+ )
38
53
  }
39
54
 
40
55
  // files found looks like [ { javascript: [ Array ] } ]
@@ -70,15 +85,21 @@ const processSca = async config => {
70
85
  messageToSend = goAnalysis.goAnalysis(config, filesFound[0])
71
86
  config.language = GO
72
87
  break
88
+ case DOTNET:
89
+ messageToSend = dotNetAnalysis(config, filesFound[0])
90
+ config.language = DOTNET
91
+ break
73
92
  default:
74
93
  //something is wrong
75
- console.log('language detected not supported')
94
+ console.log('No supported language detected in project path')
76
95
  return
77
96
  }
78
97
 
79
98
  if (!config.applicationId) {
80
99
  config.applicationId = await auditController.dealWithNoAppId(config)
81
100
  }
101
+
102
+ console.log('') //empty log for space before spinner
82
103
  //send message to TS
83
104
  const reportSpinner = returnOra(i18n.__('auditSCAAnalysisBegins'))
84
105
  startSpinner(reportSpinner)
@@ -93,17 +114,28 @@ const processSca = async config => {
93
114
  snapshotResponse.id,
94
115
  reportSpinner
95
116
  )
96
- succeedSpinner(reportSpinner, 'Contrast SCA audit complete')
117
+ succeedSpinner(reportSpinner, i18n.__('auditSCAAnalysisComplete'))
97
118
 
98
119
  await vulnerabilityReportV2(config, snapshotResponse.id)
120
+ if (config.save !== undefined) {
121
+ await auditSave.auditSave(config)
122
+ }
123
+ const endTime = performance.now() - startTime
124
+ const scanDurationMs = endTime - startTime
99
125
 
100
- await auditSave.auditSave(config)
126
+ console.log(
127
+ `----- completed in ${(scanDurationMs / 1000).toFixed(2)}s -----`
128
+ )
101
129
  } else {
102
130
  if (filesFound.length === 0) {
103
- console.log('no compatible dependency files detected. Continuing...')
131
+ console.log(i18n.__('languageAnalysisNoLanguage'))
132
+ console.log(i18n.__('languageAnalysisNoLanguageHelpLine'))
133
+ throw new Error()
104
134
  } else {
105
- console.log(
106
- 'multiple language files detected, please use --file to specify a directory or the file where dependencies are declared'
135
+ throw new Error(
136
+ `multiple language files detected \n` +
137
+ JSON.stringify(filesFound) +
138
+ `\nplease use --file to audit one language only. Example: contrast audit --file package-lock.json`
107
139
  )
108
140
  }
109
141
  }
@@ -333,9 +333,9 @@ HTTPClient.prototype.checkLibrary = function checkLibrary(data) {
333
333
  return requestUtils.sendRequest({ method: 'post', options })
334
334
  }
335
335
 
336
- HTTPClient.prototype.getSbom = function getSbom(config) {
336
+ HTTPClient.prototype.getSbom = function getSbom(config, type) {
337
337
  const options = _.cloneDeep(this.requestOptions)
338
- options.url = createSbomCycloneDXUrl(config)
338
+ options.url = createSbomUrl(config, type)
339
339
  return requestUtils.sendRequest({ method: 'get', options })
340
340
  }
341
341
 
@@ -346,6 +346,16 @@ HTTPClient.prototype.getLatestVersion = function getLatestVersion() {
346
346
  return requestUtils.sendRequest({ method: 'get', options })
347
347
  }
348
348
 
349
+ HTTPClient.prototype.postTelemetry = function postTelemetry(
350
+ config,
351
+ requestBody
352
+ ) {
353
+ const options = _.cloneDeep(this.requestOptions)
354
+ options.url = createTelemetryEventUrl(config)
355
+ options.body = requestBody
356
+ return requestUtils.sendRequest({ method: 'post', options })
357
+ }
358
+
349
359
  // analytics
350
360
 
351
361
  HTTPClient.prototype.postAnalyticsFunction = function (config, provider, body) {
@@ -417,13 +427,13 @@ function createLibraryVulnerabilitiesUrl(config) {
417
427
  return `${config.host}/Contrast/api/ng/${config.organizationId}/libraries/artifactsByGroupNameVersion`
418
428
  }
419
429
 
420
- function createSpecificReportUrl(config, reportId) {
421
- return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/reports/${reportId}`
430
+ function createSpecificReportUrl(config, reportId, includeTree = false) {
431
+ return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/reports/${reportId}?&includeTree=${includeTree}`
422
432
  }
423
433
 
424
- function createSpecificReportWithProdUrl(config, reportId) {
425
- return createSpecificReportUrl(config, reportId).concat(
426
- `?nodesToInclude=PROD`
434
+ function createSpecificReportWithProdUrl(config, reportId, includeTree) {
435
+ return createSpecificReportUrl(config, reportId, includeTree).concat(
436
+ `&nodesToInclude=PROD`
427
437
  )
428
438
  }
429
439
 
@@ -435,8 +445,12 @@ function createDataUrl() {
435
445
  return `https://ardy.contrastsecurity.com/production`
436
446
  }
437
447
 
438
- function createSbomCycloneDXUrl(config) {
439
- return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom/cyclonedx`
448
+ function createSbomUrl(config, type) {
449
+ return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom/${type}`
450
+ }
451
+
452
+ function createTelemetryEventUrl(config) {
453
+ return `${config.host}/Contrast/api/sast/organizations/${config.organizationId}/cli`
440
454
  }
441
455
 
442
456
  module.exports = HTTPClient
@@ -39,9 +39,8 @@ const reportFailureError = () => {
39
39
  }
40
40
 
41
41
  const genericError = (missingCliOption: string) => {
42
- // prettier-ignore
43
- console.log(`*************************** ${i18n.__('yamlMissingParametersHeader')} ***************************\n${missingCliOption}`)
44
- console.error(i18n.__('yamlMissingParametersMessage'))
42
+ console.log(missingCliOption)
43
+ console.error(i18n.__('genericErrorMessage'))
45
44
  process.exit(1)
46
45
  }
47
46
 
@@ -0,0 +1,75 @@
1
+ const i18n = require('i18n')
2
+
3
+ const processFail = (config, reportResults) => {
4
+ if (config.severity !== undefined) {
5
+ if (
6
+ reportResults[config.severity] !== undefined &&
7
+ isSeverityViolation(config.severity, reportResults)
8
+ ) {
9
+ failPipeline('failSeverityOptionErrorMessage')
10
+ }
11
+ }
12
+
13
+ if (config.severity === undefined && reportResults.total > 0) {
14
+ failPipeline('failThresholdOptionErrorMessage')
15
+ }
16
+ }
17
+
18
+ const isSeverityViolation = (severity, reportResults) => {
19
+ let count = 0
20
+ switch (severity) {
21
+ case 'critical':
22
+ count += reportResults.critical
23
+ break
24
+ case 'high':
25
+ count += reportResults.high + reportResults.critical
26
+ break
27
+ case 'medium':
28
+ count += reportResults.medium + reportResults.low + reportResults.critical
29
+ break
30
+ case 'low':
31
+ count +=
32
+ reportResults.high + reportResults.critical + reportResults.medium
33
+ break
34
+ case 'note':
35
+ if (reportResults.note == reportResults.total) {
36
+ count = 0
37
+ } else {
38
+ count = reportResults.total
39
+ }
40
+ break
41
+ default:
42
+ count = 0
43
+ }
44
+ return count > 0
45
+ }
46
+
47
+ const failPipeline = (message = '') => {
48
+ console.log(
49
+ '\n ******************************** ' +
50
+ i18n.__('snapshotFailureHeader') +
51
+ ' *********************************\n' +
52
+ i18n.__(message)
53
+ )
54
+ process.exit(1)
55
+ }
56
+
57
+ const parseSeverity = severity => {
58
+ const severities = ['NOTE', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL']
59
+ if (severities.includes(severity.toUpperCase())) {
60
+ return severity.toLowerCase()
61
+ } else {
62
+ console.log(
63
+ severity +
64
+ ' Not recognised as a severity type please use LOW, MEDIUM, HIGH, CRITICAL, NOTE'
65
+ )
66
+ return undefined
67
+ }
68
+ }
69
+
70
+ module.exports = {
71
+ failPipeline,
72
+ processFail,
73
+ isSeverityViolation,
74
+ parseSeverity
75
+ }
@@ -20,7 +20,7 @@ const getLatestVersion = async (config: any) => {
20
20
 
21
21
  // @ts-ignore
22
22
  export async function findLatestCLIVersion(config: ContrastConf) {
23
- const messageHidden = config.get('updateMessageHidden') as boolean
23
+ const messageHidden = config.get('isCI') as boolean
24
24
 
25
25
  if (!messageHidden) {
26
26
  let latestCLIVersion: string = await getLatestVersion(config)
@@ -5,15 +5,16 @@ const JAVA = 'JAVA'
5
5
  const RUBY = 'RUBY'
6
6
  const PYTHON = 'PYTHON'
7
7
  const GO = 'GO'
8
- // we set the langauge as Node instead of PHP since we're using the Node engine in TS
9
8
  const PHP = 'PHP'
10
9
  const JAVASCRIPT = 'JAVASCRIPT'
10
+ // Severity
11
11
  const LOW = 'LOW'
12
12
  const MEDIUM = 'MEDIUM'
13
13
  const HIGH = 'HIGH'
14
14
  const CRITICAL = 'CRITICAL'
15
+ // App
15
16
  const APP_NAME = 'contrast'
16
- const APP_VERSION = '1.0.8'
17
+ const APP_VERSION = '1.0.11'
17
18
  const TIMEOUT = 120000
18
19
  const HIGH_COLOUR = '#ff9900'
19
20
  const CRITICAL_COLOUR = '#e35858'
@@ -29,10 +30,13 @@ const NOTE_PRIORITY = 5
29
30
  const AUTH_UI_URL = 'https://cli-auth.contrastsecurity.com'
30
31
  const AUTH_CALLBACK_URL = 'https://cli-auth-api.contrastsecurity.com'
31
32
  const SARIF_FILE = 'SARIF'
33
+ const SBOM_CYCLONE_DX_FILE = 'cyclonedx'
34
+ const SBOM_SPDX_FILE = 'spdx'
32
35
  const CE_URL = 'https://ce.contrastsecurity.com/'
33
36
 
34
37
  module.exports = {
35
38
  supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT },
39
+ supportedLanguagesScan: { JAVASCRIPT, DOTNET, JAVA },
36
40
  LOW,
37
41
  MEDIUM,
38
42
  HIGH,
@@ -53,5 +57,7 @@ module.exports = {
53
57
  HIGH_PRIORITY,
54
58
  MEDIUM_PRIORITY,
55
59
  LOW_PRIORITY,
56
- NOTE_PRIORITY
60
+ NOTE_PRIORITY,
61
+ SBOM_CYCLONE_DX_FILE,
62
+ SBOM_SPDX_FILE
57
63
  }