@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
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const xml2js = require('xml2js');
|
|
4
|
+
const i18n = require('i18n');
|
|
5
|
+
const readAndParseProjectFile = projectFilePath => {
|
|
6
|
+
const projectFile = fs.readFileSync(projectFilePath);
|
|
7
|
+
return new xml2js.Parser({
|
|
8
|
+
explicitArray: false,
|
|
9
|
+
mergeAttrs: true
|
|
10
|
+
}).parseString(projectFile);
|
|
11
|
+
};
|
|
12
|
+
const readAndParseLockFile = lockFilePath => {
|
|
13
|
+
const lockFile = JSON.parse(fs.readFileSync(lockFilePath).toString());
|
|
14
|
+
let count = 0;
|
|
15
|
+
for (const dependenciesNode in lockFile.dependencies) {
|
|
16
|
+
for (const innerNode in lockFile.dependencies[dependenciesNode]) {
|
|
17
|
+
const nodeValidation = JSON.stringify(lockFile.dependencies[dependenciesNode][innerNode]);
|
|
18
|
+
if (nodeValidation.includes('"type":"Project"')) {
|
|
19
|
+
count += 1;
|
|
20
|
+
delete lockFile.dependencies[dependenciesNode][innerNode];
|
|
21
|
+
lockFile.additionalInfo = 'dependenciesNote';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (count > 0) {
|
|
26
|
+
const multiLevelProjectWarning = () => {
|
|
27
|
+
console.log('');
|
|
28
|
+
console.log(i18n.__('dependenciesNote'));
|
|
29
|
+
};
|
|
30
|
+
setTimeout(multiLevelProjectWarning, 7000);
|
|
31
|
+
}
|
|
32
|
+
return lockFile;
|
|
33
|
+
};
|
|
34
|
+
const checkForCorrectFiles = languageFiles => {
|
|
35
|
+
if (!languageFiles.includes('packages.lock.json')) {
|
|
36
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', '.NET'));
|
|
37
|
+
}
|
|
38
|
+
if (!languageFiles.some(i => i.includes('.csproj'))) {
|
|
39
|
+
throw new Error(i18n.__('languageAnalysisProjectFileError', '.NET'));
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const getDotNetDeps = (filePath, languageFiles) => {
|
|
43
|
+
checkForCorrectFiles(languageFiles);
|
|
44
|
+
const projectFileName = languageFiles.find(fileName => fileName.includes('.csproj'));
|
|
45
|
+
const lockFileName = languageFiles.find(fileName => fileName.includes('.json'));
|
|
46
|
+
const projectFile = readAndParseProjectFile(filePath + `/${projectFileName}`);
|
|
47
|
+
const lockFile = readAndParseLockFile(filePath + `/${lockFileName}`);
|
|
48
|
+
return { projectFile, lockFile };
|
|
49
|
+
};
|
|
50
|
+
module.exports = {
|
|
51
|
+
getDotNetDeps,
|
|
52
|
+
readAndParseProjectFile,
|
|
53
|
+
readAndParseLockFile,
|
|
54
|
+
checkForCorrectFiles
|
|
55
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const { getDotNetDeps } = require('./analysis');
|
|
3
|
+
const { createDotNetTSMessage } = require('../common/formatMessage');
|
|
4
|
+
const dotNetAnalysis = (config, languageFiles) => {
|
|
5
|
+
const dotNetDeps = getDotNetDeps(config.file, languageFiles.DOTNET);
|
|
6
|
+
return createDotNetTSMessage(dotNetDeps);
|
|
7
|
+
};
|
|
8
|
+
module.exports = {
|
|
9
|
+
dotNetAnalysis
|
|
10
|
+
};
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const { createGoTSMessage } = require('../common/formatMessage');
|
|
3
|
+
const { parseDependenciesForSCAServices } = require('../common/scaParserForGoAndJava');
|
|
3
4
|
const goReadDepFile = require('./goReadDepFile');
|
|
4
5
|
const goParseDeps = require('./goParseDeps');
|
|
5
|
-
const goAnalysis =
|
|
6
|
+
const goAnalysis = config => {
|
|
6
7
|
try {
|
|
7
8
|
const rawGoDependencies = goReadDepFile.getGoDependencies(config);
|
|
8
9
|
const parsedGoDependencies = goParseDeps.parseGoDependencies(rawGoDependencies);
|
|
9
|
-
|
|
10
|
+
if (config.experimental) {
|
|
11
|
+
return parseDependenciesForSCAServices(parsedGoDependencies);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
return createGoTSMessage(parsedGoDependencies);
|
|
15
|
+
}
|
|
10
16
|
}
|
|
11
17
|
catch (e) {
|
|
12
18
|
console.log(e.message.toString());
|
|
@@ -5,17 +5,20 @@ const i18n = require('i18n');
|
|
|
5
5
|
const fs = require('fs');
|
|
6
6
|
const MAVEN = 'maven';
|
|
7
7
|
const GRADLE = 'gradle';
|
|
8
|
-
const determineProjectTypeAndCwd = (files,
|
|
8
|
+
const determineProjectTypeAndCwd = (files, config) => {
|
|
9
9
|
const projectData = {};
|
|
10
|
+
if (files.length > 1) {
|
|
11
|
+
files = files.filter(i => config.fileName.includes(i));
|
|
12
|
+
}
|
|
10
13
|
if (files[0].includes('pom.xml')) {
|
|
11
14
|
projectData.projectType = MAVEN;
|
|
12
15
|
}
|
|
13
16
|
else if (files[0].includes('build.gradle')) {
|
|
14
17
|
projectData.projectType = GRADLE;
|
|
15
18
|
}
|
|
16
|
-
projectData.cwd = file
|
|
17
|
-
? file.replace('pom.xml', '').replace('build.gradle', '')
|
|
18
|
-
: file;
|
|
19
|
+
projectData.cwd = config.file
|
|
20
|
+
? config.file.replace('pom.xml', '').replace('build.gradle', '')
|
|
21
|
+
: config.file;
|
|
19
22
|
return projectData;
|
|
20
23
|
};
|
|
21
24
|
const buildMaven = (config, projectData, timeout) => {
|
|
@@ -86,7 +89,7 @@ const getJavaBuildDeps = (config, files) => {
|
|
|
86
89
|
projectType: undefined
|
|
87
90
|
};
|
|
88
91
|
try {
|
|
89
|
-
const projectData = determineProjectTypeAndCwd(files, config
|
|
92
|
+
const projectData = determineProjectTypeAndCwd(files, config);
|
|
90
93
|
if (projectData.projectType === MAVEN) {
|
|
91
94
|
output.mvnDependancyTreeOutput = buildMaven(config, projectData, timeout);
|
|
92
95
|
}
|
|
@@ -101,5 +104,6 @@ const getJavaBuildDeps = (config, files) => {
|
|
|
101
104
|
}
|
|
102
105
|
};
|
|
103
106
|
module.exports = {
|
|
104
|
-
getJavaBuildDeps
|
|
107
|
+
getJavaBuildDeps,
|
|
108
|
+
determineProjectTypeAndCwd
|
|
105
109
|
};
|
|
@@ -2,12 +2,18 @@
|
|
|
2
2
|
const analysis = require('./analysis');
|
|
3
3
|
const { parseBuildDeps } = require('./javaBuildDepsParser');
|
|
4
4
|
const { createJavaTSMessage } = require('../common/formatMessage');
|
|
5
|
+
const { parseDependenciesForSCAServices } = require('../common/scaParserForGoAndJava');
|
|
5
6
|
const javaAnalysis = (config, languageFiles) => {
|
|
6
7
|
languageFiles.JAVA.forEach(file => {
|
|
7
8
|
file.replace('build.gradle.kts', 'build.gradle');
|
|
8
9
|
});
|
|
9
10
|
const javaDeps = buildJavaTree(config, languageFiles.JAVA);
|
|
10
|
-
|
|
11
|
+
if (config.experimental) {
|
|
12
|
+
return parseDependenciesForSCAServices(javaDeps);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return createJavaTSMessage(javaDeps);
|
|
16
|
+
}
|
|
11
17
|
};
|
|
12
18
|
const buildJavaTree = (config, files) => {
|
|
13
19
|
const javaBuildDeps = analysis.getJavaBuildDeps(config, files);
|
|
@@ -14,13 +14,12 @@ const parseBuildDeps = (config, input) => {
|
|
|
14
14
|
const preParser = shavedOutput => {
|
|
15
15
|
let obj = [];
|
|
16
16
|
for (let dep in shavedOutput) {
|
|
17
|
+
shavedOutput[dep] = shaveDependencyType(shavedOutput[dep]);
|
|
17
18
|
obj.push(shavedOutput[dep]
|
|
18
19
|
.replace('+-', '+---')
|
|
19
20
|
.replace('[INFO]', '')
|
|
20
21
|
.replace('\\-', '\\---')
|
|
21
22
|
.replace(':jar:', ':')
|
|
22
|
-
.replace(':test', '')
|
|
23
|
-
.replace(':compile', '')
|
|
24
23
|
.replace(' +', '+')
|
|
25
24
|
.replace(' |', '|')
|
|
26
25
|
.replace(' \\', '\\')
|
|
@@ -50,6 +49,21 @@ const preParser = shavedOutput => {
|
|
|
50
49
|
}
|
|
51
50
|
return depTree;
|
|
52
51
|
};
|
|
52
|
+
const shaveDependencyType = dep => {
|
|
53
|
+
if (dep.endsWith('\r')) {
|
|
54
|
+
dep = dep.slice(0, -1);
|
|
55
|
+
}
|
|
56
|
+
if (dep.endsWith(':test')) {
|
|
57
|
+
dep = dep.slice(0, -5);
|
|
58
|
+
}
|
|
59
|
+
if (dep.endsWith(':compile')) {
|
|
60
|
+
dep = dep.slice(0, -8);
|
|
61
|
+
}
|
|
62
|
+
if (dep.endsWith(':provided')) {
|
|
63
|
+
dep = dep.slice(0, -9);
|
|
64
|
+
}
|
|
65
|
+
return dep;
|
|
66
|
+
};
|
|
53
67
|
const shaveOutput = (gradleDependencyTreeOutput, projectType) => {
|
|
54
68
|
let shavedOutput = gradleDependencyTreeOutput.split('\n');
|
|
55
69
|
if (projectType === 'maven') {
|
|
@@ -335,5 +349,7 @@ module.exports = {
|
|
|
335
349
|
computeRelationToLastElement,
|
|
336
350
|
addIndentation,
|
|
337
351
|
computeLevel,
|
|
338
|
-
computeIndentation
|
|
352
|
+
computeIndentation,
|
|
353
|
+
shaveDependencyType,
|
|
354
|
+
preParser
|
|
339
355
|
};
|
|
@@ -10,7 +10,7 @@ const readFile = async (config, languageFiles, nameOfFile) => {
|
|
|
10
10
|
return fs.readFileSync(config.file.concat(languageFiles[index]), 'utf8');
|
|
11
11
|
}
|
|
12
12
|
else {
|
|
13
|
-
|
|
13
|
+
throw new Error('could not find file');
|
|
14
14
|
}
|
|
15
15
|
};
|
|
16
16
|
const readYarn = async (config, languageFiles, nameOfFile) => {
|
|
@@ -29,8 +29,7 @@ const readYarn = async (config, languageFiles, nameOfFile) => {
|
|
|
29
29
|
return yarn;
|
|
30
30
|
}
|
|
31
31
|
catch (err) {
|
|
32
|
-
|
|
33
|
-
return;
|
|
32
|
+
throw new Error(i18n.__('nodeReadYarnLockFileError') + `${err.message}`);
|
|
34
33
|
}
|
|
35
34
|
};
|
|
36
35
|
const parseNpmLockFile = async (js) => {
|
|
@@ -67,8 +66,7 @@ const parseNpmLockFile = async (js) => {
|
|
|
67
66
|
}
|
|
68
67
|
}
|
|
69
68
|
catch (err) {
|
|
70
|
-
|
|
71
|
-
return;
|
|
69
|
+
throw new Error(i18n.__('NodeParseNPM') + `${err.message}`);
|
|
72
70
|
}
|
|
73
71
|
};
|
|
74
72
|
const addDepToLockFile = (js, depObj, key) => {
|
|
@@ -97,8 +95,7 @@ const parseYarnLockFile = async (js) => {
|
|
|
97
95
|
}
|
|
98
96
|
}
|
|
99
97
|
catch (err) {
|
|
100
|
-
|
|
101
|
-
return;
|
|
98
|
+
throw new Error(i18n.__('NodeParseYarn', js.yarn.yarnVersion) + `${err.message}`);
|
|
102
99
|
}
|
|
103
100
|
};
|
|
104
101
|
module.exports = {
|
|
@@ -3,10 +3,9 @@ const analysis = require('./analysis');
|
|
|
3
3
|
const i18n = require('i18n');
|
|
4
4
|
const formatMessage = require('../common/formatMessage');
|
|
5
5
|
const jsAnalysis = async (config, languageFiles) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return;
|
|
6
|
+
checkForCorrectFiles(languageFiles);
|
|
7
|
+
if (!config.file.endsWith('/')) {
|
|
8
|
+
config.file = config.file.concat('/');
|
|
10
9
|
}
|
|
11
10
|
return buildNodeTree(config, languageFiles.JAVASCRIPT);
|
|
12
11
|
};
|
|
@@ -36,6 +35,19 @@ const parseFiles = async (config, files, js) => {
|
|
|
36
35
|
}
|
|
37
36
|
return js;
|
|
38
37
|
};
|
|
38
|
+
const checkForCorrectFiles = languageFiles => {
|
|
39
|
+
if (languageFiles.JAVASCRIPT.includes('package-lock.json') &&
|
|
40
|
+
languageFiles.JAVASCRIPT.includes('yarn.lock')) {
|
|
41
|
+
throw new Error(i18n.__('languageAnalysisHasMultipleLockFiles', 'javascript'));
|
|
42
|
+
}
|
|
43
|
+
if (!languageFiles.JAVASCRIPT.includes('package-lock.json') &&
|
|
44
|
+
!languageFiles.JAVASCRIPT.includes('yarn.lock')) {
|
|
45
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'javascript'));
|
|
46
|
+
}
|
|
47
|
+
if (!languageFiles.JAVASCRIPT.includes('package.json')) {
|
|
48
|
+
throw new Error(i18n.__('languageAnalysisHasNoPackageJsonFile'));
|
|
49
|
+
}
|
|
50
|
+
};
|
|
39
51
|
module.exports = {
|
|
40
52
|
jsAnalysis
|
|
41
53
|
};
|
|
@@ -2,23 +2,21 @@
|
|
|
2
2
|
const fs = require('fs');
|
|
3
3
|
const i18n = require('i18n');
|
|
4
4
|
const _ = require('lodash');
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
catch (err) {
|
|
15
|
-
console.log(err.message.toString());
|
|
5
|
+
const readFile = (config, nameOfFile) => {
|
|
6
|
+
if (config.file) {
|
|
7
|
+
try {
|
|
8
|
+
return fs.readFileSync(config.file + '/' + nameOfFile);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
console.log('Unable to find file');
|
|
12
|
+
console.log(error);
|
|
13
|
+
}
|
|
16
14
|
}
|
|
17
15
|
};
|
|
18
|
-
const
|
|
19
|
-
const filePath = filePathForWindows(projectPath + customFile);
|
|
16
|
+
const parseProjectFiles = php => {
|
|
20
17
|
try {
|
|
21
|
-
php.
|
|
18
|
+
php.composerJSON.dependencies = php.composerJSON.require;
|
|
19
|
+
php.composerJSON.devDependencies = php.composerJSON['require-dev'];
|
|
22
20
|
php.lockFile = php.rawLockFileContents;
|
|
23
21
|
let packages = _.keyBy(php.lockFile.packages, 'name');
|
|
24
22
|
let packagesDev = _.keyBy(php.lockFile['packages-dev'], 'name');
|
|
@@ -50,22 +48,6 @@ const readAndParseLockFile = (projectPath, customFile) => {
|
|
|
50
48
|
return console.log(i18n.__('phpParseComposerLock', php) + `${err.message}`);
|
|
51
49
|
}
|
|
52
50
|
};
|
|
53
|
-
const getPhpDeps = (config, files) => {
|
|
54
|
-
try {
|
|
55
|
-
return (readProjectFile(config.file, files[0].projectFilename),
|
|
56
|
-
readAndParseLockFile(config.file, files[1].lockFilename));
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
console.log(err.message.toString());
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
const filePathForWindows = path => {
|
|
64
|
-
if (process.platform === 'win32') {
|
|
65
|
-
path = path.replace(/\//g, '\\');
|
|
66
|
-
}
|
|
67
|
-
return path;
|
|
68
|
-
};
|
|
69
51
|
function addChildDepToLockFileAsOwnObj(php, depObj, key) {
|
|
70
52
|
php.lockFile.dependencies[key] = { version: depObj[key] };
|
|
71
53
|
}
|
|
@@ -83,7 +65,6 @@ function formatParentDepToLockFile(php) {
|
|
|
83
65
|
}
|
|
84
66
|
}
|
|
85
67
|
module.exports = {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
readProjectFile
|
|
68
|
+
parseProjectFiles,
|
|
69
|
+
readFile
|
|
89
70
|
};
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const {
|
|
2
|
+
const { readFile, parseProjectFiles } = require('./analysis');
|
|
3
3
|
const { createPhpTSMessage } = require('../common/formatMessage');
|
|
4
|
-
const phpAnalysis = (config,
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const phpAnalysis = (config, files) => {
|
|
5
|
+
let analysis = readFiles(config, files.PHP);
|
|
6
|
+
const phpDep = parseProjectFiles(analysis);
|
|
7
|
+
return createPhpTSMessage(phpDep);
|
|
8
|
+
};
|
|
9
|
+
const readFiles = (config, files) => {
|
|
10
|
+
let php = {};
|
|
11
|
+
php.composerJSON = JSON.parse(readFile(config, 'composer.json'));
|
|
12
|
+
php.rawLockFileContents = JSON.parse(readFile(config, 'composer.lock'));
|
|
13
|
+
return php;
|
|
7
14
|
};
|
|
8
15
|
module.exports = {
|
|
9
16
|
phpAnalysis
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const multiReplace = require('string-multiple-replace');
|
|
3
3
|
const fs = require('fs');
|
|
4
|
+
const i18n = require('i18n');
|
|
4
5
|
const readAndParseProjectFile = file => {
|
|
5
6
|
const filePath = filePathForWindows(file + '/Pipfile');
|
|
6
7
|
const pipFile = fs.readFileSync(filePath, 'utf8');
|
|
@@ -18,11 +19,45 @@ const readAndParseLockFile = file => {
|
|
|
18
19
|
delete parsedPipLock['default'];
|
|
19
20
|
return parsedPipLock;
|
|
20
21
|
};
|
|
21
|
-
const
|
|
22
|
+
const readLockFile = file => {
|
|
23
|
+
const filePath = filePathForWindows(file + '/Pipfile.lock');
|
|
24
|
+
const lockFile = fs.readFileSync(filePath, 'utf8');
|
|
25
|
+
let parsedPipLock = JSON.parse(lockFile);
|
|
26
|
+
return parsedPipLock['default'];
|
|
27
|
+
};
|
|
28
|
+
const scaPythonParser = pythonDependencies => {
|
|
29
|
+
let pythonParsedDeps = {};
|
|
30
|
+
for (let key in pythonDependencies) {
|
|
31
|
+
pythonParsedDeps[key] = {};
|
|
32
|
+
pythonParsedDeps[key].version = pythonDependencies[key].version.replace('==', '');
|
|
33
|
+
pythonParsedDeps[key].group = null;
|
|
34
|
+
pythonParsedDeps[key].name = key;
|
|
35
|
+
pythonParsedDeps[key].isProduction = true;
|
|
36
|
+
pythonParsedDeps[key].dependencies = [];
|
|
37
|
+
pythonParsedDeps[key].directDependency = true;
|
|
38
|
+
}
|
|
39
|
+
return pythonParsedDeps;
|
|
40
|
+
};
|
|
41
|
+
const checkForCorrectFiles = languageFiles => {
|
|
42
|
+
if (!languageFiles.includes('Pipfile.lock')) {
|
|
43
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'python'));
|
|
44
|
+
}
|
|
45
|
+
if (!languageFiles.includes('Pipfile')) {
|
|
46
|
+
throw new Error(i18n.__('languageAnalysisProjectFileError', 'python'));
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const getPythonDeps = (config, languageFiles) => {
|
|
22
50
|
try {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
51
|
+
if (config.experimental) {
|
|
52
|
+
let pythonLockFileContents = readLockFile(config.file);
|
|
53
|
+
return scaPythonParser(pythonLockFileContents);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
checkForCorrectFiles(languageFiles);
|
|
57
|
+
const parseProject = readAndParseProjectFile(config.file);
|
|
58
|
+
const parsePip = readAndParseLockFile(config.file);
|
|
59
|
+
return { pipfileLock: parsePip, pipfilDependanceies: parseProject };
|
|
60
|
+
}
|
|
26
61
|
}
|
|
27
62
|
catch (err) {
|
|
28
63
|
console.log(err.message.toString());
|
|
@@ -37,6 +72,9 @@ const filePathForWindows = path => {
|
|
|
37
72
|
};
|
|
38
73
|
module.exports = {
|
|
39
74
|
getPythonDeps,
|
|
75
|
+
scaPythonParser,
|
|
76
|
+
readAndParseLockFile,
|
|
40
77
|
readAndParseProjectFile,
|
|
41
|
-
|
|
78
|
+
checkForCorrectFiles,
|
|
79
|
+
readLockFile
|
|
42
80
|
};
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const { createPythonTSMessage } = require('../common/formatMessage');
|
|
3
|
-
const { getPythonDeps } = require('./analysis');
|
|
3
|
+
const { getPythonDeps, secondaryParser } = require('./analysis');
|
|
4
4
|
const pythonAnalysis = (config, languageFiles) => {
|
|
5
5
|
const pythonDeps = getPythonDeps(config, languageFiles.PYTHON);
|
|
6
|
-
|
|
6
|
+
if (config.experimental) {
|
|
7
|
+
return pythonDeps;
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
return createPythonTSMessage(pythonDeps);
|
|
11
|
+
}
|
|
7
12
|
};
|
|
8
13
|
module.exports = {
|
|
9
14
|
pythonAnalysis
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const fs = require('fs');
|
|
3
|
+
const i18n = require('i18n');
|
|
3
4
|
const readAndParseGemfile = file => {
|
|
4
|
-
const
|
|
5
|
-
const gemFile = fs.readFileSync(fileName, 'utf8');
|
|
5
|
+
const gemFile = fs.readFileSync(file + '/Gemfile', 'utf8');
|
|
6
6
|
const rubyArray = gemFile.split('\n');
|
|
7
7
|
let filteredRubyDep = rubyArray.filter(element => {
|
|
8
8
|
return (!element.includes('#') &&
|
|
@@ -15,8 +15,7 @@ const readAndParseGemfile = file => {
|
|
|
15
15
|
return filteredRubyDep;
|
|
16
16
|
};
|
|
17
17
|
const readAndParseGemLockFile = file => {
|
|
18
|
-
const
|
|
19
|
-
const lockFile = fs.readFileSync(fileName, 'utf8');
|
|
18
|
+
const lockFile = fs.readFileSync(file + '/Gemfile.lock', 'utf8');
|
|
20
19
|
const dependencyRegEx = /^\s*([A-Za-z0-9.!@#$%\-^&*_+]*)\s*(\((.*?)\))/;
|
|
21
20
|
const lines = lockFile.split('\n');
|
|
22
21
|
return {
|
|
@@ -190,26 +189,28 @@ const buildSourceDependencyWithVersion = (whitespaceRegx, dependencyRegEx, line,
|
|
|
190
189
|
}
|
|
191
190
|
return dependencies;
|
|
192
191
|
};
|
|
193
|
-
const getRubyDeps = config => {
|
|
192
|
+
const getRubyDeps = (config, languageFiles) => {
|
|
194
193
|
try {
|
|
194
|
+
checkForCorrectFiles(languageFiles);
|
|
195
195
|
const parsedGem = readAndParseGemfile(config.file);
|
|
196
196
|
const parsedLock = readAndParseGemLockFile(config.file);
|
|
197
197
|
return { gemfilesDependanceies: parsedGem, gemfileLock: parsedLock };
|
|
198
198
|
}
|
|
199
199
|
catch (err) {
|
|
200
|
-
|
|
201
|
-
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
const checkForCorrectFiles = languageFiles => {
|
|
204
|
+
if (!languageFiles.includes('Gemfile.lock')) {
|
|
205
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'ruby'));
|
|
206
|
+
}
|
|
207
|
+
if (!languageFiles.includes('Gemfile')) {
|
|
208
|
+
throw new Error(i18n.__('languageAnalysisProjectFileError', 'ruby'));
|
|
202
209
|
}
|
|
203
210
|
};
|
|
204
211
|
const trimWhiteSpace = string => {
|
|
205
212
|
return string.replace(/\s+/g, '');
|
|
206
213
|
};
|
|
207
|
-
const filePathForWindows = path => {
|
|
208
|
-
if (process.platform === 'win32') {
|
|
209
|
-
path = path.replace(/\//g, '\\');
|
|
210
|
-
}
|
|
211
|
-
return path;
|
|
212
|
-
};
|
|
213
214
|
module.exports = {
|
|
214
215
|
getRubyDeps,
|
|
215
216
|
readAndParseGemfile,
|
|
@@ -222,5 +223,6 @@ module.exports = {
|
|
|
222
223
|
getVersion,
|
|
223
224
|
getPatchLevel,
|
|
224
225
|
formatSourceArr,
|
|
225
|
-
getSourceArray
|
|
226
|
+
getSourceArray,
|
|
227
|
+
checkForCorrectFiles
|
|
226
228
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const i18n = require('i18n');
|
|
3
3
|
const fileFinder = require('./fileUtils');
|
|
4
|
-
const languageResolver = require('../audit/languageAnalysisEngine/reduceIdentifiedLanguages');
|
|
5
4
|
const rootFile = require('../audit/languageAnalysisEngine/getProjectRootFilenames');
|
|
5
|
+
const path = require('path');
|
|
6
6
|
const autoDetectFileAndLanguage = async (configToUse) => {
|
|
7
7
|
const entries = await fileFinder.findFile();
|
|
8
8
|
if (entries.length === 1) {
|
|
@@ -24,30 +24,20 @@ const autoDetectFileAndLanguage = async (configToUse) => {
|
|
|
24
24
|
errorOnFileDetection(entries);
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
|
-
const autoDetectAuditFilesAndLanguages = async () => {
|
|
27
|
+
const autoDetectAuditFilesAndLanguages = async (filePath) => {
|
|
28
28
|
let languagesFound = [];
|
|
29
|
-
console.log(i18n.__('searchingAuditFileDirectory',
|
|
30
|
-
await fileFinder.findFilesJava(languagesFound);
|
|
31
|
-
await fileFinder.findFilesJavascript(languagesFound);
|
|
32
|
-
await fileFinder.findFilesPython(languagesFound);
|
|
33
|
-
await fileFinder.findFilesGo(languagesFound);
|
|
34
|
-
await fileFinder.findFilesPhp(languagesFound);
|
|
35
|
-
await fileFinder.findFilesRuby(languagesFound);
|
|
36
|
-
|
|
29
|
+
console.log(i18n.__('searchingAuditFileDirectory', filePath));
|
|
30
|
+
await fileFinder.findFilesJava(languagesFound, filePath);
|
|
31
|
+
await fileFinder.findFilesJavascript(languagesFound, filePath);
|
|
32
|
+
await fileFinder.findFilesPython(languagesFound, filePath);
|
|
33
|
+
await fileFinder.findFilesGo(languagesFound, filePath);
|
|
34
|
+
await fileFinder.findFilesPhp(languagesFound, filePath);
|
|
35
|
+
await fileFinder.findFilesRuby(languagesFound, filePath);
|
|
36
|
+
await fileFinder.findFilesDotNet(languagesFound, filePath);
|
|
37
|
+
if (languagesFound) {
|
|
37
38
|
return languagesFound;
|
|
38
39
|
}
|
|
39
|
-
|
|
40
|
-
console.log('found multiple languages, please specify one using --file to run SCA audit');
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
const manualDetectAuditFilesAndLanguages = file => {
|
|
44
|
-
let projectRootFilenames = rootFile.getProjectRootFilenames(file);
|
|
45
|
-
let identifiedLanguages = languageResolver.deduceLanguageScaAnalysis(projectRootFilenames);
|
|
46
|
-
if (Object.keys(identifiedLanguages).length === 0) {
|
|
47
|
-
console.log(i18n.__('languageAnalysisNoLanguage', file));
|
|
48
|
-
return [];
|
|
49
|
-
}
|
|
50
|
-
return [identifiedLanguages];
|
|
40
|
+
return [];
|
|
51
41
|
};
|
|
52
42
|
const hasWhiteSpace = s => {
|
|
53
43
|
const filename = s.split('/').pop();
|
|
@@ -88,6 +78,5 @@ module.exports = {
|
|
|
88
78
|
autoDetectFileAndLanguage,
|
|
89
79
|
errorOnFileDetection,
|
|
90
80
|
autoDetectAuditFilesAndLanguages,
|
|
91
|
-
errorOnAuditFileDetection
|
|
92
|
-
manualDetectAuditFilesAndLanguages
|
|
81
|
+
errorOnAuditFileDetection
|
|
93
82
|
};
|