@contrast/contrast 1.0.12 → 1.0.13
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/commands/audit/processAudit.js +10 -0
- package/dist/commands/scan/processScan.js +9 -0
- package/dist/commands/scan/sca/scaAnalysis.js +3 -0
- package/dist/common/HTTPClient.js +30 -2
- package/dist/common/fail.js +7 -3
- package/dist/common/versionChecker.js +11 -5
- package/dist/constants/constants.js +1 -1
- package/dist/constants/locales.js +2 -2
- package/dist/index.js +1 -1
- package/dist/lambda/lambda.js +7 -0
- package/dist/scaAnalysis/common/scaServicesUpload.js +52 -0
- package/dist/scaAnalysis/javascript/index.js +4 -0
- package/dist/scaAnalysis/javascript/scaServiceParser.js +109 -0
- package/dist/scaAnalysis/ruby/analysis.js +106 -9
- package/dist/scaAnalysis/ruby/index.js +6 -1
- package/dist/scan/scanResults.js +1 -1
- package/dist/{audit/languageAnalysisEngine/util → utils}/capabilities.js +0 -0
- package/dist/{audit/languageAnalysisEngine/util → utils}/generalAPI.js +14 -5
- package/package.json +1 -1
- package/src/commands/audit/processAudit.ts +8 -0
- package/src/commands/scan/processScan.js +14 -0
- package/src/commands/scan/sca/scaAnalysis.js +10 -0
- package/src/common/HTTPClient.js +44 -2
- package/src/common/fail.js +7 -3
- package/src/common/versionChecker.ts +16 -6
- package/src/constants/constants.js +1 -1
- package/src/constants/locales.js +2 -3
- package/src/index.ts +1 -2
- package/src/lambda/lambda.ts +12 -0
- package/src/scaAnalysis/common/scaServicesUpload.js +54 -0
- package/src/scaAnalysis/javascript/index.js +4 -0
- package/src/scaAnalysis/javascript/scaServiceParser.js +145 -0
- package/src/scaAnalysis/ruby/analysis.js +137 -9
- package/src/scaAnalysis/ruby/index.js +6 -1
- package/src/scan/scanResults.js +1 -1
- package/src/{audit/languageAnalysisEngine/util → utils}/capabilities.js +0 -0
- package/src/{audit/languageAnalysisEngine/util → utils}/generalAPI.js +16 -6
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
const fs = require('fs')
|
|
2
2
|
const i18n = require('i18n')
|
|
3
3
|
|
|
4
|
+
const getRubyDeps = (config, languageFiles) => {
|
|
5
|
+
try {
|
|
6
|
+
checkForCorrectFiles(languageFiles)
|
|
7
|
+
const parsedGem = readAndParseGemfile(config.file)
|
|
8
|
+
const parsedLock = readAndParseGemLockFile(config.file)
|
|
9
|
+
if (config.experimental) {
|
|
10
|
+
const rubyArray = removeRedundantAndPopulateDefinedElements(
|
|
11
|
+
parsedLock.sources
|
|
12
|
+
)
|
|
13
|
+
let rubyTree = createRubyTree(rubyArray)
|
|
14
|
+
findChildrenDependencies(rubyTree)
|
|
15
|
+
processRootDependencies(parsedLock.dependencies, rubyTree)
|
|
16
|
+
return rubyTree
|
|
17
|
+
} else {
|
|
18
|
+
return { gemfilesDependanceies: parsedGem, gemfileLock: parsedLock }
|
|
19
|
+
}
|
|
20
|
+
} catch (err) {
|
|
21
|
+
throw err
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
4
25
|
const readAndParseGemfile = file => {
|
|
5
26
|
const gemFile = fs.readFileSync(file + '/Gemfile', 'utf8')
|
|
6
27
|
const rubyArray = gemFile.split('\n')
|
|
@@ -242,16 +263,119 @@ const buildSourceDependencyWithVersion = (
|
|
|
242
263
|
return dependencies
|
|
243
264
|
}
|
|
244
265
|
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
const parsedGem = readAndParseGemfile(config.file)
|
|
249
|
-
const parsedLock = readAndParseGemLockFile(config.file)
|
|
266
|
+
const processRootDependencies = (rootDependencies, rubyTree) => {
|
|
267
|
+
const getParentObjectByName = queryToken =>
|
|
268
|
+
Object.values(rubyTree).filter(({ name }) => name === queryToken)
|
|
250
269
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
270
|
+
for (let parent in rootDependencies) {
|
|
271
|
+
let parentObject = getParentObjectByName(parent)
|
|
272
|
+
|
|
273
|
+
// ignore root dependencies that don't have a resolved version
|
|
274
|
+
if (parentObject[0]) {
|
|
275
|
+
let gav =
|
|
276
|
+
parentObject[0].group +
|
|
277
|
+
'/' +
|
|
278
|
+
parentObject[0].name +
|
|
279
|
+
'@' +
|
|
280
|
+
parentObject[0].version
|
|
281
|
+
|
|
282
|
+
rubyTree[gav] = parentObject[0]
|
|
283
|
+
rubyTree[gav].directDependency = true
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return rubyTree
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const createRubyTree = rubyArray => {
|
|
290
|
+
let rubyTree = {}
|
|
291
|
+
for (let x in rubyArray) {
|
|
292
|
+
let version = rubyArray[x].resolved
|
|
293
|
+
|
|
294
|
+
let gav = rubyArray[x].group + '/' + rubyArray[x].name + '@' + version
|
|
295
|
+
rubyTree[gav] = rubyArray[x]
|
|
296
|
+
rubyTree[gav].directDependency = false
|
|
297
|
+
rubyTree[gav].version = version
|
|
298
|
+
|
|
299
|
+
// add dependency array if none exists
|
|
300
|
+
if (!rubyTree[gav].dependencies) {
|
|
301
|
+
rubyTree[gav].dependencies = []
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
delete rubyTree[gav].resolved
|
|
305
|
+
}
|
|
306
|
+
return rubyTree
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const findChildrenDependencies = rubyTree => {
|
|
310
|
+
for (let dep in rubyTree) {
|
|
311
|
+
let unResolvedChildDepsKey = Object.keys(rubyTree[dep].dependencies)
|
|
312
|
+
rubyTree[dep].dependencies = resolveVersionOfChildDependencies(
|
|
313
|
+
unResolvedChildDepsKey,
|
|
314
|
+
rubyTree
|
|
315
|
+
)
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const resolveVersionOfChildDependencies = (
|
|
320
|
+
unResolvedChildDepsKey,
|
|
321
|
+
rubyObject
|
|
322
|
+
) => {
|
|
323
|
+
const getParentObjectByName = queryToken =>
|
|
324
|
+
Object.values(rubyObject).filter(({ name }) => name === queryToken)
|
|
325
|
+
let resolvedChildrenDependencies = []
|
|
326
|
+
for (let childDep in unResolvedChildDepsKey) {
|
|
327
|
+
let childDependencyName = unResolvedChildDepsKey[childDep]
|
|
328
|
+
let parent = getParentObjectByName(childDependencyName)
|
|
329
|
+
resolvedChildrenDependencies.push(
|
|
330
|
+
'null/' + childDependencyName + '@' + parent[0].version
|
|
331
|
+
)
|
|
254
332
|
}
|
|
333
|
+
return resolvedChildrenDependencies
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const removeRedundantAndPopulateDefinedElements = deps => {
|
|
337
|
+
return deps.map(element => {
|
|
338
|
+
if (element.sourceType === 'GIT') {
|
|
339
|
+
delete element.sourceType
|
|
340
|
+
delete element.remote
|
|
341
|
+
delete element.platform
|
|
342
|
+
|
|
343
|
+
element.group = null
|
|
344
|
+
element.isProduction = true
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (element.sourceType === 'GEM') {
|
|
348
|
+
element.group = null
|
|
349
|
+
element.isProduction = true
|
|
350
|
+
|
|
351
|
+
delete element.sourceType
|
|
352
|
+
delete element.remote
|
|
353
|
+
delete element.platform
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (element.sourceType === 'PATH') {
|
|
357
|
+
element.group = null
|
|
358
|
+
element.isProduction = true
|
|
359
|
+
|
|
360
|
+
delete element.platform
|
|
361
|
+
delete element.sourceType
|
|
362
|
+
delete element.remote
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (element.sourceType === 'BUNDLED WITH') {
|
|
366
|
+
element.group = null
|
|
367
|
+
element.isProduction = true
|
|
368
|
+
|
|
369
|
+
delete element.sourceType
|
|
370
|
+
delete element.remote
|
|
371
|
+
delete element.branch
|
|
372
|
+
delete element.revision
|
|
373
|
+
delete element.depthLevel
|
|
374
|
+
delete element.specs
|
|
375
|
+
delete element.platform
|
|
376
|
+
}
|
|
377
|
+
return element
|
|
378
|
+
})
|
|
255
379
|
}
|
|
256
380
|
|
|
257
381
|
const checkForCorrectFiles = languageFiles => {
|
|
@@ -281,5 +405,9 @@ module.exports = {
|
|
|
281
405
|
getPatchLevel,
|
|
282
406
|
formatSourceArr,
|
|
283
407
|
getSourceArray,
|
|
284
|
-
checkForCorrectFiles
|
|
408
|
+
checkForCorrectFiles,
|
|
409
|
+
removeRedundantAndPopulateDefinedElements,
|
|
410
|
+
createRubyTree,
|
|
411
|
+
findChildrenDependencies,
|
|
412
|
+
processRootDependencies
|
|
285
413
|
}
|
|
@@ -3,7 +3,12 @@ const { createRubyTSMessage } = require('../common/formatMessage')
|
|
|
3
3
|
|
|
4
4
|
const rubyAnalysis = (config, languageFiles) => {
|
|
5
5
|
const rubyDeps = analysis.getRubyDeps(config, languageFiles.RUBY)
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
if (config.experimental) {
|
|
8
|
+
return rubyDeps
|
|
9
|
+
} else {
|
|
10
|
+
return createRubyTSMessage(rubyDeps)
|
|
11
|
+
}
|
|
7
12
|
}
|
|
8
13
|
|
|
9
14
|
module.exports = {
|
package/src/scan/scanResults.js
CHANGED
|
@@ -94,7 +94,7 @@ const returnScanResults = async (
|
|
|
94
94
|
)
|
|
95
95
|
|
|
96
96
|
const isCI = process.env.CONTRAST_CODESEC_CI
|
|
97
|
-
? JSON.parse(process.env.CONTRAST_CODESEC_CI)
|
|
97
|
+
? JSON.parse(process.env.CONTRAST_CODESEC_CI.toLowerCase())
|
|
98
98
|
: false
|
|
99
99
|
if (!isCI) {
|
|
100
100
|
const retry = await retryScanPrompt()
|
|
File without changes
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
const { featuresTeamServer } = require('./capabilities')
|
|
2
2
|
const semver = require('semver')
|
|
3
|
-
const { handleResponseErrors } = require('
|
|
4
|
-
const
|
|
3
|
+
const { handleResponseErrors } = require('../common/errorHandling')
|
|
4
|
+
const commonApi = require('./commonApi')
|
|
5
|
+
const { isNil } = require('lodash')
|
|
5
6
|
|
|
6
7
|
const getGlobalProperties = async config => {
|
|
7
|
-
const client = getHttpClient(config)
|
|
8
|
-
|
|
8
|
+
const client = commonApi.getHttpClient(config)
|
|
9
9
|
return client
|
|
10
|
-
.getGlobalProperties(config)
|
|
10
|
+
.getGlobalProperties(config.host)
|
|
11
11
|
.then(res => {
|
|
12
12
|
if (res.statusCode === 200) {
|
|
13
13
|
return res.body
|
|
@@ -20,6 +20,15 @@ const getGlobalProperties = async config => {
|
|
|
20
20
|
})
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
const getMode = async config => {
|
|
24
|
+
const features = await getGlobalProperties(config)
|
|
25
|
+
|
|
26
|
+
if (!isNil(features?.mode)) {
|
|
27
|
+
return features.mode
|
|
28
|
+
}
|
|
29
|
+
return ''
|
|
30
|
+
}
|
|
31
|
+
|
|
23
32
|
const getFeatures = version => {
|
|
24
33
|
const featuresEnabled = []
|
|
25
34
|
|
|
@@ -39,5 +48,6 @@ const isFeatureEnabled = (features, featureName) => {
|
|
|
39
48
|
module.exports = {
|
|
40
49
|
getGlobalProperties,
|
|
41
50
|
getFeatures,
|
|
42
|
-
isFeatureEnabled
|
|
51
|
+
isFeatureEnabled,
|
|
52
|
+
getMode
|
|
43
53
|
}
|