@contrast/contrast 1.0.8 → 1.0.9
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/getProjectRootFilenames.js +3 -12
- package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +88 -53
- package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +4 -3
- package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +58 -11
- package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +38 -5
- package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
- package/dist/audit/save.js +21 -13
- package/dist/commands/audit/auditConfig.js +0 -16
- package/dist/commands/audit/auditController.js +1 -10
- package/dist/commands/audit/help.js +7 -24
- package/dist/commands/audit/processAudit.js +1 -7
- package/dist/commands/audit/saveFile.js +2 -2
- package/dist/commands/scan/sca/scaAnalysis.js +22 -9
- package/dist/common/HTTPClient.js +8 -8
- package/dist/constants/constants.js +7 -2
- package/dist/constants/locales.js +24 -30
- package/dist/constants.js +11 -9
- package/dist/index.js +54 -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/treeUpload.js +4 -5
- package/dist/scaAnalysis/dotnet/analysis.js +43 -0
- package/dist/scaAnalysis/dotnet/index.js +10 -0
- package/dist/scaAnalysis/javascript/analysis.js +4 -7
- package/dist/scaAnalysis/javascript/index.js +14 -5
- package/dist/scaAnalysis/php/analysis.js +14 -33
- package/dist/scaAnalysis/php/index.js +11 -4
- package/dist/scaAnalysis/ruby/analysis.js +2 -10
- package/dist/scan/autoDetection.js +18 -21
- package/dist/scan/fileUtils.js +31 -12
- package/dist/scan/formatScanOutput.js +3 -3
- package/dist/scan/scanConfig.js +2 -2
- package/dist/utils/getConfig.js +1 -6
- package/package.json +2 -3
- package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +3 -32
- package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +128 -68
- package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
- package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +41 -19
- package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +43 -4
- package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
- package/src/audit/save.js +32 -16
- package/src/commands/audit/auditConfig.ts +0 -25
- package/src/commands/audit/auditController.ts +0 -11
- package/src/commands/audit/help.ts +7 -24
- package/src/commands/audit/processAudit.ts +1 -7
- package/src/commands/audit/saveFile.ts +2 -2
- package/src/commands/scan/processScan.js +0 -1
- package/src/commands/scan/sca/scaAnalysis.js +28 -13
- package/src/common/HTTPClient.js +9 -9
- package/src/constants/constants.js +9 -3
- package/src/constants/locales.js +47 -35
- package/src/constants.js +12 -10
- package/src/index.ts +76 -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/treeUpload.js +4 -5
- package/src/scaAnalysis/dotnet/analysis.js +54 -0
- package/src/scaAnalysis/dotnet/index.js +11 -0
- package/src/scaAnalysis/javascript/analysis.js +6 -7
- package/src/scaAnalysis/javascript/index.js +23 -7
- package/src/scaAnalysis/php/analysis.js +15 -35
- package/src/scaAnalysis/php/index.js +15 -4
- package/src/scaAnalysis/ruby/analysis.js +2 -11
- package/src/scan/autoDetection.js +18 -24
- package/src/scan/fileUtils.js +33 -12
- package/src/scan/formatScanOutput.ts +3 -3
- package/src/scan/scanConfig.js +2 -4
- 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 -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
package/src/sbom/generateSbom.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { getHttpClient } from '../utils/commonApi'
|
|
2
2
|
|
|
3
|
-
export const generateSbom = (config: any) => {
|
|
3
|
+
export const generateSbom = (config: any, type: string) => {
|
|
4
4
|
const client = getHttpClient(config)
|
|
5
5
|
return client
|
|
6
|
-
.getSbom(config)
|
|
6
|
+
.getSbom(config, type)
|
|
7
7
|
.then((res: { statusCode: number; body: any }) => {
|
|
8
8
|
if (res.statusCode === 200) {
|
|
9
9
|
return res.body
|
|
@@ -50,11 +50,18 @@ const createPhpTSMessage = phpTree => {
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
const createDotNetTSMessage = dotnetTree => {
|
|
54
|
+
return {
|
|
55
|
+
dotnet: dotnetTree
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
53
59
|
module.exports = {
|
|
54
60
|
createJavaScriptTSMessage,
|
|
55
61
|
createJavaTSMessage,
|
|
56
62
|
createGoTSMessage,
|
|
57
63
|
createPhpTSMessage,
|
|
58
64
|
createRubyTSMessage,
|
|
59
|
-
createPythonTSMessage
|
|
65
|
+
createPythonTSMessage,
|
|
66
|
+
createDotNetTSMessage
|
|
60
67
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
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) => {
|
|
@@ -8,19 +8,18 @@ const commonSendSnapShot = async (analysis, config) => {
|
|
|
8
8
|
snapshot: analysis
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
const client = getHttpClient(config)
|
|
11
|
+
const client = commonApi.getHttpClient(config)
|
|
12
12
|
return client
|
|
13
13
|
.sendSnapshot(requestBody, config)
|
|
14
14
|
.then(res => {
|
|
15
15
|
if (res.statusCode === 201) {
|
|
16
16
|
return res.body
|
|
17
17
|
} else {
|
|
18
|
-
|
|
19
|
-
console.log('error processing dependencies')
|
|
18
|
+
throw new Error(res.statusCode + ` error processing dependencies`)
|
|
20
19
|
}
|
|
21
20
|
})
|
|
22
21
|
.catch(err => {
|
|
23
|
-
|
|
22
|
+
throw err
|
|
24
23
|
})
|
|
25
24
|
}
|
|
26
25
|
|
|
@@ -0,0 +1,54 @@
|
|
|
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 getDotNetDeps = (filePath, languageFiles) => {
|
|
44
|
+
const projectFile = readAndParseProjectFile(filePath + `/${languageFiles[0]}`)
|
|
45
|
+
const lockFile = readAndParseLockFile(filePath + `/${languageFiles[1]}`)
|
|
46
|
+
|
|
47
|
+
return { projectFile, lockFile }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
module.exports = {
|
|
51
|
+
getDotNetDeps,
|
|
52
|
+
readAndParseProjectFile,
|
|
53
|
+
readAndParseLockFile
|
|
54
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -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,13 +3,8 @@ const i18n = require('i18n')
|
|
|
3
3
|
const formatMessage = require('../common/formatMessage')
|
|
4
4
|
|
|
5
5
|
const jsAnalysis = async (config, languageFiles) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
languageFiles.JAVASCRIPT.includes('yarn.lock')
|
|
9
|
-
) {
|
|
10
|
-
console.log(i18n.__('languageAnalysisMultipleLanguages1'))
|
|
11
|
-
return
|
|
12
|
-
}
|
|
6
|
+
checkForCorrectFiles(languageFiles)
|
|
7
|
+
|
|
13
8
|
return buildNodeTree(config, languageFiles.JAVASCRIPT)
|
|
14
9
|
}
|
|
15
10
|
const buildNodeTree = async (config, files) => {
|
|
@@ -51,6 +46,27 @@ const parseFiles = async (config, files, js) => {
|
|
|
51
46
|
return js
|
|
52
47
|
}
|
|
53
48
|
|
|
49
|
+
const checkForCorrectFiles = languageFiles => {
|
|
50
|
+
if (
|
|
51
|
+
languageFiles.JAVASCRIPT.includes('package-lock.json') &&
|
|
52
|
+
languageFiles.JAVASCRIPT.includes('yarn.lock')
|
|
53
|
+
) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
i18n.__('languageAnalysisHasMultipleLockFiles', 'javascript')
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (
|
|
60
|
+
!languageFiles.JAVASCRIPT.includes('package-lock.json') &&
|
|
61
|
+
!languageFiles.JAVASCRIPT.includes('yarn.lock')
|
|
62
|
+
) {
|
|
63
|
+
throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'javascript'))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!languageFiles.JAVASCRIPT.includes('package.json')) {
|
|
67
|
+
throw new Error(i18n.__('languageAnalysisHasNoPackageJsonFile'))
|
|
68
|
+
}
|
|
69
|
+
}
|
|
54
70
|
module.exports = {
|
|
55
71
|
jsAnalysis
|
|
56
72
|
}
|
|
@@ -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,8 +1,7 @@
|
|
|
1
1
|
const fs = require('fs')
|
|
2
2
|
|
|
3
3
|
const readAndParseGemfile = file => {
|
|
4
|
-
const
|
|
5
|
-
const gemFile = fs.readFileSync(fileName, 'utf8')
|
|
4
|
+
const gemFile = fs.readFileSync(file + '/Gemfile', 'utf8')
|
|
6
5
|
const rubyArray = gemFile.split('\n')
|
|
7
6
|
|
|
8
7
|
let filteredRubyDep = rubyArray.filter(element => {
|
|
@@ -21,8 +20,7 @@ const readAndParseGemfile = file => {
|
|
|
21
20
|
}
|
|
22
21
|
|
|
23
22
|
const readAndParseGemLockFile = file => {
|
|
24
|
-
const
|
|
25
|
-
const lockFile = fs.readFileSync(fileName, 'utf8')
|
|
23
|
+
const lockFile = fs.readFileSync(file + '/Gemfile.lock', 'utf8')
|
|
26
24
|
const dependencyRegEx = /^\s*([A-Za-z0-9.!@#$%\-^&*_+]*)\s*(\((.*?)\))/
|
|
27
25
|
|
|
28
26
|
const lines = lockFile.split('\n')
|
|
@@ -259,13 +257,6 @@ const trimWhiteSpace = string => {
|
|
|
259
257
|
return string.replace(/\s+/g, '')
|
|
260
258
|
}
|
|
261
259
|
|
|
262
|
-
const filePathForWindows = path => {
|
|
263
|
-
if (process.platform === 'win32') {
|
|
264
|
-
path = path.replace(/\//g, '\\')
|
|
265
|
-
}
|
|
266
|
-
return path
|
|
267
|
-
}
|
|
268
|
-
|
|
269
260
|
module.exports = {
|
|
270
261
|
getRubyDeps,
|
|
271
262
|
readAndParseGemfile,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
const i18n = require('i18n')
|
|
2
2
|
const fileFinder = require('./fileUtils')
|
|
3
|
-
const languageResolver = require('../audit/languageAnalysisEngine/reduceIdentifiedLanguages')
|
|
4
3
|
const rootFile = require('../audit/languageAnalysisEngine/getProjectRootFilenames')
|
|
5
4
|
|
|
6
5
|
const autoDetectFileAndLanguage = async configToUse => {
|
|
@@ -28,18 +27,26 @@ const autoDetectFileAndLanguage = async configToUse => {
|
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
29
|
|
|
31
|
-
const autoDetectAuditFilesAndLanguages = async
|
|
30
|
+
const autoDetectAuditFilesAndLanguages = async file => {
|
|
31
|
+
const filePath = file
|
|
32
32
|
let languagesFound = []
|
|
33
|
-
console.log(i18n.__('searchingAuditFileDirectory', process.cwd()))
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
if (filePath) {
|
|
35
|
+
rootFile.getProjectRootFilenames(filePath)
|
|
36
|
+
console.log(i18n.__('searchingAuditFileDirectory', filePath))
|
|
37
|
+
} else {
|
|
38
|
+
console.log(i18n.__('searchingAuditFileDirectory', process.cwd()))
|
|
39
|
+
}
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
await fileFinder.findFilesJava(languagesFound, filePath)
|
|
42
|
+
await fileFinder.findFilesJavascript(languagesFound, filePath)
|
|
43
|
+
await fileFinder.findFilesPython(languagesFound, filePath)
|
|
44
|
+
await fileFinder.findFilesGo(languagesFound, filePath)
|
|
45
|
+
await fileFinder.findFilesPhp(languagesFound, filePath)
|
|
46
|
+
await fileFinder.findFilesRuby(languagesFound, filePath)
|
|
47
|
+
await fileFinder.findFilesDotNet(languagesFound, filePath)
|
|
48
|
+
|
|
49
|
+
if (languagesFound.length <= 1) {
|
|
43
50
|
return languagesFound
|
|
44
51
|
} else {
|
|
45
52
|
console.log(
|
|
@@ -48,18 +55,6 @@ const autoDetectAuditFilesAndLanguages = async () => {
|
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
|
|
51
|
-
const manualDetectAuditFilesAndLanguages = file => {
|
|
52
|
-
let projectRootFilenames = rootFile.getProjectRootFilenames(file)
|
|
53
|
-
let identifiedLanguages =
|
|
54
|
-
languageResolver.deduceLanguageScaAnalysis(projectRootFilenames)
|
|
55
|
-
|
|
56
|
-
if (Object.keys(identifiedLanguages).length === 0) {
|
|
57
|
-
console.log(i18n.__('languageAnalysisNoLanguage', file))
|
|
58
|
-
return []
|
|
59
|
-
}
|
|
60
|
-
return [identifiedLanguages]
|
|
61
|
-
}
|
|
62
|
-
|
|
63
58
|
const hasWhiteSpace = s => {
|
|
64
59
|
const filename = s.split('/').pop()
|
|
65
60
|
return filename.indexOf(' ') >= 0
|
|
@@ -100,6 +95,5 @@ module.exports = {
|
|
|
100
95
|
autoDetectFileAndLanguage,
|
|
101
96
|
errorOnFileDetection,
|
|
102
97
|
autoDetectAuditFilesAndLanguages,
|
|
103
|
-
errorOnAuditFileDetection
|
|
104
|
-
manualDetectAuditFilesAndLanguages
|
|
98
|
+
errorOnAuditFileDetection
|
|
105
99
|
}
|
package/src/scan/fileUtils.js
CHANGED
|
@@ -11,13 +11,14 @@ const findFile = async () => {
|
|
|
11
11
|
})
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const findFilesJava = async languagesFound => {
|
|
14
|
+
const findFilesJava = async (languagesFound, filePath) => {
|
|
15
15
|
const result = await fg(
|
|
16
16
|
['**/pom.xml', '**/build.gradle', '**/build.gradle.kts'],
|
|
17
17
|
{
|
|
18
18
|
dot: false,
|
|
19
19
|
deep: 1,
|
|
20
|
-
onlyFiles: true
|
|
20
|
+
onlyFiles: true,
|
|
21
|
+
cwd: filePath ? filePath : process.cwd()
|
|
21
22
|
}
|
|
22
23
|
)
|
|
23
24
|
|
|
@@ -27,13 +28,14 @@ const findFilesJava = async languagesFound => {
|
|
|
27
28
|
return languagesFound
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
const findFilesJavascript = async languagesFound => {
|
|
31
|
+
const findFilesJavascript = async (languagesFound, filePath) => {
|
|
31
32
|
const result = await fg(
|
|
32
33
|
['**/package.json', '**/yarn.lock', '**/package-lock.json'],
|
|
33
34
|
{
|
|
34
35
|
dot: false,
|
|
35
36
|
deep: 1,
|
|
36
|
-
onlyFiles: true
|
|
37
|
+
onlyFiles: true,
|
|
38
|
+
cwd: filePath ? filePath : process.cwd()
|
|
37
39
|
}
|
|
38
40
|
)
|
|
39
41
|
|
|
@@ -43,11 +45,12 @@ const findFilesJavascript = async languagesFound => {
|
|
|
43
45
|
return languagesFound
|
|
44
46
|
}
|
|
45
47
|
|
|
46
|
-
const findFilesPython = async languagesFound => {
|
|
48
|
+
const findFilesPython = async (languagesFound, filePath) => {
|
|
47
49
|
const result = await fg(['**/Pipfile.lock', '**/Pipfile'], {
|
|
48
50
|
dot: false,
|
|
49
51
|
deep: 3,
|
|
50
|
-
onlyFiles: true
|
|
52
|
+
onlyFiles: true,
|
|
53
|
+
cwd: filePath ? filePath : process.cwd()
|
|
51
54
|
})
|
|
52
55
|
|
|
53
56
|
if (result.length > 0) {
|
|
@@ -56,11 +59,12 @@ const findFilesPython = async languagesFound => {
|
|
|
56
59
|
return languagesFound
|
|
57
60
|
}
|
|
58
61
|
|
|
59
|
-
const findFilesGo = async languagesFound => {
|
|
62
|
+
const findFilesGo = async (languagesFound, filePath) => {
|
|
60
63
|
const result = await fg(['**/go.mod'], {
|
|
61
64
|
dot: false,
|
|
62
65
|
deep: 3,
|
|
63
|
-
onlyFiles: true
|
|
66
|
+
onlyFiles: true,
|
|
67
|
+
cwd: filePath ? filePath : process.cwd()
|
|
64
68
|
})
|
|
65
69
|
|
|
66
70
|
if (result.length > 0) {
|
|
@@ -69,11 +73,12 @@ const findFilesGo = async languagesFound => {
|
|
|
69
73
|
return languagesFound
|
|
70
74
|
}
|
|
71
75
|
|
|
72
|
-
const findFilesRuby = async languagesFound => {
|
|
76
|
+
const findFilesRuby = async (languagesFound, filePath) => {
|
|
73
77
|
const result = await fg(['**/Gemfile', '**/Gemfile.lock'], {
|
|
74
78
|
dot: false,
|
|
75
79
|
deep: 3,
|
|
76
|
-
onlyFiles: true
|
|
80
|
+
onlyFiles: true,
|
|
81
|
+
cwd: filePath ? filePath : process.cwd()
|
|
77
82
|
})
|
|
78
83
|
|
|
79
84
|
if (result.length > 0) {
|
|
@@ -82,11 +87,12 @@ const findFilesRuby = async languagesFound => {
|
|
|
82
87
|
return languagesFound
|
|
83
88
|
}
|
|
84
89
|
|
|
85
|
-
const findFilesPhp = async languagesFound => {
|
|
90
|
+
const findFilesPhp = async (languagesFound, filePath) => {
|
|
86
91
|
const result = await fg(['**/composer.json', '**/composer.lock'], {
|
|
87
92
|
dot: false,
|
|
88
93
|
deep: 3,
|
|
89
|
-
onlyFiles: true
|
|
94
|
+
onlyFiles: true,
|
|
95
|
+
cwd: filePath ? filePath : process.cwd()
|
|
90
96
|
})
|
|
91
97
|
|
|
92
98
|
if (result.length > 0) {
|
|
@@ -95,6 +101,20 @@ const findFilesPhp = async languagesFound => {
|
|
|
95
101
|
return languagesFound
|
|
96
102
|
}
|
|
97
103
|
|
|
104
|
+
const findFilesDotNet = async (languagesFound, filePath) => {
|
|
105
|
+
const result = await fg(['**/*.csproj', '**/packages.lock.json'], {
|
|
106
|
+
dot: false,
|
|
107
|
+
deep: 3,
|
|
108
|
+
onlyFiles: true,
|
|
109
|
+
cwd: filePath ? filePath : process.cwd()
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
if (result.length > 0) {
|
|
113
|
+
return languagesFound.push({ DOTNET: result })
|
|
114
|
+
}
|
|
115
|
+
return languagesFound
|
|
116
|
+
}
|
|
117
|
+
|
|
98
118
|
const checkFilePermissions = file => {
|
|
99
119
|
let readableFile = false
|
|
100
120
|
try {
|
|
@@ -138,5 +158,6 @@ module.exports = {
|
|
|
138
158
|
findFilesGo,
|
|
139
159
|
findFilesPhp,
|
|
140
160
|
findFilesRuby,
|
|
161
|
+
findFilesDotNet,
|
|
141
162
|
fileIsEmpty
|
|
142
163
|
}
|
|
@@ -34,8 +34,9 @@ export function formatScanOutput(scanResults: ScanResultsModel) {
|
|
|
34
34
|
|
|
35
35
|
let defaultView = getDefaultView(scanResultsInstances.content)
|
|
36
36
|
|
|
37
|
-
let count =
|
|
37
|
+
let count = 0
|
|
38
38
|
defaultView.forEach(entry => {
|
|
39
|
+
count++
|
|
39
40
|
let table = new Table({
|
|
40
41
|
chars: {
|
|
41
42
|
top: '',
|
|
@@ -98,7 +99,6 @@ export function formatScanOutput(scanResults: ScanResultsModel) {
|
|
|
98
99
|
]
|
|
99
100
|
table.push(learnRow)
|
|
100
101
|
}
|
|
101
|
-
count--
|
|
102
102
|
console.log(table.toString())
|
|
103
103
|
console.log()
|
|
104
104
|
})
|
|
@@ -179,7 +179,7 @@ export function getDefaultView(content: ResultContent[]) {
|
|
|
179
179
|
assignBySeverity(resultEntry, groupResultsObj)
|
|
180
180
|
})
|
|
181
181
|
|
|
182
|
-
return sortBy(groupTypeResults, ['priority'])
|
|
182
|
+
return sortBy(groupTypeResults, ['priority'])
|
|
183
183
|
}
|
|
184
184
|
export function editVulName(message: string) {
|
|
185
185
|
return message.substring(message.indexOf(' in '))
|
package/src/scan/scanConfig.js
CHANGED
|
@@ -2,9 +2,7 @@ const paramHandler = require('../utils/paramsUtil/paramHandler')
|
|
|
2
2
|
const constants = require('../../src/constants.js')
|
|
3
3
|
const parsedCLIOptions = require('../../src/utils/parsedCLIOptions')
|
|
4
4
|
const path = require('path')
|
|
5
|
-
const {
|
|
6
|
-
supportedLanguages
|
|
7
|
-
} = require('../audit/languageAnalysisEngine/constants')
|
|
5
|
+
const { supportedLanguagesScan } = require('../constants/constants')
|
|
8
6
|
const i18n = require('i18n')
|
|
9
7
|
const { scanUsageGuide } = require('./help')
|
|
10
8
|
|
|
@@ -23,7 +21,7 @@ const getScanConfig = argv => {
|
|
|
23
21
|
|
|
24
22
|
if (scanParams.language) {
|
|
25
23
|
scanParams.language = scanParams.language.toUpperCase()
|
|
26
|
-
if (!Object.values(
|
|
24
|
+
if (!Object.values(supportedLanguagesScan).includes(scanParams.language)) {
|
|
27
25
|
console.log(`Did not recognise --language ${scanParams.language}`)
|
|
28
26
|
console.log(i18n.__('constantsHowToRunDev3'))
|
|
29
27
|
process.exit(1)
|
package/src/utils/getConfig.ts
CHANGED
|
@@ -33,11 +33,6 @@ const localConfig = (name: string, version: string) => {
|
|
|
33
33
|
return config
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
const createConfigFromYaml = (yamlPath: string) => {
|
|
37
|
-
const yamlConfig = {}
|
|
38
|
-
return yamlConfig
|
|
39
|
-
}
|
|
40
|
-
|
|
41
36
|
const setConfigValues = (config: ContrastConf, values: ContrastConfOptions) => {
|
|
42
37
|
config.set('apiKey', values.apiKey)
|
|
43
38
|
config.set('organizationId', values.orgId)
|
|
@@ -45,10 +40,4 @@ const setConfigValues = (config: ContrastConf, values: ContrastConfOptions) => {
|
|
|
45
40
|
values.host ? config.set('host', values.host) : null
|
|
46
41
|
}
|
|
47
42
|
|
|
48
|
-
export {
|
|
49
|
-
localConfig,
|
|
50
|
-
createConfigFromYaml,
|
|
51
|
-
setConfigValues,
|
|
52
|
-
ContrastConf,
|
|
53
|
-
ContrastConfOptions
|
|
54
|
-
}
|
|
43
|
+
export { localConfig, setConfigValues, ContrastConf, ContrastConfOptions }
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
class AnalysisEngine {
|
|
3
|
-
constructor(initAnalysis = {}) {
|
|
4
|
-
this.analyzers = [];
|
|
5
|
-
this.analysis = { ...initAnalysis };
|
|
6
|
-
}
|
|
7
|
-
use(analyzer) {
|
|
8
|
-
if (Array.isArray(analyzer)) {
|
|
9
|
-
this.analyzers = [...this.analyzers, ...analyzer];
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
this.analyzers.push(analyzer);
|
|
13
|
-
}
|
|
14
|
-
analyze(callback, config) {
|
|
15
|
-
let i = 0;
|
|
16
|
-
const next = err => {
|
|
17
|
-
if (err) {
|
|
18
|
-
return setImmediate(() => callback(err, this.analysis));
|
|
19
|
-
}
|
|
20
|
-
if (i >= this.analyzers.length) {
|
|
21
|
-
return setImmediate(() => callback(null, this.analysis));
|
|
22
|
-
}
|
|
23
|
-
const analyzer = this.analyzers[i];
|
|
24
|
-
i++;
|
|
25
|
-
setImmediate(() => {
|
|
26
|
-
try {
|
|
27
|
-
analyzer(this.analysis, next, config);
|
|
28
|
-
}
|
|
29
|
-
catch (uncaughtErr) {
|
|
30
|
-
next(uncaughtErr);
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
next();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
module.exports = exports = AnalysisEngine;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.determineProjectLanguage = exports.identifyLanguages = void 0;
|
|
7
|
-
const i18n_1 = __importDefault(require("i18n"));
|
|
8
|
-
const reduceIdentifiedLanguages_1 = require("../languageAnalysisEngine/reduceIdentifiedLanguages");
|
|
9
|
-
const getProjectRootFilenames_1 = require("../languageAnalysisEngine/getProjectRootFilenames");
|
|
10
|
-
function identifyLanguages(config) {
|
|
11
|
-
const { file } = config;
|
|
12
|
-
const projectRootFilenames = (0, getProjectRootFilenames_1.getProjectRootFilenames)(file);
|
|
13
|
-
const identifiedLanguages = projectRootFilenames.reduce((accumulator, filename) => {
|
|
14
|
-
const deducedLanguages = (0, reduceIdentifiedLanguages_1.deduceLanguage)(filename);
|
|
15
|
-
return [...accumulator, ...deducedLanguages];
|
|
16
|
-
}, []);
|
|
17
|
-
if (Object.keys(identifiedLanguages).length === 0) {
|
|
18
|
-
throw new Error(i18n_1.default.__('languageAnalysisNoLanguage', file));
|
|
19
|
-
}
|
|
20
|
-
return (0, reduceIdentifiedLanguages_1.reduceIdentifiedLanguages)(identifiedLanguages);
|
|
21
|
-
}
|
|
22
|
-
exports.identifyLanguages = identifyLanguages;
|
|
23
|
-
function determineProjectLanguage(reducedLanguages) {
|
|
24
|
-
const reducedLanguagesKeys = Object.keys(reducedLanguages);
|
|
25
|
-
if (reducedLanguagesKeys.length === 1) {
|
|
26
|
-
return reducedLanguagesKeys[0];
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
throw new Error('Detected multiple languages. Please specify a single language using --language');
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
exports.determineProjectLanguage = determineProjectLanguage;
|