@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
|
@@ -6,26 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.getAuditConfig = void 0;
|
|
7
7
|
const paramHandler_1 = __importDefault(require("../../utils/paramsUtil/paramHandler"));
|
|
8
8
|
const constants_1 = __importDefault(require("../../constants"));
|
|
9
|
-
const parsedCLIOptions_1 =
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const { supportedLanguages: { NODE, JAVASCRIPT } } = constants_2.default;
|
|
13
|
-
const getAuditConfig = (argv) => {
|
|
14
|
-
const auditParameters = parsedCLIOptions_1.default.getCommandLineArgsCustom(argv, constants_1.default.commandLineDefinitions.auditOptionDefinitions);
|
|
9
|
+
const parsedCLIOptions_1 = require("../../utils/parsedCLIOptions");
|
|
10
|
+
const getAuditConfig = async (contrastConf, command, argv) => {
|
|
11
|
+
const auditParameters = await (0, parsedCLIOptions_1.getCommandLineArgsCustom)(contrastConf, command, argv, constants_1.default.commandLineDefinitions.auditOptionDefinitions);
|
|
15
12
|
const paramsAuth = paramHandler_1.default.getAuth(auditParameters);
|
|
16
|
-
if (auditParameters.language === undefined ||
|
|
17
|
-
auditParameters.language === null) {
|
|
18
|
-
try {
|
|
19
|
-
auditParameters.language = (0, autoDetectLanguage_1.determineProjectLanguage)((0, autoDetectLanguage_1.identifyLanguages)(auditParameters));
|
|
20
|
-
}
|
|
21
|
-
catch (err) {
|
|
22
|
-
console.log(err.message);
|
|
23
|
-
process.exit(1);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
else if (auditParameters.language.toUpperCase() === JAVASCRIPT) {
|
|
27
|
-
auditParameters.language = NODE.toLowerCase();
|
|
28
|
-
}
|
|
29
13
|
return { ...paramsAuth, ...auditParameters };
|
|
30
14
|
};
|
|
31
15
|
exports.getAuditConfig = getAuditConfig;
|
|
@@ -3,11 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getAppName = exports.
|
|
6
|
+
exports.getAppName = exports.dealWithNoAppId = void 0;
|
|
7
7
|
const catalogueApplication_1 = require("../../audit/catalogueApplication/catalogueApplication");
|
|
8
8
|
const commonApi_1 = __importDefault(require("../../audit/languageAnalysisEngine/commonApi"));
|
|
9
|
-
const identifyLanguageAE = require('./../../audit/languageAnalysisEngine');
|
|
10
|
-
const languageFactory = require('../../audit/languageAnalysisEngine/languageAnalysisFactory');
|
|
11
9
|
const dealWithNoAppId = async (config) => {
|
|
12
10
|
let appID;
|
|
13
11
|
try {
|
|
@@ -33,13 +31,6 @@ const dealWithNoAppId = async (config) => {
|
|
|
33
31
|
return appID;
|
|
34
32
|
};
|
|
35
33
|
exports.dealWithNoAppId = dealWithNoAppId;
|
|
36
|
-
const startAudit = async (config) => {
|
|
37
|
-
if (!config.applicationId) {
|
|
38
|
-
config.applicationId = await (0, exports.dealWithNoAppId)(config);
|
|
39
|
-
}
|
|
40
|
-
identifyLanguageAE(config.file, languageFactory, config.applicationId, config);
|
|
41
|
-
};
|
|
42
|
-
exports.startAudit = startAudit;
|
|
43
34
|
const getAppName = (file) => {
|
|
44
35
|
const last = file.charAt(file.length - 1);
|
|
45
36
|
if (last !== '/') {
|
|
@@ -18,30 +18,13 @@ const auditUsageGuide = (0, command_line_usage_1.default)([
|
|
|
18
18
|
'{bold ' +
|
|
19
19
|
i18n_1.default.__('constantsAuditPrerequisitesContentSupportedLanguages') +
|
|
20
20
|
'}',
|
|
21
|
-
'
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
'',
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
'',
|
|
29
|
-
'{bold ' +
|
|
30
|
-
i18n_1.default.__('constantsAuditPrerequisitesContentDotNet') +
|
|
31
|
-
'}' +
|
|
32
|
-
i18n_1.default.__('constantsAuditPrerequisitesContentDotNetMessage'),
|
|
33
|
-
'{bold ' +
|
|
34
|
-
i18n_1.default.__('constantsAuditPrerequisitesContentLanguageNode') +
|
|
35
|
-
'}' +
|
|
36
|
-
i18n_1.default.__('constantsAuditPrerequisitesContentLanguageNodeMessage'),
|
|
37
|
-
'{bold ' +
|
|
38
|
-
i18n_1.default.__('constantsAuditPrerequisitesContentLanguageRuby') +
|
|
39
|
-
'}' +
|
|
40
|
-
i18n_1.default.__('constantsAuditPrerequisitesContentLanguageRubyMessage'),
|
|
41
|
-
'{bold ' +
|
|
42
|
-
i18n_1.default.__('constantsAuditPrerequisitesContentLanguagePython') +
|
|
43
|
-
'}' +
|
|
44
|
-
i18n_1.default.__('constantsAuditPrerequisitesContentLanguagePythonMessage')
|
|
21
|
+
i18n_1.default.__('constantsAuditPrerequisitesJavaContentMessage'),
|
|
22
|
+
i18n_1.default.__('constantsAuditPrerequisitesContentDotNetMessage'),
|
|
23
|
+
i18n_1.default.__('constantsAuditPrerequisitesContentNodeMessage'),
|
|
24
|
+
i18n_1.default.__('constantsAuditPrerequisitesContentRubyMessage'),
|
|
25
|
+
i18n_1.default.__('constantsAuditPrerequisitesContentPythonMessage'),
|
|
26
|
+
i18n_1.default.__('constantsAuditPrerequisitesContentGoMessage'),
|
|
27
|
+
i18n_1.default.__('constantsAuditPrerequisitesContentPHPMessage')
|
|
45
28
|
]
|
|
46
29
|
},
|
|
47
30
|
{
|
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.processAudit = void 0;
|
|
4
|
-
const auditController_1 = require("./auditController");
|
|
5
4
|
const auditConfig_1 = require("./auditConfig");
|
|
6
5
|
const help_1 = require("./help");
|
|
7
6
|
const scaAnalysis_1 = require("../scan/sca/scaAnalysis");
|
|
8
|
-
const
|
|
7
|
+
const telemetry_1 = require("../../telemetry/telemetry");
|
|
8
|
+
const processAudit = async (contrastConf, argv) => {
|
|
9
9
|
if (argv.indexOf('--help') != -1) {
|
|
10
10
|
printHelpMessage();
|
|
11
11
|
process.exit(0);
|
|
12
12
|
}
|
|
13
|
-
const config = (0, auditConfig_1.getAuditConfig)(argv);
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
await (0, auditController_1.startAudit)(config);
|
|
19
|
-
}
|
|
13
|
+
const config = await (0, auditConfig_1.getAuditConfig)(contrastConf, 'audit', argv);
|
|
14
|
+
await (0, scaAnalysis_1.processSca)(config);
|
|
15
|
+
await (0, telemetry_1.sendTelemetryConfigAsObject)(config, 'audit', argv, 'SUCCESS', config.language);
|
|
20
16
|
};
|
|
21
17
|
exports.processAudit = processAudit;
|
|
22
18
|
const printHelpMessage = () => {
|
|
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.saveFile = void 0;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const saveFile = (config, rawResults) => {
|
|
9
|
-
const fileName = `${config.applicationId}-sbom
|
|
8
|
+
const saveFile = (config, type, rawResults) => {
|
|
9
|
+
const fileName = `${config.applicationId}-sbom-${type}.json`;
|
|
10
10
|
fs_1.default.writeFileSync(fileName, JSON.stringify(rawResults));
|
|
11
11
|
};
|
|
12
12
|
exports.saveFile = saveFile;
|
|
@@ -11,7 +11,7 @@ const parsedCLIOptions = require('../../utils/parsedCLIOptions');
|
|
|
11
11
|
const constants = require('../../constants');
|
|
12
12
|
const commandLineUsage = require('command-line-usage');
|
|
13
13
|
const processAuth = async (argv, config) => {
|
|
14
|
-
let authParams = parsedCLIOptions.getCommandLineArgsCustom(argv, constants.commandLineDefinitions.authOptionDefinitions);
|
|
14
|
+
let authParams = await parsedCLIOptions.getCommandLineArgsCustom(config, 'auth', argv, constants.commandLineDefinitions.authOptionDefinitions);
|
|
15
15
|
if (authParams.help) {
|
|
16
16
|
console.log(authUsageGuide);
|
|
17
17
|
process.exit(0);
|
|
@@ -3,9 +3,9 @@ const parsedCLIOptions = require('../../utils/parsedCLIOptions');
|
|
|
3
3
|
const constants = require('../../constants');
|
|
4
4
|
const commandLineUsage = require('command-line-usage');
|
|
5
5
|
const i18n = require('i18n');
|
|
6
|
-
const processConfig = (argv, config) => {
|
|
6
|
+
const processConfig = async (argv, config) => {
|
|
7
7
|
try {
|
|
8
|
-
let configParams = parsedCLIOptions.getCommandLineArgsCustom(argv, constants.commandLineDefinitions.configOptionDefinitions);
|
|
8
|
+
let configParams = await parsedCLIOptions.getCommandLineArgsCustom(config, 'config', argv, constants.commandLineDefinitions.configOptionDefinitions);
|
|
9
9
|
if (configParams.help) {
|
|
10
10
|
console.log(configUsageGuide);
|
|
11
11
|
process.exit(0);
|
|
@@ -5,18 +5,25 @@ const { saveScanFile } = require('../../utils/saveFile');
|
|
|
5
5
|
const { ScanResultsModel } = require('../../scan/models/scanResultsModel');
|
|
6
6
|
const { formatScanOutput } = require('../../scan/formatScanOutput');
|
|
7
7
|
const { processSca } = require('./sca/scaAnalysis');
|
|
8
|
-
const
|
|
9
|
-
|
|
8
|
+
const common = require('../../common/fail');
|
|
9
|
+
const { sendTelemetryConfigAsObject } = require('../../telemetry/telemetry');
|
|
10
|
+
const processScan = async (contrastConf, argv) => {
|
|
11
|
+
let config = await scanConfig.getScanConfig(contrastConf, 'scan', argv);
|
|
12
|
+
let output = undefined;
|
|
10
13
|
if (config.experimental) {
|
|
11
|
-
await processSca(config);
|
|
14
|
+
await processSca(config, argv);
|
|
12
15
|
}
|
|
13
16
|
let scanResults = new ScanResultsModel(await startScan(config));
|
|
17
|
+
await sendTelemetryConfigAsObject(config, 'scan', argv, 'SUCCESS', scanResults.scanDetail.language);
|
|
14
18
|
if (scanResults.scanResultsInstances !== undefined) {
|
|
15
|
-
formatScanOutput(scanResults);
|
|
19
|
+
output = formatScanOutput(scanResults);
|
|
16
20
|
}
|
|
17
21
|
if (config.save !== undefined) {
|
|
18
22
|
await saveScanFile(config, scanResults);
|
|
19
23
|
}
|
|
24
|
+
if (config.fail) {
|
|
25
|
+
common.processFail(config, output);
|
|
26
|
+
}
|
|
20
27
|
};
|
|
21
28
|
module.exports = {
|
|
22
29
|
processScan
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
const autoDetection = require('../../../scan/autoDetection');
|
|
3
3
|
const javaAnalysis = require('../../../scaAnalysis/java');
|
|
4
4
|
const treeUpload = require('../../../scaAnalysis/common/treeUpload');
|
|
5
|
-
const { manualDetectAuditFilesAndLanguages } = require('../../../scan/autoDetection');
|
|
6
5
|
const auditController = require('../../audit/auditController');
|
|
7
|
-
const { supportedLanguages: { JAVA, GO, PYTHON, RUBY, JAVASCRIPT, NODE, PHP } } = require('../../../
|
|
6
|
+
const { supportedLanguages: { JAVA, GO, PYTHON, RUBY, JAVASCRIPT, NODE, PHP, DOTNET } } = require('../../../constants/constants');
|
|
8
7
|
const goAnalysis = require('../../../scaAnalysis/go/goAnalysis');
|
|
9
8
|
const phpAnalysis = require('../../../scaAnalysis/php/index');
|
|
10
9
|
const { rubyAnalysis } = require('../../../scaAnalysis/ruby');
|
|
@@ -15,15 +14,26 @@ const { returnOra, startSpinner, succeedSpinner } = require('../../../utils/oraW
|
|
|
15
14
|
const i18n = require('i18n');
|
|
16
15
|
const { vulnerabilityReportV2 } = require('../../../audit/languageAnalysisEngine/report/reportingFeature');
|
|
17
16
|
const auditSave = require('../../../audit/save');
|
|
17
|
+
const { dotNetAnalysis } = require('../../../scaAnalysis/dotnet');
|
|
18
|
+
const { auditUsageGuide } = require('../../audit/help');
|
|
19
|
+
const rootFile = require('../../../audit/languageAnalysisEngine/getProjectRootFilenames');
|
|
20
|
+
const path = require('path');
|
|
18
21
|
const processSca = async (config) => {
|
|
22
|
+
const startTime = performance.now();
|
|
19
23
|
let filesFound;
|
|
20
|
-
if (config.
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
if (config.help) {
|
|
25
|
+
console.log(auditUsageGuide);
|
|
26
|
+
process.exit(0);
|
|
23
27
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
const projectStats = await rootFile.getProjectStats(config.file);
|
|
29
|
+
let pathWithFile = projectStats.isFile();
|
|
30
|
+
config.fileName = config.file;
|
|
31
|
+
config.file = pathWithFile
|
|
32
|
+
? rootFile.getDirectoryFromPathGiven(config.file).concat('/')
|
|
33
|
+
: config.file;
|
|
34
|
+
filesFound = await autoDetection.autoDetectAuditFilesAndLanguages(config.file);
|
|
35
|
+
if (filesFound.length > 1 && pathWithFile) {
|
|
36
|
+
filesFound = filesFound.filter(i => Object.values(i)[0].includes(path.basename(config.fileName)));
|
|
27
37
|
}
|
|
28
38
|
let messageToSend = undefined;
|
|
29
39
|
if (filesFound.length === 1) {
|
|
@@ -52,27 +62,41 @@ const processSca = async (config) => {
|
|
|
52
62
|
messageToSend = goAnalysis.goAnalysis(config, filesFound[0]);
|
|
53
63
|
config.language = GO;
|
|
54
64
|
break;
|
|
65
|
+
case DOTNET:
|
|
66
|
+
messageToSend = dotNetAnalysis(config, filesFound[0]);
|
|
67
|
+
config.language = DOTNET;
|
|
68
|
+
break;
|
|
55
69
|
default:
|
|
56
|
-
console.log('language detected
|
|
70
|
+
console.log('No supported language detected in project path');
|
|
57
71
|
return;
|
|
58
72
|
}
|
|
59
73
|
if (!config.applicationId) {
|
|
60
74
|
config.applicationId = await auditController.dealWithNoAppId(config);
|
|
61
75
|
}
|
|
76
|
+
console.log('');
|
|
62
77
|
const reportSpinner = returnOra(i18n.__('auditSCAAnalysisBegins'));
|
|
63
78
|
startSpinner(reportSpinner);
|
|
64
79
|
const snapshotResponse = await treeUpload.commonSendSnapShot(messageToSend, config);
|
|
65
80
|
await pollForSnapshotCompletition(config, snapshotResponse.id, reportSpinner);
|
|
66
|
-
succeedSpinner(reportSpinner, '
|
|
81
|
+
succeedSpinner(reportSpinner, i18n.__('auditSCAAnalysisComplete'));
|
|
67
82
|
await vulnerabilityReportV2(config, snapshotResponse.id);
|
|
68
|
-
|
|
83
|
+
if (config.save !== undefined) {
|
|
84
|
+
await auditSave.auditSave(config);
|
|
85
|
+
}
|
|
86
|
+
const endTime = performance.now() - startTime;
|
|
87
|
+
const scanDurationMs = endTime - startTime;
|
|
88
|
+
console.log(`----- completed in ${(scanDurationMs / 1000).toFixed(2)}s -----`);
|
|
69
89
|
}
|
|
70
90
|
else {
|
|
71
91
|
if (filesFound.length === 0) {
|
|
72
|
-
console.log(
|
|
92
|
+
console.log(i18n.__('languageAnalysisNoLanguage'));
|
|
93
|
+
console.log(i18n.__('languageAnalysisNoLanguageHelpLine'));
|
|
94
|
+
throw new Error();
|
|
73
95
|
}
|
|
74
96
|
else {
|
|
75
|
-
|
|
97
|
+
throw new Error(`multiple language files detected \n` +
|
|
98
|
+
JSON.stringify(filesFound) +
|
|
99
|
+
`\nplease use --file to audit one language only. Example: contrast audit --file package-lock.json`);
|
|
76
100
|
}
|
|
77
101
|
}
|
|
78
102
|
};
|
|
@@ -242,9 +242,9 @@ HTTPClient.prototype.checkLibrary = function checkLibrary(data) {
|
|
|
242
242
|
options.body = data;
|
|
243
243
|
return requestUtils.sendRequest({ method: 'post', options });
|
|
244
244
|
};
|
|
245
|
-
HTTPClient.prototype.getSbom = function getSbom(config) {
|
|
245
|
+
HTTPClient.prototype.getSbom = function getSbom(config, type) {
|
|
246
246
|
const options = _.cloneDeep(this.requestOptions);
|
|
247
|
-
options.url =
|
|
247
|
+
options.url = createSbomUrl(config, type);
|
|
248
248
|
return requestUtils.sendRequest({ method: 'get', options });
|
|
249
249
|
};
|
|
250
250
|
HTTPClient.prototype.getLatestVersion = function getLatestVersion() {
|
|
@@ -253,6 +253,12 @@ HTTPClient.prototype.getLatestVersion = function getLatestVersion() {
|
|
|
253
253
|
'https://pkg.contrastsecurity.com/artifactory/cli/latest-version.txt';
|
|
254
254
|
return requestUtils.sendRequest({ method: 'get', options });
|
|
255
255
|
};
|
|
256
|
+
HTTPClient.prototype.postTelemetry = function postTelemetry(config, requestBody) {
|
|
257
|
+
const options = _.cloneDeep(this.requestOptions);
|
|
258
|
+
options.url = createTelemetryEventUrl(config);
|
|
259
|
+
options.body = requestBody;
|
|
260
|
+
return requestUtils.sendRequest({ method: 'post', options });
|
|
261
|
+
};
|
|
256
262
|
HTTPClient.prototype.postAnalyticsFunction = function (config, provider, body) {
|
|
257
263
|
const url = createAnalyticsFunctionPostUrl(config, provider);
|
|
258
264
|
const options = { ...this.requestOptions, body, url };
|
|
@@ -304,11 +310,11 @@ const createAppNameUrl = config => {
|
|
|
304
310
|
function createLibraryVulnerabilitiesUrl(config) {
|
|
305
311
|
return `${config.host}/Contrast/api/ng/${config.organizationId}/libraries/artifactsByGroupNameVersion`;
|
|
306
312
|
}
|
|
307
|
-
function createSpecificReportUrl(config, reportId) {
|
|
308
|
-
return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/reports/${reportId}`;
|
|
313
|
+
function createSpecificReportUrl(config, reportId, includeTree = false) {
|
|
314
|
+
return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/reports/${reportId}?&includeTree=${includeTree}`;
|
|
309
315
|
}
|
|
310
|
-
function createSpecificReportWithProdUrl(config, reportId) {
|
|
311
|
-
return createSpecificReportUrl(config, reportId).concat(
|
|
316
|
+
function createSpecificReportWithProdUrl(config, reportId, includeTree) {
|
|
317
|
+
return createSpecificReportUrl(config, reportId, includeTree).concat(`&nodesToInclude=PROD`);
|
|
312
318
|
}
|
|
313
319
|
function createSpecificReportStatusURL(config, reportId) {
|
|
314
320
|
return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/snapshots/${reportId}/status`;
|
|
@@ -316,8 +322,11 @@ function createSpecificReportStatusURL(config, reportId) {
|
|
|
316
322
|
function createDataUrl() {
|
|
317
323
|
return `https://ardy.contrastsecurity.com/production`;
|
|
318
324
|
}
|
|
319
|
-
function
|
|
320
|
-
return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom
|
|
325
|
+
function createSbomUrl(config, type) {
|
|
326
|
+
return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom/${type}`;
|
|
327
|
+
}
|
|
328
|
+
function createTelemetryEventUrl(config) {
|
|
329
|
+
return `${config.host}/Contrast/api/sast/organizations/${config.organizationId}/cli`;
|
|
321
330
|
}
|
|
322
331
|
module.exports = HTTPClient;
|
|
323
332
|
module.exports.pollForAuthUrl = pollForAuthUrl;
|
|
@@ -48,8 +48,8 @@ const reportFailureError = () => {
|
|
|
48
48
|
};
|
|
49
49
|
exports.reportFailureError = reportFailureError;
|
|
50
50
|
const genericError = (missingCliOption) => {
|
|
51
|
-
console.log(
|
|
52
|
-
console.error(i18n_1.default.__('
|
|
51
|
+
console.log(missingCliOption);
|
|
52
|
+
console.error(i18n_1.default.__('genericErrorMessage'));
|
|
53
53
|
process.exit(1);
|
|
54
54
|
};
|
|
55
55
|
exports.genericError = genericError;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const i18n = require('i18n');
|
|
3
|
+
const processFail = (config, reportResults) => {
|
|
4
|
+
if (config.severity !== undefined) {
|
|
5
|
+
if (reportResults[config.severity] !== undefined &&
|
|
6
|
+
isSeverityViolation(config.severity, reportResults)) {
|
|
7
|
+
failPipeline('failSeverityOptionErrorMessage');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
if (config.severity === undefined && reportResults.total > 0) {
|
|
11
|
+
failPipeline('failThresholdOptionErrorMessage');
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const isSeverityViolation = (severity, reportResults) => {
|
|
15
|
+
let count = 0;
|
|
16
|
+
switch (severity) {
|
|
17
|
+
case 'critical':
|
|
18
|
+
count += reportResults.critical;
|
|
19
|
+
break;
|
|
20
|
+
case 'high':
|
|
21
|
+
count += reportResults.high + reportResults.critical;
|
|
22
|
+
break;
|
|
23
|
+
case 'medium':
|
|
24
|
+
count += reportResults.medium + reportResults.low + reportResults.critical;
|
|
25
|
+
break;
|
|
26
|
+
case 'low':
|
|
27
|
+
count +=
|
|
28
|
+
reportResults.high + reportResults.critical + reportResults.medium;
|
|
29
|
+
break;
|
|
30
|
+
case 'note':
|
|
31
|
+
if (reportResults.note == reportResults.total) {
|
|
32
|
+
count = 0;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
count = reportResults.total;
|
|
36
|
+
}
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
count = 0;
|
|
40
|
+
}
|
|
41
|
+
return count > 0;
|
|
42
|
+
};
|
|
43
|
+
const failPipeline = (message = '') => {
|
|
44
|
+
console.log('\n ******************************** ' +
|
|
45
|
+
i18n.__('snapshotFailureHeader') +
|
|
46
|
+
' *********************************\n' +
|
|
47
|
+
i18n.__(message));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
};
|
|
50
|
+
const parseSeverity = severity => {
|
|
51
|
+
const severities = ['NOTE', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
|
|
52
|
+
if (severities.includes(severity.toUpperCase())) {
|
|
53
|
+
return severity.toLowerCase();
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.log(severity +
|
|
57
|
+
' Not recognised as a severity type please use LOW, MEDIUM, HIGH, CRITICAL, NOTE');
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
module.exports = {
|
|
62
|
+
failPipeline,
|
|
63
|
+
processFail,
|
|
64
|
+
isSeverityViolation,
|
|
65
|
+
parseSeverity
|
|
66
|
+
};
|
|
@@ -23,7 +23,7 @@ const getLatestVersion = async (config) => {
|
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
async function findLatestCLIVersion(config) {
|
|
26
|
-
const messageHidden = config.get('
|
|
26
|
+
const messageHidden = config.get('isCI');
|
|
27
27
|
if (!messageHidden) {
|
|
28
28
|
let latestCLIVersion = await getLatestVersion(config);
|
|
29
29
|
latestCLIVersion = latestCLIVersion.substring(8);
|
|
@@ -12,7 +12,7 @@ const MEDIUM = 'MEDIUM';
|
|
|
12
12
|
const HIGH = 'HIGH';
|
|
13
13
|
const CRITICAL = 'CRITICAL';
|
|
14
14
|
const APP_NAME = 'contrast';
|
|
15
|
-
const APP_VERSION = '1.0.
|
|
15
|
+
const APP_VERSION = '1.0.11';
|
|
16
16
|
const TIMEOUT = 120000;
|
|
17
17
|
const HIGH_COLOUR = '#ff9900';
|
|
18
18
|
const CRITICAL_COLOUR = '#e35858';
|
|
@@ -27,9 +27,12 @@ const NOTE_PRIORITY = 5;
|
|
|
27
27
|
const AUTH_UI_URL = 'https://cli-auth.contrastsecurity.com';
|
|
28
28
|
const AUTH_CALLBACK_URL = 'https://cli-auth-api.contrastsecurity.com';
|
|
29
29
|
const SARIF_FILE = 'SARIF';
|
|
30
|
+
const SBOM_CYCLONE_DX_FILE = 'cyclonedx';
|
|
31
|
+
const SBOM_SPDX_FILE = 'spdx';
|
|
30
32
|
const CE_URL = 'https://ce.contrastsecurity.com/';
|
|
31
33
|
module.exports = {
|
|
32
34
|
supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT },
|
|
35
|
+
supportedLanguagesScan: { JAVASCRIPT, DOTNET, JAVA },
|
|
33
36
|
LOW,
|
|
34
37
|
MEDIUM,
|
|
35
38
|
HIGH,
|
|
@@ -50,5 +53,7 @@ module.exports = {
|
|
|
50
53
|
HIGH_PRIORITY,
|
|
51
54
|
MEDIUM_PRIORITY,
|
|
52
55
|
LOW_PRIORITY,
|
|
53
|
-
NOTE_PRIORITY
|
|
56
|
+
NOTE_PRIORITY,
|
|
57
|
+
SBOM_CYCLONE_DX_FILE,
|
|
58
|
+
SBOM_SPDX_FILE
|
|
54
59
|
};
|