@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.
- package/README.md +2 -2
- package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +16 -25
- package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +103 -57
- package/dist/audit/languageAnalysisEngine/report/models/reportGuidanceModel.js +6 -0
- package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +3 -3
- package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +1 -0
- package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +68 -17
- package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +39 -7
- package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
- package/dist/audit/save.js +21 -13
- package/dist/commands/audit/auditConfig.js +3 -19
- package/dist/commands/audit/auditController.js +1 -10
- package/dist/commands/audit/help.js +7 -24
- package/dist/commands/audit/processAudit.js +5 -9
- package/dist/commands/audit/saveFile.js +2 -2
- package/dist/commands/auth/auth.js +1 -1
- package/dist/commands/config/config.js +2 -2
- package/dist/commands/scan/processScan.js +11 -4
- package/dist/commands/scan/sca/scaAnalysis.js +37 -13
- package/dist/common/HTTPClient.js +17 -8
- package/dist/common/errorHandling.js +2 -2
- package/dist/common/fail.js +66 -0
- package/dist/common/versionChecker.js +1 -1
- package/dist/constants/constants.js +7 -2
- package/dist/constants/locales.js +40 -38
- package/dist/constants.js +62 -12
- package/dist/index.js +57 -45
- package/dist/lambda/lambda.js +5 -2
- package/dist/sbom/generateSbom.js +2 -2
- package/dist/scaAnalysis/common/formatMessage.js +7 -1
- package/dist/scaAnalysis/common/scaParserForGoAndJava.js +32 -0
- package/dist/scaAnalysis/common/treeUpload.js +24 -10
- package/dist/scaAnalysis/dotnet/analysis.js +55 -0
- package/dist/scaAnalysis/dotnet/index.js +10 -0
- package/dist/scaAnalysis/go/goAnalysis.js +8 -2
- package/dist/scaAnalysis/java/analysis.js +10 -6
- package/dist/scaAnalysis/java/index.js +7 -1
- package/dist/scaAnalysis/java/javaBuildDepsParser.js +19 -3
- package/dist/scaAnalysis/javascript/analysis.js +4 -7
- package/dist/scaAnalysis/javascript/index.js +16 -4
- package/dist/scaAnalysis/php/analysis.js +14 -33
- package/dist/scaAnalysis/php/index.js +11 -4
- package/dist/scaAnalysis/python/analysis.js +43 -5
- package/dist/scaAnalysis/python/index.js +7 -2
- package/dist/scaAnalysis/ruby/analysis.js +16 -14
- package/dist/scan/autoDetection.js +13 -24
- package/dist/scan/fileUtils.js +31 -12
- package/dist/scan/formatScanOutput.js +9 -8
- package/dist/scan/populateProjectIdAndProjectName.js +5 -0
- package/dist/scan/scan.js +4 -0
- package/dist/scan/scanConfig.js +5 -5
- package/dist/scan/scanResults.js +39 -3
- package/dist/telemetry/telemetry.js +137 -0
- package/dist/utils/commonApi.js +1 -1
- package/dist/utils/getConfig.js +3 -8
- package/dist/utils/parsedCLIOptions.js +3 -1
- package/dist/utils/requestUtils.js +7 -1
- package/package.json +2 -3
- package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +21 -57
- package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +155 -77
- package/src/audit/languageAnalysisEngine/report/models/reportGuidanceModel.ts +5 -0
- package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +5 -5
- package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +2 -0
- package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +56 -27
- package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +45 -6
- package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
- package/src/audit/save.js +32 -16
- package/src/commands/audit/auditConfig.ts +10 -28
- package/src/commands/audit/auditController.ts +0 -11
- package/src/commands/audit/help.ts +7 -24
- package/src/commands/audit/processAudit.ts +16 -8
- package/src/commands/audit/saveFile.ts +2 -2
- package/src/commands/auth/auth.js +3 -1
- package/src/commands/config/config.js +4 -2
- package/src/commands/scan/processScan.js +18 -5
- package/src/commands/scan/sca/scaAnalysis.js +50 -18
- package/src/common/HTTPClient.js +23 -9
- package/src/common/errorHandling.ts +2 -3
- package/src/common/fail.js +75 -0
- package/src/common/versionChecker.ts +1 -1
- package/src/constants/constants.js +9 -3
- package/src/constants/locales.js +70 -45
- package/src/constants.js +67 -13
- package/src/index.ts +91 -66
- package/src/lambda/lambda.ts +5 -2
- package/src/lambda/types.ts +1 -0
- package/src/sbom/generateSbom.ts +2 -2
- package/src/scaAnalysis/common/formatMessage.js +8 -1
- package/src/scaAnalysis/common/scaParserForGoAndJava.js +41 -0
- package/src/scaAnalysis/common/treeUpload.js +25 -11
- package/src/scaAnalysis/dotnet/analysis.js +72 -0
- package/src/scaAnalysis/dotnet/index.js +11 -0
- package/src/scaAnalysis/go/goAnalysis.js +9 -2
- package/src/scaAnalysis/java/analysis.js +11 -6
- package/src/scaAnalysis/java/index.js +9 -1
- package/src/scaAnalysis/java/javaBuildDepsParser.js +25 -6
- package/src/scaAnalysis/javascript/analysis.js +6 -7
- package/src/scaAnalysis/javascript/index.js +25 -6
- package/src/scaAnalysis/php/analysis.js +15 -35
- package/src/scaAnalysis/php/index.js +15 -4
- package/src/scaAnalysis/python/analysis.js +49 -5
- package/src/scaAnalysis/python/index.js +7 -2
- package/src/scaAnalysis/ruby/analysis.js +18 -15
- package/src/scan/autoDetection.js +14 -27
- package/src/scan/fileUtils.js +33 -12
- package/src/scan/formatScanOutput.ts +10 -8
- package/src/scan/populateProjectIdAndProjectName.js +5 -1
- package/src/scan/scan.ts +4 -0
- package/src/scan/scanConfig.js +7 -7
- package/src/scan/scanResults.js +46 -3
- package/src/telemetry/telemetry.ts +154 -0
- package/src/utils/commonApi.js +1 -1
- package/src/utils/getConfig.ts +5 -18
- package/src/utils/parsedCLIOptions.js +14 -1
- package/src/utils/requestUtils.js +8 -1
- package/dist/audit/AnalysisEngine.js +0 -37
- package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
- package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
- package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
- package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
- package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
- package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
- package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
- package/dist/audit/goAnalysisEngine/index.js +0 -17
- package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
- package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
- package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
- package/dist/audit/javaAnalysisEngine/index.js +0 -34
- package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -155
- package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
- package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
- package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
- package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -25
- package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
- package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
- package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
- package/dist/audit/languageAnalysisEngine/constants.js +0 -20
- package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
- package/dist/audit/languageAnalysisEngine/index.js +0 -39
- package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -66
- package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -166
- package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
- package/dist/audit/nodeAnalysisEngine/index.js +0 -31
- package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
- package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
- package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
- package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
- package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
- package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
- package/dist/audit/phpAnalysisEngine/index.js +0 -23
- package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
- package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
- package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
- package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
- package/dist/audit/pythonAnalysisEngine/index.js +0 -25
- package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
- package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
- package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
- package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
- package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
- package/dist/audit/rubyAnalysisEngine/index.js +0 -25
- package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
- package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
- package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
- package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
- package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
- package/src/audit/AnalysisEngine.js +0 -103
- package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
- package/src/audit/dotnetAnalysisEngine/index.js +0 -26
- package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
- package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
- package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
- package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
- package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
- package/src/audit/goAnalysisEngine/index.js +0 -18
- package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
- package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
- package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
- package/src/audit/javaAnalysisEngine/index.js +0 -41
- package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -225
- package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
- package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
- package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
- package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -36
- package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
- package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
- package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
- package/src/audit/languageAnalysisEngine/constants.js +0 -23
- package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
- package/src/audit/languageAnalysisEngine/index.js +0 -45
- package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -96
- package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -251
- package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
- package/src/audit/nodeAnalysisEngine/index.js +0 -35
- package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
- package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
- package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
- package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
- package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
- package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
- package/src/audit/phpAnalysisEngine/index.js +0 -27
- package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
- package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
- package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
- package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
- package/src/audit/pythonAnalysisEngine/index.js +0 -55
- package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
- package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
- package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
- package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
- package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
- package/src/audit/rubyAnalysisEngine/index.js +0 -30
- package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
- package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
- package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
- package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
- 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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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(
|
|
35
|
+
console.log(
|
|
36
|
+
chalk.yellow.bold(
|
|
37
|
+
`\n Unable to save ${filename} Software Bill of Materials (SBOM)`
|
|
38
|
+
)
|
|
39
|
+
)
|
|
24
40
|
}
|
|
25
|
-
} else
|
|
26
|
-
console.log(i18n.__('
|
|
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
|
|
4
|
-
import
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const auditParameters =
|
|
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
|
-
'
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
'',
|
|
21
|
-
|
|
22
|
-
|
|
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 (
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
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
|
|
9
|
-
let config = scanConfig.getScanConfig(
|
|
10
|
-
|
|
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('../../../
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
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, '
|
|
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
|
-
|
|
126
|
+
console.log(
|
|
127
|
+
`----- completed in ${(scanDurationMs / 1000).toFixed(2)}s -----`
|
|
128
|
+
)
|
|
101
129
|
} else {
|
|
102
130
|
if (filesFound.length === 0) {
|
|
103
|
-
console.log(
|
|
131
|
+
console.log(i18n.__('languageAnalysisNoLanguage'))
|
|
132
|
+
console.log(i18n.__('languageAnalysisNoLanguageHelpLine'))
|
|
133
|
+
throw new Error()
|
|
104
134
|
} else {
|
|
105
|
-
|
|
106
|
-
|
|
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
|
}
|
package/src/common/HTTPClient.js
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
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
|
|
439
|
-
return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom
|
|
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
|
-
|
|
43
|
-
console.
|
|
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('
|
|
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.
|
|
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
|
}
|