@contrast/contrast 1.0.7 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/audit/catalogueApplication/catalogueApplication.js +23 -5
- package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +17 -26
- package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +98 -37
- package/dist/audit/languageAnalysisEngine/report/models/reportListModel.js +2 -1
- package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +4 -3
- package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +3 -0
- package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +87 -19
- package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +40 -7
- package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
- package/dist/audit/save.js +37 -0
- package/dist/commands/audit/auditConfig.js +0 -16
- package/dist/commands/audit/auditController.js +18 -11
- package/dist/commands/audit/help.js +31 -25
- package/dist/commands/audit/processAudit.js +2 -2
- package/dist/commands/audit/saveFile.js +8 -4
- package/dist/commands/scan/sca/scaAnalysis.js +54 -16
- package/dist/common/HTTPClient.js +14 -8
- package/dist/common/errorHandling.js +2 -2
- package/dist/common/versionChecker.js +19 -4
- package/dist/constants/constants.js +7 -2
- package/dist/constants/locales.js +44 -44
- package/dist/constants.js +31 -14
- package/dist/index.js +55 -45
- package/dist/lambda/lambda.js +5 -2
- package/dist/sbom/generateSbom.js +5 -4
- package/dist/scaAnalysis/common/formatMessage.js +33 -6
- package/dist/scaAnalysis/common/treeUpload.js +4 -6
- package/dist/scaAnalysis/dotnet/analysis.js +43 -0
- package/dist/scaAnalysis/dotnet/index.js +10 -0
- package/dist/scaAnalysis/go/goReadDepFile.js +1 -3
- package/dist/scaAnalysis/java/analysis.js +5 -5
- package/dist/scaAnalysis/javascript/analysis.js +107 -0
- package/dist/scaAnalysis/javascript/index.js +53 -0
- package/dist/scaAnalysis/php/analysis.js +70 -0
- package/dist/scaAnalysis/php/index.js +17 -0
- package/dist/scaAnalysis/python/analysis.js +8 -7
- package/dist/scaAnalysis/ruby/analysis.js +8 -16
- package/dist/scaAnalysis/ruby/index.js +2 -2
- package/dist/scan/autoDetection.js +13 -24
- package/dist/scan/fileUtils.js +44 -14
- package/dist/scan/formatScanOutput.js +3 -3
- package/dist/scan/scanConfig.js +2 -2
- package/dist/utils/commonApi.js +1 -1
- package/dist/utils/filterProjectPath.js +7 -2
- package/dist/utils/getConfig.js +1 -6
- package/package.json +2 -3
- package/src/audit/catalogueApplication/catalogueApplication.js +28 -6
- package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +22 -58
- package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +157 -47
- package/src/audit/languageAnalysisEngine/report/models/reportListModel.ts +4 -1
- package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
- package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +4 -0
- package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +86 -32
- package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +44 -5
- package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
- package/src/audit/save.js +48 -0
- package/src/commands/audit/auditConfig.ts +0 -25
- package/src/commands/audit/auditController.ts +18 -20
- package/src/commands/audit/help.ts +31 -25
- package/src/commands/audit/processAudit.ts +2 -5
- package/src/commands/audit/saveFile.ts +6 -2
- package/src/commands/scan/processScan.js +0 -1
- package/src/commands/scan/sca/scaAnalysis.js +87 -32
- package/src/common/HTTPClient.js +16 -9
- package/src/common/errorHandling.ts +2 -3
- package/src/common/versionChecker.ts +23 -4
- package/src/constants/constants.js +9 -3
- package/src/constants/locales.js +72 -50
- package/src/constants.js +32 -15
- package/src/index.ts +70 -58
- 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 +35 -6
- package/src/scaAnalysis/common/treeUpload.js +4 -6
- package/src/scaAnalysis/dotnet/analysis.js +54 -0
- package/src/scaAnalysis/dotnet/index.js +11 -0
- package/src/scaAnalysis/go/goReadDepFile.js +1 -3
- package/src/scaAnalysis/java/analysis.js +5 -5
- package/src/scaAnalysis/javascript/analysis.js +126 -0
- package/src/scaAnalysis/javascript/index.js +75 -0
- package/src/scaAnalysis/php/analysis.js +78 -0
- package/src/scaAnalysis/php/index.js +22 -0
- package/src/scaAnalysis/python/analysis.js +8 -7
- package/src/scaAnalysis/ruby/analysis.js +8 -17
- package/src/scaAnalysis/ruby/index.js +2 -2
- package/src/scan/autoDetection.js +14 -27
- package/src/scan/fileUtils.js +46 -14
- package/src/scan/formatScanOutput.ts +3 -3
- package/src/scan/scanConfig.js +2 -4
- package/src/utils/commonApi.js +1 -1
- package/src/utils/filterProjectPath.js +6 -2
- package/src/utils/getConfig.ts +1 -12
- 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 -89
- package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -159
- 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 -124
- package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -250
- 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
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const i18n = require('i18n');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const save = require('../commands/audit/saveFile');
|
|
6
|
+
const sbom = require('../sbom/generateSbom');
|
|
7
|
+
const { SBOM_CYCLONE_DX_FILE, SBOM_SPDX_FILE } = require('../constants/constants');
|
|
8
|
+
async function auditSave(config) {
|
|
9
|
+
let fileFormat;
|
|
10
|
+
switch (config.save) {
|
|
11
|
+
case null:
|
|
12
|
+
case SBOM_CYCLONE_DX_FILE:
|
|
13
|
+
fileFormat = SBOM_CYCLONE_DX_FILE;
|
|
14
|
+
break;
|
|
15
|
+
case SBOM_SPDX_FILE:
|
|
16
|
+
fileFormat = SBOM_SPDX_FILE;
|
|
17
|
+
break;
|
|
18
|
+
default:
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
if (fileFormat) {
|
|
22
|
+
save.saveFile(config, fileFormat, await sbom.generateSbom(config, fileFormat));
|
|
23
|
+
const filename = `${config.applicationId}-sbom-${fileFormat}.json`;
|
|
24
|
+
if (fs.existsSync(filename)) {
|
|
25
|
+
console.log(i18n.__('auditSBOMSaveSuccess') + ` - ${filename}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(chalk.yellow.bold(`\n Unable to save ${filename} Software Bill of Materials (SBOM)`));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log(i18n.__('auditBadFiletypeSpecifiedForSave'));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
module.exports = {
|
|
36
|
+
auditSave
|
|
37
|
+
};
|
|
@@ -7,25 +7,9 @@ exports.getAuditConfig = void 0;
|
|
|
7
7
|
const paramHandler_1 = __importDefault(require("../../utils/paramsUtil/paramHandler"));
|
|
8
8
|
const constants_1 = __importDefault(require("../../constants"));
|
|
9
9
|
const parsedCLIOptions_1 = __importDefault(require("../../utils/parsedCLIOptions"));
|
|
10
|
-
const constants_2 = __importDefault(require("../../audit/languageAnalysisEngine/constants"));
|
|
11
|
-
const autoDetectLanguage_1 = require("../../audit/autodetection/autoDetectLanguage");
|
|
12
|
-
const { supportedLanguages: { NODE, JAVASCRIPT } } = constants_2.default;
|
|
13
10
|
const getAuditConfig = (argv) => {
|
|
14
11
|
const auditParameters = parsedCLIOptions_1.default.getCommandLineArgsCustom(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,12 +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.
|
|
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
|
-
const { v4: uuidv4 } = require('uuid');
|
|
12
9
|
const dealWithNoAppId = async (config) => {
|
|
13
10
|
let appID;
|
|
14
11
|
try {
|
|
@@ -17,8 +14,11 @@ const dealWithNoAppId = async (config) => {
|
|
|
17
14
|
return await (0, catalogueApplication_1.catalogueApplication)(config);
|
|
18
15
|
}
|
|
19
16
|
if (!appID && !config.applicationName) {
|
|
20
|
-
config.applicationName =
|
|
21
|
-
|
|
17
|
+
config.applicationName = (0, exports.getAppName)(config.file);
|
|
18
|
+
appID = await commonApi_1.default.returnAppId(config);
|
|
19
|
+
if (!appID) {
|
|
20
|
+
return await (0, catalogueApplication_1.catalogueApplication)(config);
|
|
21
|
+
}
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
catch (e) {
|
|
@@ -31,10 +31,17 @@ const dealWithNoAppId = async (config) => {
|
|
|
31
31
|
return appID;
|
|
32
32
|
};
|
|
33
33
|
exports.dealWithNoAppId = dealWithNoAppId;
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
const getAppName = (file) => {
|
|
35
|
+
const last = file.charAt(file.length - 1);
|
|
36
|
+
if (last !== '/') {
|
|
37
|
+
return file.split('/').pop();
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const str = removeLastChar(file);
|
|
41
|
+
return str.split('/').pop();
|
|
37
42
|
}
|
|
38
|
-
identifyLanguageAE(config.projectPath, languageFactory, config.applicationId, config);
|
|
39
43
|
};
|
|
40
|
-
exports.
|
|
44
|
+
exports.getAppName = getAppName;
|
|
45
|
+
const removeLastChar = (str) => {
|
|
46
|
+
return str.substring(0, str.length - 1);
|
|
47
|
+
};
|
|
@@ -18,35 +18,41 @@ 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
|
{
|
|
48
31
|
header: i18n_1.default.__('constantsAuditOptions'),
|
|
49
|
-
optionList: constants_1.default.commandLineDefinitions.auditOptionDefinitions
|
|
32
|
+
optionList: constants_1.default.commandLineDefinitions.auditOptionDefinitions,
|
|
33
|
+
hide: [
|
|
34
|
+
'application-id',
|
|
35
|
+
'application-name',
|
|
36
|
+
'organization-id',
|
|
37
|
+
'api-key',
|
|
38
|
+
'authorization',
|
|
39
|
+
'host',
|
|
40
|
+
'proxy',
|
|
41
|
+
'help',
|
|
42
|
+
'ff',
|
|
43
|
+
'ignore-cert-errors',
|
|
44
|
+
'verbose',
|
|
45
|
+
'debug',
|
|
46
|
+
'experimental',
|
|
47
|
+
'tags',
|
|
48
|
+
'sub-project',
|
|
49
|
+
'code',
|
|
50
|
+
'maven-settings-path',
|
|
51
|
+
'language',
|
|
52
|
+
'experimental',
|
|
53
|
+
'app-groups',
|
|
54
|
+
'metadata'
|
|
55
|
+
]
|
|
50
56
|
}
|
|
51
57
|
]);
|
|
52
58
|
exports.auditUsageGuide = auditUsageGuide;
|
|
@@ -1,16 +1,16 @@
|
|
|
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");
|
|
6
|
+
const scaAnalysis_1 = require("../scan/sca/scaAnalysis");
|
|
7
7
|
const processAudit = async (argv) => {
|
|
8
8
|
if (argv.indexOf('--help') != -1) {
|
|
9
9
|
printHelpMessage();
|
|
10
10
|
process.exit(0);
|
|
11
11
|
}
|
|
12
12
|
const config = (0, auditConfig_1.getAuditConfig)(argv);
|
|
13
|
-
|
|
13
|
+
await (0, scaAnalysis_1.processSca)(config);
|
|
14
14
|
};
|
|
15
15
|
exports.processAudit = processAudit;
|
|
16
16
|
const printHelpMessage = () => {
|
|
@@ -3,9 +3,13 @@ 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.saveFile = void 0;
|
|
6
7
|
const fs_1 = __importDefault(require("fs"));
|
|
7
|
-
|
|
8
|
-
const fileName = `${config.applicationId}-sbom
|
|
8
|
+
const saveFile = (config, type, rawResults) => {
|
|
9
|
+
const fileName = `${config.applicationId}-sbom-${type}.json`;
|
|
9
10
|
fs_1.default.writeFileSync(fileName, JSON.stringify(rawResults));
|
|
10
|
-
}
|
|
11
|
-
exports.
|
|
11
|
+
};
|
|
12
|
+
exports.saveFile = saveFile;
|
|
13
|
+
module.exports = {
|
|
14
|
+
saveFile: exports.saveFile
|
|
15
|
+
};
|
|
@@ -2,20 +2,33 @@
|
|
|
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, RUBY,
|
|
6
|
+
const { supportedLanguages: { JAVA, GO, PYTHON, RUBY, JAVASCRIPT, NODE, PHP, DOTNET } } = require('../../../constants/constants');
|
|
8
7
|
const goAnalysis = require('../../../scaAnalysis/go/goAnalysis');
|
|
8
|
+
const phpAnalysis = require('../../../scaAnalysis/php/index');
|
|
9
9
|
const { rubyAnalysis } = require('../../../scaAnalysis/ruby');
|
|
10
10
|
const { pythonAnalysis } = require('../../../scaAnalysis/python');
|
|
11
|
+
const javascriptAnalysis = require('../../../scaAnalysis/javascript');
|
|
12
|
+
const { pollForSnapshotCompletition } = require('../../../audit/languageAnalysisEngine/sendSnapshot');
|
|
13
|
+
const { returnOra, startSpinner, succeedSpinner } = require('../../../utils/oraWrapper');
|
|
14
|
+
const i18n = require('i18n');
|
|
15
|
+
const { vulnerabilityReportV2 } = require('../../../audit/languageAnalysisEngine/report/reportingFeature');
|
|
16
|
+
const auditSave = require('../../../audit/save');
|
|
17
|
+
const { dotNetAnalysis } = require('../../../scaAnalysis/dotnet');
|
|
18
|
+
const rootFile = require('../../../audit/languageAnalysisEngine/getProjectRootFilenames');
|
|
19
|
+
const path = require('path');
|
|
11
20
|
const processSca = async (config) => {
|
|
21
|
+
const startTime = performance.now();
|
|
12
22
|
let filesFound;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
config.
|
|
23
|
+
const projectStats = await rootFile.getProjectStats(config.file);
|
|
24
|
+
let pathWithFile = projectStats.isFile();
|
|
25
|
+
let fileName = config.file;
|
|
26
|
+
config.file = pathWithFile
|
|
27
|
+
? rootFile.getDirectoryFromPathGiven(config.file).concat('/')
|
|
28
|
+
: config.file;
|
|
29
|
+
filesFound = await autoDetection.autoDetectAuditFilesAndLanguages(config.file);
|
|
30
|
+
if (filesFound.length > 1 && pathWithFile) {
|
|
31
|
+
filesFound = filesFound.filter(i => Object.values(i)[0].includes(path.basename(fileName)));
|
|
19
32
|
}
|
|
20
33
|
let messageToSend = undefined;
|
|
21
34
|
if (filesFound.length === 1) {
|
|
@@ -24,34 +37,59 @@ const processSca = async (config) => {
|
|
|
24
37
|
messageToSend = javaAnalysis.javaAnalysis(config, filesFound[0]);
|
|
25
38
|
config.language = JAVA;
|
|
26
39
|
break;
|
|
27
|
-
case
|
|
28
|
-
messageToSend =
|
|
29
|
-
config.language =
|
|
40
|
+
case JAVASCRIPT:
|
|
41
|
+
messageToSend = await javascriptAnalysis.jsAnalysis(config, filesFound[0]);
|
|
42
|
+
config.language = NODE;
|
|
30
43
|
break;
|
|
31
44
|
case PYTHON:
|
|
32
45
|
messageToSend = pythonAnalysis(config, filesFound[0]);
|
|
33
46
|
config.language = PYTHON;
|
|
34
47
|
break;
|
|
48
|
+
case RUBY:
|
|
49
|
+
messageToSend = rubyAnalysis(config, filesFound[0]);
|
|
50
|
+
config.language = RUBY;
|
|
51
|
+
break;
|
|
52
|
+
case 'PHP':
|
|
53
|
+
messageToSend = phpAnalysis.phpAnalysis(config, filesFound[0]);
|
|
54
|
+
config.language = PHP;
|
|
55
|
+
break;
|
|
35
56
|
case GO:
|
|
36
57
|
messageToSend = goAnalysis.goAnalysis(config, filesFound[0]);
|
|
37
58
|
config.language = GO;
|
|
38
59
|
break;
|
|
60
|
+
case DOTNET:
|
|
61
|
+
messageToSend = dotNetAnalysis(config, filesFound[0]);
|
|
62
|
+
config.language = DOTNET;
|
|
63
|
+
break;
|
|
39
64
|
default:
|
|
40
|
-
console.log('language detected
|
|
65
|
+
console.log('No supported language detected in project path');
|
|
41
66
|
return;
|
|
42
67
|
}
|
|
43
68
|
if (!config.applicationId) {
|
|
44
69
|
config.applicationId = await auditController.dealWithNoAppId(config);
|
|
45
70
|
}
|
|
46
|
-
console.log('
|
|
47
|
-
const
|
|
71
|
+
console.log('');
|
|
72
|
+
const reportSpinner = returnOra(i18n.__('auditSCAAnalysisBegins'));
|
|
73
|
+
startSpinner(reportSpinner);
|
|
74
|
+
const snapshotResponse = await treeUpload.commonSendSnapShot(messageToSend, config);
|
|
75
|
+
await pollForSnapshotCompletition(config, snapshotResponse.id, reportSpinner);
|
|
76
|
+
succeedSpinner(reportSpinner, i18n.__('auditSCAAnalysisComplete'));
|
|
77
|
+
await vulnerabilityReportV2(config, snapshotResponse.id);
|
|
78
|
+
if (config.save !== undefined) {
|
|
79
|
+
await auditSave.auditSave(config);
|
|
80
|
+
}
|
|
81
|
+
const endTime = performance.now() - startTime;
|
|
82
|
+
const scanDurationMs = endTime - startTime;
|
|
83
|
+
console.log(`----- completed in ${(scanDurationMs / 1000).toFixed(2)}s -----`);
|
|
48
84
|
}
|
|
49
85
|
else {
|
|
50
86
|
if (filesFound.length === 0) {
|
|
51
|
-
console.log(
|
|
87
|
+
console.log(i18n.__('languageAnalysisNoLanguage'));
|
|
88
|
+
console.log(i18n.__('languageAnalysisNoLanguageHelpLine'));
|
|
89
|
+
throw new Error();
|
|
52
90
|
}
|
|
53
91
|
else {
|
|
54
|
-
|
|
92
|
+
throw new Error('multiple language files detected, please use --file to specify a directory or the file where dependencies are declared');
|
|
55
93
|
}
|
|
56
94
|
}
|
|
57
95
|
};
|
|
@@ -242,9 +242,15 @@ 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
|
+
return requestUtils.sendRequest({ method: 'get', options });
|
|
249
|
+
};
|
|
250
|
+
HTTPClient.prototype.getLatestVersion = function getLatestVersion() {
|
|
251
|
+
const options = _.cloneDeep(this.requestOptions);
|
|
252
|
+
options.url =
|
|
253
|
+
'https://pkg.contrastsecurity.com/artifactory/cli/latest-version.txt';
|
|
248
254
|
return requestUtils.sendRequest({ method: 'get', options });
|
|
249
255
|
};
|
|
250
256
|
HTTPClient.prototype.postAnalyticsFunction = function (config, provider, body) {
|
|
@@ -298,11 +304,11 @@ const createAppNameUrl = config => {
|
|
|
298
304
|
function createLibraryVulnerabilitiesUrl(config) {
|
|
299
305
|
return `${config.host}/Contrast/api/ng/${config.organizationId}/libraries/artifactsByGroupNameVersion`;
|
|
300
306
|
}
|
|
301
|
-
function createSpecificReportUrl(config, reportId) {
|
|
302
|
-
return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/reports/${reportId}`;
|
|
307
|
+
function createSpecificReportUrl(config, reportId, includeTree = false) {
|
|
308
|
+
return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/reports/${reportId}?&includeTree=${includeTree}`;
|
|
303
309
|
}
|
|
304
|
-
function createSpecificReportWithProdUrl(config, reportId) {
|
|
305
|
-
return createSpecificReportUrl(config, reportId).concat(
|
|
310
|
+
function createSpecificReportWithProdUrl(config, reportId, includeTree) {
|
|
311
|
+
return createSpecificReportUrl(config, reportId, includeTree).concat(`&nodesToInclude=PROD`);
|
|
306
312
|
}
|
|
307
313
|
function createSpecificReportStatusURL(config, reportId) {
|
|
308
314
|
return `${config.host}/Contrast/api/ng/sca/organizations/${config.organizationId}/applications/${config.applicationId}/snapshots/${reportId}/status`;
|
|
@@ -310,8 +316,8 @@ function createSpecificReportStatusURL(config, reportId) {
|
|
|
310
316
|
function createDataUrl() {
|
|
311
317
|
return `https://ardy.contrastsecurity.com/production`;
|
|
312
318
|
}
|
|
313
|
-
function
|
|
314
|
-
return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom
|
|
319
|
+
function createSbomUrl(config, type) {
|
|
320
|
+
return `${config.host}/Contrast/api/ng/${config.organizationId}/applications/${config.applicationId}/libraries/sbom/${type}`;
|
|
315
321
|
}
|
|
316
322
|
module.exports = HTTPClient;
|
|
317
323
|
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;
|
|
@@ -4,14 +4,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.isCorrectNodeVersion = exports.findLatestCLIVersion = void 0;
|
|
7
|
-
const latest_version_1 = __importDefault(require("latest-version"));
|
|
8
7
|
const constants_1 = require("../constants/constants");
|
|
9
8
|
const boxen_1 = __importDefault(require("boxen"));
|
|
10
9
|
const chalk_1 = __importDefault(require("chalk"));
|
|
11
10
|
const semver_1 = __importDefault(require("semver"));
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
const commonApi_1 = __importDefault(require("../utils/commonApi"));
|
|
12
|
+
const http2_1 = require("http2");
|
|
13
|
+
const getLatestVersion = async (config) => {
|
|
14
|
+
const client = commonApi_1.default.getHttpClient(config);
|
|
15
|
+
try {
|
|
16
|
+
const res = await client.getLatestVersion();
|
|
17
|
+
if (res.statusCode === http2_1.constants.HTTP_STATUS_OK) {
|
|
18
|
+
return res.body;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
async function findLatestCLIVersion(config) {
|
|
26
|
+
const messageHidden = config.get('updateMessageHidden');
|
|
27
|
+
if (!messageHidden) {
|
|
28
|
+
let latestCLIVersion = await getLatestVersion(config);
|
|
29
|
+
latestCLIVersion = latestCLIVersion.substring(8);
|
|
15
30
|
if (semver_1.default.lt(constants_1.APP_VERSION, latestCLIVersion)) {
|
|
16
31
|
const updateAvailableMessage = `Update available ${chalk_1.default.yellow(constants_1.APP_VERSION)} → ${chalk_1.default.green(latestCLIVersion)}`;
|
|
17
32
|
const npmUpdateAvailableCommand = `Run ${chalk_1.default.cyan('npm i @contrast/contrast -g')} to update via npm`;
|
|
@@ -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.10';
|
|
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
|
};
|