@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
|
@@ -1,29 +1,43 @@
|
|
|
1
|
-
const
|
|
1
|
+
const commonApi = require('../../utils/commonApi')
|
|
2
2
|
const { APP_VERSION } = require('../../constants/constants')
|
|
3
3
|
|
|
4
4
|
const commonSendSnapShot = async (analysis, config) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
let requestBody = {}
|
|
6
|
+
config.experimental === true
|
|
7
|
+
? (requestBody = sendToSCAServices(config, analysis))
|
|
8
|
+
: (requestBody = {
|
|
9
|
+
appID: config.applicationId,
|
|
10
|
+
cliVersion: APP_VERSION,
|
|
11
|
+
snapshot: analysis
|
|
12
|
+
})
|
|
13
|
+
const client = commonApi.getHttpClient(config)
|
|
12
14
|
return client
|
|
13
15
|
.sendSnapshot(requestBody, config)
|
|
14
16
|
.then(res => {
|
|
15
17
|
if (res.statusCode === 201) {
|
|
16
18
|
return res.body
|
|
17
19
|
} else {
|
|
18
|
-
|
|
19
|
-
console.log('error processing dependencies')
|
|
20
|
+
throw new Error(res.statusCode + ` error processing dependencies`)
|
|
20
21
|
}
|
|
21
22
|
})
|
|
22
23
|
.catch(err => {
|
|
23
|
-
|
|
24
|
+
throw err
|
|
24
25
|
})
|
|
25
26
|
}
|
|
26
27
|
|
|
28
|
+
const sendToSCAServices = (config, analysis) => {
|
|
29
|
+
return {
|
|
30
|
+
applicationId: config.applicationId,
|
|
31
|
+
dependencyTree: analysis,
|
|
32
|
+
organizationId: config.organizationId,
|
|
33
|
+
language: config.language,
|
|
34
|
+
tool: {
|
|
35
|
+
name: 'Contrast Codesec',
|
|
36
|
+
version: APP_VERSION
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
27
41
|
module.exports = {
|
|
28
42
|
commonSendSnapShot
|
|
29
43
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const xml2js = require('xml2js')
|
|
3
|
+
const i18n = require('i18n')
|
|
4
|
+
|
|
5
|
+
const readAndParseProjectFile = projectFilePath => {
|
|
6
|
+
const projectFile = fs.readFileSync(projectFilePath)
|
|
7
|
+
|
|
8
|
+
return new xml2js.Parser({
|
|
9
|
+
explicitArray: false,
|
|
10
|
+
mergeAttrs: true
|
|
11
|
+
}).parseString(projectFile)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const readAndParseLockFile = lockFilePath => {
|
|
15
|
+
const lockFile = JSON.parse(fs.readFileSync(lockFilePath).toString())
|
|
16
|
+
|
|
17
|
+
let count = 0 // Used to test if some nodes are deleted
|
|
18
|
+
|
|
19
|
+
for (const dependenciesNode in lockFile.dependencies) {
|
|
20
|
+
for (const innerNode in lockFile.dependencies[dependenciesNode]) {
|
|
21
|
+
const nodeValidation = JSON.stringify(
|
|
22
|
+
lockFile.dependencies[dependenciesNode][innerNode]
|
|
23
|
+
)
|
|
24
|
+
if (nodeValidation.includes('"type":"Project"')) {
|
|
25
|
+
count += 1
|
|
26
|
+
delete lockFile.dependencies[dependenciesNode][innerNode]
|
|
27
|
+
lockFile.additionalInfo = 'dependenciesNote'
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (count > 0) {
|
|
33
|
+
const multiLevelProjectWarning = () => {
|
|
34
|
+
console.log('')
|
|
35
|
+
console.log(i18n.__('dependenciesNote'))
|
|
36
|
+
}
|
|
37
|
+
setTimeout(multiLevelProjectWarning, 7000)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return lockFile
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const checkForCorrectFiles = languageFiles => {
|
|
44
|
+
if (!languageFiles.includes('packages.lock.json')) {
|
|
45
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', '.NET'))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (!languageFiles.some(i => i.includes('.csproj'))) {
|
|
49
|
+
throw new Error(i18n.__('languageAnalysisProjectFileError', '.NET'))
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const getDotNetDeps = (filePath, languageFiles) => {
|
|
54
|
+
checkForCorrectFiles(languageFiles)
|
|
55
|
+
const projectFileName = languageFiles.find(fileName =>
|
|
56
|
+
fileName.includes('.csproj')
|
|
57
|
+
)
|
|
58
|
+
const lockFileName = languageFiles.find(fileName =>
|
|
59
|
+
fileName.includes('.json')
|
|
60
|
+
)
|
|
61
|
+
const projectFile = readAndParseProjectFile(filePath + `/${projectFileName}`)
|
|
62
|
+
const lockFile = readAndParseLockFile(filePath + `/${lockFileName}`)
|
|
63
|
+
|
|
64
|
+
return { projectFile, lockFile }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = {
|
|
68
|
+
getDotNetDeps,
|
|
69
|
+
readAndParseProjectFile,
|
|
70
|
+
readAndParseLockFile,
|
|
71
|
+
checkForCorrectFiles
|
|
72
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const { getDotNetDeps } = require('./analysis')
|
|
2
|
+
const { createDotNetTSMessage } = require('../common/formatMessage')
|
|
3
|
+
|
|
4
|
+
const dotNetAnalysis = (config, languageFiles) => {
|
|
5
|
+
const dotNetDeps = getDotNetDeps(config.file, languageFiles.DOTNET)
|
|
6
|
+
return createDotNetTSMessage(dotNetDeps)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
module.exports = {
|
|
10
|
+
dotNetAnalysis
|
|
11
|
+
}
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
const { createGoTSMessage } = require('../common/formatMessage')
|
|
2
|
+
const {
|
|
3
|
+
parseDependenciesForSCAServices
|
|
4
|
+
} = require('../common/scaParserForGoAndJava')
|
|
2
5
|
const goReadDepFile = require('./goReadDepFile')
|
|
3
6
|
const goParseDeps = require('./goParseDeps')
|
|
4
7
|
|
|
5
|
-
const goAnalysis =
|
|
8
|
+
const goAnalysis = config => {
|
|
6
9
|
try {
|
|
7
10
|
const rawGoDependencies = goReadDepFile.getGoDependencies(config)
|
|
8
11
|
const parsedGoDependencies =
|
|
9
12
|
goParseDeps.parseGoDependencies(rawGoDependencies)
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
if (config.experimental) {
|
|
15
|
+
return parseDependenciesForSCAServices(parsedGoDependencies)
|
|
16
|
+
} else {
|
|
17
|
+
return createGoTSMessage(parsedGoDependencies)
|
|
18
|
+
}
|
|
12
19
|
} catch (e) {
|
|
13
20
|
console.log(e.message.toString())
|
|
14
21
|
}
|
|
@@ -6,9 +6,13 @@ const fs = require('fs')
|
|
|
6
6
|
const MAVEN = 'maven'
|
|
7
7
|
const GRADLE = 'gradle'
|
|
8
8
|
|
|
9
|
-
const determineProjectTypeAndCwd = (files,
|
|
9
|
+
const determineProjectTypeAndCwd = (files, config) => {
|
|
10
10
|
const projectData = {}
|
|
11
11
|
|
|
12
|
+
if (files.length > 1) {
|
|
13
|
+
files = files.filter(i => config.fileName.includes(i))
|
|
14
|
+
}
|
|
15
|
+
|
|
12
16
|
if (files[0].includes('pom.xml')) {
|
|
13
17
|
projectData.projectType = MAVEN
|
|
14
18
|
} else if (files[0].includes('build.gradle')) {
|
|
@@ -16,9 +20,9 @@ const determineProjectTypeAndCwd = (files, file) => {
|
|
|
16
20
|
}
|
|
17
21
|
|
|
18
22
|
//clean up the path to be a folder not a file
|
|
19
|
-
projectData.cwd = file
|
|
20
|
-
? file.replace('pom.xml', '').replace('build.gradle', '')
|
|
21
|
-
: file
|
|
23
|
+
projectData.cwd = config.file
|
|
24
|
+
? config.file.replace('pom.xml', '').replace('build.gradle', '')
|
|
25
|
+
: config.file
|
|
22
26
|
|
|
23
27
|
return projectData
|
|
24
28
|
}
|
|
@@ -124,7 +128,7 @@ const getJavaBuildDeps = (config, files) => {
|
|
|
124
128
|
}
|
|
125
129
|
|
|
126
130
|
try {
|
|
127
|
-
const projectData = determineProjectTypeAndCwd(files, config
|
|
131
|
+
const projectData = determineProjectTypeAndCwd(files, config)
|
|
128
132
|
if (projectData.projectType === MAVEN) {
|
|
129
133
|
output.mvnDependancyTreeOutput = buildMaven(config, projectData, timeout)
|
|
130
134
|
} else if (projectData.projectType === GRADLE) {
|
|
@@ -138,5 +142,6 @@ const getJavaBuildDeps = (config, files) => {
|
|
|
138
142
|
}
|
|
139
143
|
|
|
140
144
|
module.exports = {
|
|
141
|
-
getJavaBuildDeps
|
|
145
|
+
getJavaBuildDeps,
|
|
146
|
+
determineProjectTypeAndCwd
|
|
142
147
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
const analysis = require('./analysis')
|
|
2
2
|
const { parseBuildDeps } = require('./javaBuildDepsParser')
|
|
3
3
|
const { createJavaTSMessage } = require('../common/formatMessage')
|
|
4
|
+
const {
|
|
5
|
+
parseDependenciesForSCAServices
|
|
6
|
+
} = require('../common/scaParserForGoAndJava')
|
|
4
7
|
|
|
5
8
|
const javaAnalysis = (config, languageFiles) => {
|
|
6
9
|
languageFiles.JAVA.forEach(file => {
|
|
@@ -8,7 +11,12 @@ const javaAnalysis = (config, languageFiles) => {
|
|
|
8
11
|
})
|
|
9
12
|
|
|
10
13
|
const javaDeps = buildJavaTree(config, languageFiles.JAVA)
|
|
11
|
-
|
|
14
|
+
|
|
15
|
+
if (config.experimental) {
|
|
16
|
+
return parseDependenciesForSCAServices(javaDeps)
|
|
17
|
+
} else {
|
|
18
|
+
return createJavaTSMessage(javaDeps)
|
|
19
|
+
}
|
|
12
20
|
}
|
|
13
21
|
|
|
14
22
|
const buildJavaTree = (config, files) => {
|
|
@@ -14,14 +14,14 @@ 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])
|
|
18
|
+
|
|
17
19
|
obj.push(
|
|
18
20
|
shavedOutput[dep]
|
|
19
21
|
.replace('+-', '+---')
|
|
20
22
|
.replace('[INFO]', '')
|
|
21
23
|
.replace('\\-', '\\---')
|
|
22
24
|
.replace(':jar:', ':')
|
|
23
|
-
.replace(':test', '')
|
|
24
|
-
.replace(':compile', '')
|
|
25
25
|
.replace(' +', '+')
|
|
26
26
|
.replace(' |', '|')
|
|
27
27
|
.replace(' \\', '\\')
|
|
@@ -56,11 +56,29 @@ const preParser = shavedOutput => {
|
|
|
56
56
|
return depTree
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
const shaveDependencyType = dep => {
|
|
60
|
+
if (dep.endsWith('\r')) {
|
|
61
|
+
dep = dep.slice(0, -1)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (dep.endsWith(':test')) {
|
|
65
|
+
dep = dep.slice(0, -5)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (dep.endsWith(':compile')) {
|
|
69
|
+
dep = dep.slice(0, -8)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (dep.endsWith(':provided')) {
|
|
73
|
+
dep = dep.slice(0, -9)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return dep
|
|
77
|
+
}
|
|
78
|
+
|
|
59
79
|
const shaveOutput = (gradleDependencyTreeOutput, projectType) => {
|
|
60
80
|
let shavedOutput = gradleDependencyTreeOutput.split('\n')
|
|
61
81
|
|
|
62
|
-
// console.log(projectType)
|
|
63
|
-
|
|
64
82
|
if (projectType === 'maven') {
|
|
65
83
|
shavedOutput = preParser(shavedOutput)
|
|
66
84
|
}
|
|
@@ -375,7 +393,6 @@ const validateIndentation = shavedOutput => {
|
|
|
375
393
|
|
|
376
394
|
const parseGradle = (gradleDependencyTreeOutput, config, projectType) => {
|
|
377
395
|
let shavedOutput = shaveOutput(gradleDependencyTreeOutput, projectType)
|
|
378
|
-
|
|
379
396
|
if (config.subProject) {
|
|
380
397
|
let subProject = parseSubProject(shavedOutput)
|
|
381
398
|
let validatedOutput = validateIndentation(subProject)
|
|
@@ -400,5 +417,7 @@ module.exports = {
|
|
|
400
417
|
computeRelationToLastElement,
|
|
401
418
|
addIndentation,
|
|
402
419
|
computeLevel,
|
|
403
|
-
computeIndentation
|
|
420
|
+
computeIndentation,
|
|
421
|
+
shaveDependencyType,
|
|
422
|
+
preParser
|
|
404
423
|
}
|
|
@@ -12,7 +12,7 @@ const readFile = async (config, languageFiles, nameOfFile) => {
|
|
|
12
12
|
if (config.file) {
|
|
13
13
|
return fs.readFileSync(config.file.concat(languageFiles[index]), 'utf8')
|
|
14
14
|
} else {
|
|
15
|
-
|
|
15
|
+
throw new Error('could not find file')
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -40,8 +40,7 @@ const readYarn = async (config, languageFiles, nameOfFile) => {
|
|
|
40
40
|
|
|
41
41
|
return yarn
|
|
42
42
|
} catch (err) {
|
|
43
|
-
|
|
44
|
-
return
|
|
43
|
+
throw new Error(i18n.__('nodeReadYarnLockFileError') + `${err.message}`)
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
|
|
@@ -80,8 +79,7 @@ const parseNpmLockFile = async js => {
|
|
|
80
79
|
return js.npmLockFile
|
|
81
80
|
}
|
|
82
81
|
} catch (err) {
|
|
83
|
-
|
|
84
|
-
return
|
|
82
|
+
throw new Error(i18n.__('NodeParseNPM') + `${err.message}`)
|
|
85
83
|
}
|
|
86
84
|
}
|
|
87
85
|
|
|
@@ -113,8 +111,9 @@ const parseYarnLockFile = async js => {
|
|
|
113
111
|
return js
|
|
114
112
|
}
|
|
115
113
|
} catch (err) {
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
throw new Error(
|
|
115
|
+
i18n.__('NodeParseYarn', js.yarn.yarnVersion) + `${err.message}`
|
|
116
|
+
)
|
|
118
117
|
}
|
|
119
118
|
}
|
|
120
119
|
|
|
@@ -3,12 +3,10 @@ const i18n = require('i18n')
|
|
|
3
3
|
const formatMessage = require('../common/formatMessage')
|
|
4
4
|
|
|
5
5
|
const jsAnalysis = async (config, languageFiles) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
console.log(i18n.__('languageAnalysisMultipleLanguages1'))
|
|
11
|
-
return
|
|
6
|
+
checkForCorrectFiles(languageFiles)
|
|
7
|
+
|
|
8
|
+
if (!config.file.endsWith('/')) {
|
|
9
|
+
config.file = config.file.concat('/')
|
|
12
10
|
}
|
|
13
11
|
return buildNodeTree(config, languageFiles.JAVASCRIPT)
|
|
14
12
|
}
|
|
@@ -51,6 +49,27 @@ const parseFiles = async (config, files, js) => {
|
|
|
51
49
|
return js
|
|
52
50
|
}
|
|
53
51
|
|
|
52
|
+
const checkForCorrectFiles = languageFiles => {
|
|
53
|
+
if (
|
|
54
|
+
languageFiles.JAVASCRIPT.includes('package-lock.json') &&
|
|
55
|
+
languageFiles.JAVASCRIPT.includes('yarn.lock')
|
|
56
|
+
) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
i18n.__('languageAnalysisHasMultipleLockFiles', 'javascript')
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (
|
|
63
|
+
!languageFiles.JAVASCRIPT.includes('package-lock.json') &&
|
|
64
|
+
!languageFiles.JAVASCRIPT.includes('yarn.lock')
|
|
65
|
+
) {
|
|
66
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'javascript'))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!languageFiles.JAVASCRIPT.includes('package.json')) {
|
|
70
|
+
throw new Error(i18n.__('languageAnalysisHasNoPackageJsonFile'))
|
|
71
|
+
}
|
|
72
|
+
}
|
|
54
73
|
module.exports = {
|
|
55
74
|
jsAnalysis
|
|
56
75
|
}
|
|
@@ -2,24 +2,24 @@ const fs = require('fs')
|
|
|
2
2
|
const i18n = require('i18n')
|
|
3
3
|
const _ = require('lodash')
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
const readFile = (config, nameOfFile) => {
|
|
6
|
+
if (config.file) {
|
|
7
|
+
try {
|
|
8
|
+
return fs.readFileSync(config.file + '/' + nameOfFile)
|
|
9
|
+
} catch (error) {
|
|
10
|
+
console.log('Unable to find file')
|
|
11
|
+
console.log(error)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
6
15
|
|
|
7
|
-
const
|
|
8
|
-
const filePath = filePathForWindows(projectPath + customFile)
|
|
16
|
+
const parseProjectFiles = php => {
|
|
9
17
|
try {
|
|
10
|
-
|
|
18
|
+
// composer.json
|
|
11
19
|
php.composerJSON.dependencies = php.composerJSON.require
|
|
12
20
|
php.composerJSON.devDependencies = php.composerJSON['require-dev']
|
|
13
|
-
return php
|
|
14
|
-
} catch (err) {
|
|
15
|
-
console.log(err.message.toString())
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
const filePath = filePathForWindows(projectPath + customFile)
|
|
21
|
-
try {
|
|
22
|
-
php.rawLockFileContents = JSON.parse(fs.readFileSync(filePath, 'utf8'))
|
|
22
|
+
// composer.lock
|
|
23
23
|
php.lockFile = php.rawLockFileContents
|
|
24
24
|
let packages = _.keyBy(php.lockFile.packages, 'name')
|
|
25
25
|
let packagesDev = _.keyBy(php.lockFile['packages-dev'], 'name')
|
|
@@ -54,25 +54,6 @@ const readAndParseLockFile = (projectPath, customFile) => {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
const getPhpDeps = (config, files) => {
|
|
58
|
-
try {
|
|
59
|
-
return (
|
|
60
|
-
readProjectFile(config.file, files[0].projectFilename),
|
|
61
|
-
readAndParseLockFile(config.file, files[1].lockFilename)
|
|
62
|
-
)
|
|
63
|
-
} catch (err) {
|
|
64
|
-
console.log(err.message.toString())
|
|
65
|
-
process.exit(1)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const filePathForWindows = path => {
|
|
70
|
-
if (process.platform === 'win32') {
|
|
71
|
-
path = path.replace(/\//g, '\\')
|
|
72
|
-
}
|
|
73
|
-
return path
|
|
74
|
-
}
|
|
75
|
-
|
|
76
57
|
function addChildDepToLockFileAsOwnObj(php, depObj, key) {
|
|
77
58
|
php.lockFile.dependencies[key] = { version: depObj[key] }
|
|
78
59
|
}
|
|
@@ -92,7 +73,6 @@ function formatParentDepToLockFile(php) {
|
|
|
92
73
|
}
|
|
93
74
|
|
|
94
75
|
module.exports = {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
readProjectFile
|
|
76
|
+
parseProjectFiles,
|
|
77
|
+
readFile
|
|
98
78
|
}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
|
-
const {
|
|
1
|
+
const { readFile, parseProjectFiles } = require('./analysis')
|
|
2
2
|
const { createPhpTSMessage } = require('../common/formatMessage')
|
|
3
3
|
|
|
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
|
+
|
|
10
|
+
const readFiles = (config, files) => {
|
|
11
|
+
let php = {}
|
|
12
|
+
|
|
13
|
+
php.composerJSON = JSON.parse(readFile(config, 'composer.json'))
|
|
14
|
+
|
|
15
|
+
php.rawLockFileContents = JSON.parse(readFile(config, 'composer.lock'))
|
|
16
|
+
|
|
17
|
+
return php
|
|
7
18
|
}
|
|
8
19
|
|
|
9
20
|
module.exports = {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const multiReplace = require('string-multiple-replace')
|
|
2
2
|
const fs = require('fs')
|
|
3
|
+
const i18n = require('i18n')
|
|
3
4
|
|
|
4
5
|
const readAndParseProjectFile = file => {
|
|
5
6
|
const filePath = filePathForWindows(file + '/Pipfile')
|
|
@@ -23,12 +24,52 @@ const readAndParseLockFile = file => {
|
|
|
23
24
|
return parsedPipLock
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
const
|
|
27
|
+
const readLockFile = file => {
|
|
28
|
+
const filePath = filePathForWindows(file + '/Pipfile.lock')
|
|
29
|
+
const lockFile = fs.readFileSync(filePath, 'utf8')
|
|
30
|
+
let parsedPipLock = JSON.parse(lockFile)
|
|
31
|
+
return parsedPipLock['default']
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const scaPythonParser = pythonDependencies => {
|
|
35
|
+
let pythonParsedDeps = {}
|
|
36
|
+
for (let key in pythonDependencies) {
|
|
37
|
+
pythonParsedDeps[key] = {}
|
|
38
|
+
pythonParsedDeps[key].version = pythonDependencies[key].version.replace(
|
|
39
|
+
'==',
|
|
40
|
+
''
|
|
41
|
+
)
|
|
42
|
+
pythonParsedDeps[key].group = null
|
|
43
|
+
pythonParsedDeps[key].name = key
|
|
44
|
+
pythonParsedDeps[key].isProduction = true
|
|
45
|
+
pythonParsedDeps[key].dependencies = []
|
|
46
|
+
pythonParsedDeps[key].directDependency = true
|
|
47
|
+
}
|
|
48
|
+
return pythonParsedDeps
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const checkForCorrectFiles = languageFiles => {
|
|
52
|
+
if (!languageFiles.includes('Pipfile.lock')) {
|
|
53
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'python'))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!languageFiles.includes('Pipfile')) {
|
|
57
|
+
throw new Error(i18n.__('languageAnalysisProjectFileError', 'python'))
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const getPythonDeps = (config, languageFiles) => {
|
|
27
62
|
try {
|
|
28
|
-
|
|
29
|
-
|
|
63
|
+
if (config.experimental) {
|
|
64
|
+
let pythonLockFileContents = readLockFile(config.file)
|
|
65
|
+
return scaPythonParser(pythonLockFileContents)
|
|
66
|
+
} else {
|
|
67
|
+
checkForCorrectFiles(languageFiles)
|
|
68
|
+
const parseProject = readAndParseProjectFile(config.file)
|
|
69
|
+
const parsePip = readAndParseLockFile(config.file)
|
|
30
70
|
|
|
31
|
-
|
|
71
|
+
return { pipfileLock: parsePip, pipfilDependanceies: parseProject }
|
|
72
|
+
}
|
|
32
73
|
} catch (err) {
|
|
33
74
|
console.log(err.message.toString())
|
|
34
75
|
process.exit(1)
|
|
@@ -44,6 +85,9 @@ const filePathForWindows = path => {
|
|
|
44
85
|
|
|
45
86
|
module.exports = {
|
|
46
87
|
getPythonDeps,
|
|
88
|
+
scaPythonParser,
|
|
89
|
+
readAndParseLockFile,
|
|
47
90
|
readAndParseProjectFile,
|
|
48
|
-
|
|
91
|
+
checkForCorrectFiles,
|
|
92
|
+
readLockFile
|
|
49
93
|
}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
const { createPythonTSMessage } = require('../common/formatMessage')
|
|
2
|
-
const { getPythonDeps } = require('./analysis')
|
|
2
|
+
const { getPythonDeps, secondaryParser } = require('./analysis')
|
|
3
3
|
|
|
4
4
|
const pythonAnalysis = (config, languageFiles) => {
|
|
5
5
|
const pythonDeps = getPythonDeps(config, languageFiles.PYTHON)
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
if (config.experimental) {
|
|
8
|
+
return pythonDeps
|
|
9
|
+
} else {
|
|
10
|
+
return createPythonTSMessage(pythonDeps)
|
|
11
|
+
}
|
|
7
12
|
}
|
|
8
13
|
|
|
9
14
|
module.exports = {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const fs = require('fs')
|
|
2
|
+
const i18n = require('i18n')
|
|
2
3
|
|
|
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
|
|
|
8
8
|
let filteredRubyDep = rubyArray.filter(element => {
|
|
@@ -21,8 +21,7 @@ const readAndParseGemfile = file => {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
const readAndParseGemLockFile = file => {
|
|
24
|
-
const
|
|
25
|
-
const lockFile = fs.readFileSync(fileName, 'utf8')
|
|
24
|
+
const lockFile = fs.readFileSync(file + '/Gemfile.lock', 'utf8')
|
|
26
25
|
const dependencyRegEx = /^\s*([A-Za-z0-9.!@#$%\-^&*_+]*)\s*(\((.*?)\))/
|
|
27
26
|
|
|
28
27
|
const lines = lockFile.split('\n')
|
|
@@ -243,27 +242,30 @@ const buildSourceDependencyWithVersion = (
|
|
|
243
242
|
return dependencies
|
|
244
243
|
}
|
|
245
244
|
|
|
246
|
-
const getRubyDeps = config => {
|
|
245
|
+
const getRubyDeps = (config, languageFiles) => {
|
|
247
246
|
try {
|
|
247
|
+
checkForCorrectFiles(languageFiles)
|
|
248
248
|
const parsedGem = readAndParseGemfile(config.file)
|
|
249
249
|
const parsedLock = readAndParseGemLockFile(config.file)
|
|
250
250
|
|
|
251
251
|
return { gemfilesDependanceies: parsedGem, gemfileLock: parsedLock }
|
|
252
252
|
} catch (err) {
|
|
253
|
-
|
|
254
|
-
process.exit(1)
|
|
253
|
+
throw err
|
|
255
254
|
}
|
|
256
255
|
}
|
|
257
256
|
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
|
|
257
|
+
const checkForCorrectFiles = languageFiles => {
|
|
258
|
+
if (!languageFiles.includes('Gemfile.lock')) {
|
|
259
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'ruby'))
|
|
260
|
+
}
|
|
261
261
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
path = path.replace(/\//g, '\\')
|
|
262
|
+
if (!languageFiles.includes('Gemfile')) {
|
|
263
|
+
throw new Error(i18n.__('languageAnalysisProjectFileError', 'ruby'))
|
|
265
264
|
}
|
|
266
|
-
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const trimWhiteSpace = string => {
|
|
268
|
+
return string.replace(/\s+/g, '')
|
|
267
269
|
}
|
|
268
270
|
|
|
269
271
|
module.exports = {
|
|
@@ -278,5 +280,6 @@ module.exports = {
|
|
|
278
280
|
getVersion,
|
|
279
281
|
getPatchLevel,
|
|
280
282
|
formatSourceArr,
|
|
281
|
-
getSourceArray
|
|
283
|
+
getSourceArray,
|
|
284
|
+
checkForCorrectFiles
|
|
282
285
|
}
|