@contrast/contrast 1.0.15 → 1.0.16
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/dist/audit/languageAnalysisEngine/sendSnapshot.js +2 -2
- package/dist/audit/report/commonReportingFunctions.js +1 -19
- package/dist/{constants.js → cliConstants.js} +41 -31
- package/dist/commands/audit/auditConfig.js +2 -2
- package/dist/commands/audit/help.js +2 -2
- package/dist/commands/auth/auth.js +1 -1
- package/dist/commands/config/config.js +1 -1
- package/dist/commands/scan/sca/scaAnalysis.js +33 -20
- package/dist/common/HTTPClient.js +4 -2
- package/dist/constants/constants.js +1 -1
- package/dist/constants/locales.js +5 -30
- package/dist/index.js +5 -5
- package/dist/scaAnalysis/common/auditReport.js +3 -2
- package/dist/scaAnalysis/common/scaParserForGoAndJava.js +1 -1
- package/dist/scaAnalysis/javascript/scaServiceParser.js +2 -2
- package/dist/scaAnalysis/php/phpNewServicesMapper.js +3 -3
- package/dist/scaAnalysis/python/analysis.js +1 -1
- package/dist/scaAnalysis/repoMode/gradleParser.js +75 -0
- package/dist/scaAnalysis/repoMode/index.js +21 -0
- package/dist/scaAnalysis/repoMode/mavenParser.js +76 -0
- package/dist/scaAnalysis/ruby/analysis.js +4 -4
- package/dist/scan/help.js +1 -1
- package/dist/scan/scanConfig.js +1 -1
- package/package.json +2 -1
- package/src/audit/languageAnalysisEngine/sendSnapshot.js +2 -6
- package/src/audit/report/commonReportingFunctions.js +1 -23
- package/src/{constants.js → cliConstants.js} +47 -35
- package/src/commands/audit/auditConfig.ts +1 -1
- package/src/commands/audit/help.ts +1 -1
- package/src/commands/auth/auth.js +1 -1
- package/src/commands/config/config.js +1 -1
- package/src/commands/scan/sca/scaAnalysis.js +35 -25
- package/src/common/HTTPClient.js +4 -2
- package/src/constants/constants.js +1 -1
- package/src/constants/locales.js +6 -44
- package/src/index.ts +1 -1
- package/src/scaAnalysis/common/auditReport.js +3 -4
- package/src/scaAnalysis/common/scaParserForGoAndJava.js +1 -1
- package/src/scaAnalysis/javascript/scaServiceParser.js +8 -2
- package/src/scaAnalysis/php/phpNewServicesMapper.js +3 -3
- package/src/scaAnalysis/python/analysis.js +1 -1
- package/src/scaAnalysis/repoMode/gradleParser.js +88 -0
- package/src/scaAnalysis/repoMode/index.js +21 -0
- package/src/scaAnalysis/repoMode/mavenParser.js +89 -0
- package/src/scaAnalysis/ruby/analysis.js +4 -4
- package/src/scan/help.js +1 -1
- package/src/scan/scanConfig.js +1 -1
|
@@ -38,7 +38,10 @@ const npmCreateDepTree = (
|
|
|
38
38
|
name: key,
|
|
39
39
|
version: getResolvedVersion(key, packageLock),
|
|
40
40
|
group: null,
|
|
41
|
-
|
|
41
|
+
productionDependency: checkIfInPackageJSON(
|
|
42
|
+
rawNode.packageJSON.dependencies,
|
|
43
|
+
key
|
|
44
|
+
),
|
|
42
45
|
directDependency: checkIfInPackageJSON(combinedPackageJSONDep, key),
|
|
43
46
|
dependencies: createNPMChildDependencies(packageLock, key)
|
|
44
47
|
}
|
|
@@ -59,7 +62,10 @@ const yarnCreateDepTree = (
|
|
|
59
62
|
name: gav,
|
|
60
63
|
version: getResolvedVersion(key, packageLock),
|
|
61
64
|
group: null,
|
|
62
|
-
|
|
65
|
+
productionDependency: checkIfInPackageJSON(
|
|
66
|
+
rawNode.packageJSON.dependencies,
|
|
67
|
+
nag
|
|
68
|
+
),
|
|
63
69
|
directDependency: checkIfInPackageJSON(combinedPackageJSONDep, nag),
|
|
64
70
|
dependencies: createChildDependencies(packageLock, key)
|
|
65
71
|
}
|
|
@@ -7,7 +7,7 @@ const parsePHPLockFileForScaServices = phpLockFile => {
|
|
|
7
7
|
return merge(buildDepTree(packages, true), buildDepTree(packagesDev, false))
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
const buildDepTree = (packages,
|
|
10
|
+
const buildDepTree = (packages, productionDependency) => {
|
|
11
11
|
//builds deps into flat structure
|
|
12
12
|
const dependencyTree = {}
|
|
13
13
|
|
|
@@ -21,7 +21,7 @@ const buildDepTree = (packages, isProduction) => {
|
|
|
21
21
|
name: name,
|
|
22
22
|
version: currentObj.version,
|
|
23
23
|
directDependency: true,
|
|
24
|
-
|
|
24
|
+
productionDependency: productionDependency,
|
|
25
25
|
dependencies: []
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -53,7 +53,7 @@ const buildSubDepsIntoFlatStructure = childDeps => {
|
|
|
53
53
|
name: name,
|
|
54
54
|
version: version,
|
|
55
55
|
directDependency: false,
|
|
56
|
-
|
|
56
|
+
productionDependency: false,
|
|
57
57
|
dependencies: []
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -41,7 +41,7 @@ const scaPythonParser = pythonDependencies => {
|
|
|
41
41
|
)
|
|
42
42
|
pythonParsedDeps[key].group = null
|
|
43
43
|
pythonParsedDeps[key].name = key
|
|
44
|
-
pythonParsedDeps[key].
|
|
44
|
+
pythonParsedDeps[key].productionDependency = true
|
|
45
45
|
pythonParsedDeps[key].dependencies = []
|
|
46
46
|
pythonParsedDeps[key].directDependency = true
|
|
47
47
|
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
const g2js = require('gradle-to-js/lib/parser')
|
|
2
|
+
|
|
3
|
+
const readBuildGradleFile = async project => {
|
|
4
|
+
const gradleFilePath = project.cwd + '/build.gradle'
|
|
5
|
+
return await g2js.parseFile(gradleFilePath)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const filterGav = (groupId, artifactId, version, gradleJson) => {
|
|
9
|
+
if (groupId === '') {
|
|
10
|
+
if (artifactId.includes(':')) {
|
|
11
|
+
groupId = artifactId.split(':')[0].replace("'", '')
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (version === '') {
|
|
16
|
+
if (artifactId.includes(':')) {
|
|
17
|
+
artifactId.split(':').length > 2
|
|
18
|
+
? (version = artifactId.split(':')[2].replace("'", ''))
|
|
19
|
+
: (version = null)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (artifactId.split(':').length > 1) {
|
|
24
|
+
artifactId = artifactId.split(':')[1].replace("'", '')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (version === null) {
|
|
28
|
+
version = getVersion(gradleJson, groupId)
|
|
29
|
+
}
|
|
30
|
+
return { groupId, artifactId, version }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const parseGradleJson = gradleJson => {
|
|
34
|
+
let deps = gradleJson.dependencies
|
|
35
|
+
let dependencyTree = {}
|
|
36
|
+
|
|
37
|
+
if (deps === undefined) {
|
|
38
|
+
console.log('Unable to find any dependencies in your project file.')
|
|
39
|
+
process.exit(0)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
for (let a in deps) {
|
|
43
|
+
let dependencyType = deps[a].type
|
|
44
|
+
|
|
45
|
+
if (dependencyType === 'implementation') {
|
|
46
|
+
let groupId = deps[a].group
|
|
47
|
+
let artifactId = deps[a].name
|
|
48
|
+
let version = deps[a].version
|
|
49
|
+
|
|
50
|
+
let filteredGav = filterGav(groupId, artifactId, version, gradleJson)
|
|
51
|
+
|
|
52
|
+
let depName =
|
|
53
|
+
filteredGav.groupId +
|
|
54
|
+
'/' +
|
|
55
|
+
filteredGav.artifactId +
|
|
56
|
+
'@' +
|
|
57
|
+
filteredGav.version
|
|
58
|
+
|
|
59
|
+
let parsedDependency = {
|
|
60
|
+
name: filteredGav.artifactId,
|
|
61
|
+
group: filteredGav.groupId,
|
|
62
|
+
version: filteredGav.version,
|
|
63
|
+
directDependency: true,
|
|
64
|
+
isProduction: true,
|
|
65
|
+
dependencies: []
|
|
66
|
+
}
|
|
67
|
+
dependencyTree[depName] = parsedDependency
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return dependencyTree
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const getVersion = (gradleJson, dependencyWithoutVersion) => {
|
|
74
|
+
let parentVersion = gradleJson.plugins[0].version
|
|
75
|
+
let parentGroupName = gradleJson.plugins[0].id
|
|
76
|
+
if (parentGroupName === dependencyWithoutVersion) {
|
|
77
|
+
return parentVersion
|
|
78
|
+
} else {
|
|
79
|
+
return null
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
module.exports = {
|
|
84
|
+
readBuildGradleFile,
|
|
85
|
+
parseGradleJson,
|
|
86
|
+
getVersion,
|
|
87
|
+
filterGav
|
|
88
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const mavenParser = require('./mavenParser')
|
|
2
|
+
const gradleParser = require('./gradleParser')
|
|
3
|
+
const { determineProjectTypeAndCwd } = require('../java/analysis')
|
|
4
|
+
|
|
5
|
+
const buildRepo = async (config, languageFiles) => {
|
|
6
|
+
const project = determineProjectTypeAndCwd(languageFiles.JAVA, config)
|
|
7
|
+
|
|
8
|
+
if (project.projectType === 'maven') {
|
|
9
|
+
let jsonPomFile = mavenParser.readPomFile(project)
|
|
10
|
+
mavenParser.parsePomFile(jsonPomFile)
|
|
11
|
+
} else if (project.projectType === 'gradle') {
|
|
12
|
+
const gradleJson = gradleParser.readBuildGradleFile(project)
|
|
13
|
+
gradleParser.parseGradleJson(await gradleJson)
|
|
14
|
+
} else {
|
|
15
|
+
console.log('Unable to read project files.')
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = {
|
|
20
|
+
buildRepo
|
|
21
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const xml2js = require('xml2js')
|
|
3
|
+
|
|
4
|
+
const readPomFile = project => {
|
|
5
|
+
const mavenFilePath = project.cwd + '/pom.xml'
|
|
6
|
+
const projectFile = fs.readFileSync(mavenFilePath)
|
|
7
|
+
let jsonPomFile
|
|
8
|
+
xml2js.parseString(projectFile, (err, result) => {
|
|
9
|
+
if (err) {
|
|
10
|
+
throw err
|
|
11
|
+
}
|
|
12
|
+
const json = JSON.stringify(result, null)
|
|
13
|
+
jsonPomFile = JSON.parse(json)
|
|
14
|
+
})
|
|
15
|
+
return jsonPomFile
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const getFromVersionsTag = (dependencyName, versionIdentifier, jsonPomFile) => {
|
|
19
|
+
// reading:
|
|
20
|
+
// <!-- DEPENDENCY VERSIONS -->
|
|
21
|
+
// <versions.animal-sniffer>1.16</versions.animal-sniffer>
|
|
22
|
+
let formattedVersion = versionIdentifier.replace(/[{}]/g, '').replace('$', '')
|
|
23
|
+
|
|
24
|
+
if (jsonPomFile.project.properties[0].hasOwnProperty([formattedVersion])) {
|
|
25
|
+
return jsonPomFile.project.properties[0][formattedVersion][0]
|
|
26
|
+
} else {
|
|
27
|
+
return null
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const parsePomFile = jsonPomFile => {
|
|
32
|
+
let dependencyTree = {}
|
|
33
|
+
let parsedVersion
|
|
34
|
+
let dependencies
|
|
35
|
+
jsonPomFile.project.hasOwnProperty('dependencies')
|
|
36
|
+
? (dependencies = jsonPomFile.project.dependencies[0].dependency)
|
|
37
|
+
: (dependencies =
|
|
38
|
+
jsonPomFile.project.dependencyManagement[0].dependencies[0].dependency)
|
|
39
|
+
|
|
40
|
+
for (let x in dependencies) {
|
|
41
|
+
let dependencyObject = dependencies[x]
|
|
42
|
+
if (!dependencyObject.hasOwnProperty('version')) {
|
|
43
|
+
parsedVersion = getVersion(jsonPomFile, dependencyObject)
|
|
44
|
+
} else {
|
|
45
|
+
dependencyObject.version[0].includes('${versions.')
|
|
46
|
+
? (parsedVersion = getFromVersionsTag(
|
|
47
|
+
dependencyObject.artifactId[0],
|
|
48
|
+
dependencyObject.version[0],
|
|
49
|
+
jsonPomFile
|
|
50
|
+
))
|
|
51
|
+
: (parsedVersion = dependencyObject.version[0])
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let depName =
|
|
55
|
+
dependencyObject.groupId +
|
|
56
|
+
'/' +
|
|
57
|
+
dependencyObject.artifactId +
|
|
58
|
+
'@' +
|
|
59
|
+
parsedVersion
|
|
60
|
+
|
|
61
|
+
let parsedDependency = {
|
|
62
|
+
name: dependencyObject.artifactId[0],
|
|
63
|
+
group: dependencyObject.groupId[0],
|
|
64
|
+
version: parsedVersion,
|
|
65
|
+
directDependency: true,
|
|
66
|
+
productionDependency: true,
|
|
67
|
+
dependencies: []
|
|
68
|
+
}
|
|
69
|
+
dependencyTree[depName] = parsedDependency
|
|
70
|
+
}
|
|
71
|
+
return dependencyTree
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const getVersion = (pomFile, dependencyWithoutVersion) => {
|
|
75
|
+
let parentVersion = pomFile.project.parent[0].version[0]
|
|
76
|
+
let parentGroupName = pomFile.project.parent[0].groupId[0]
|
|
77
|
+
if (parentGroupName === dependencyWithoutVersion.groupId[0]) {
|
|
78
|
+
return parentVersion
|
|
79
|
+
} else {
|
|
80
|
+
return null
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = {
|
|
85
|
+
readPomFile,
|
|
86
|
+
getVersion,
|
|
87
|
+
parsePomFile,
|
|
88
|
+
getFromVersionsTag
|
|
89
|
+
}
|
|
@@ -341,12 +341,12 @@ const removeRedundantAndPopulateDefinedElements = deps => {
|
|
|
341
341
|
delete element.platform
|
|
342
342
|
|
|
343
343
|
element.group = null
|
|
344
|
-
element.
|
|
344
|
+
element.productionDependency = true
|
|
345
345
|
}
|
|
346
346
|
|
|
347
347
|
if (element.sourceType === 'GEM') {
|
|
348
348
|
element.group = null
|
|
349
|
-
element.
|
|
349
|
+
element.productionDependency = true
|
|
350
350
|
|
|
351
351
|
delete element.sourceType
|
|
352
352
|
delete element.remote
|
|
@@ -355,7 +355,7 @@ const removeRedundantAndPopulateDefinedElements = deps => {
|
|
|
355
355
|
|
|
356
356
|
if (element.sourceType === 'PATH') {
|
|
357
357
|
element.group = null
|
|
358
|
-
element.
|
|
358
|
+
element.productionDependency = true
|
|
359
359
|
|
|
360
360
|
delete element.platform
|
|
361
361
|
delete element.sourceType
|
|
@@ -364,7 +364,7 @@ const removeRedundantAndPopulateDefinedElements = deps => {
|
|
|
364
364
|
|
|
365
365
|
if (element.sourceType === 'BUNDLED WITH') {
|
|
366
366
|
element.group = null
|
|
367
|
-
element.
|
|
367
|
+
element.productionDependency = true
|
|
368
368
|
|
|
369
369
|
delete element.sourceType
|
|
370
370
|
delete element.remote
|
package/src/scan/help.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const commandLineUsage = require('command-line-usage')
|
|
2
2
|
const i18n = require('i18n')
|
|
3
|
-
const constants = require('../
|
|
3
|
+
const constants = require('../cliConstants')
|
|
4
4
|
const { commonHelpLinks } = require('../common/commonHelp')
|
|
5
5
|
|
|
6
6
|
const scanUsageGuide = commandLineUsage([
|
package/src/scan/scanConfig.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const paramHandler = require('../utils/paramsUtil/paramHandler')
|
|
2
|
-
const constants = require('../
|
|
2
|
+
const constants = require('../cliConstants.js')
|
|
3
3
|
const path = require('path')
|
|
4
4
|
const { supportedLanguagesScan } = require('../constants/constants')
|
|
5
5
|
const i18n = require('i18n')
|