@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.
Files changed (37) hide show
  1. package/dist/commands/audit/processAudit.js +10 -0
  2. package/dist/commands/scan/processScan.js +9 -0
  3. package/dist/commands/scan/sca/scaAnalysis.js +3 -0
  4. package/dist/common/HTTPClient.js +30 -2
  5. package/dist/common/fail.js +7 -3
  6. package/dist/common/versionChecker.js +11 -5
  7. package/dist/constants/constants.js +1 -1
  8. package/dist/constants/locales.js +2 -2
  9. package/dist/index.js +1 -1
  10. package/dist/lambda/lambda.js +7 -0
  11. package/dist/scaAnalysis/common/scaServicesUpload.js +52 -0
  12. package/dist/scaAnalysis/javascript/index.js +4 -0
  13. package/dist/scaAnalysis/javascript/scaServiceParser.js +109 -0
  14. package/dist/scaAnalysis/ruby/analysis.js +106 -9
  15. package/dist/scaAnalysis/ruby/index.js +6 -1
  16. package/dist/scan/scanResults.js +1 -1
  17. package/dist/{audit/languageAnalysisEngine/util → utils}/capabilities.js +0 -0
  18. package/dist/{audit/languageAnalysisEngine/util → utils}/generalAPI.js +14 -5
  19. package/package.json +1 -1
  20. package/src/commands/audit/processAudit.ts +8 -0
  21. package/src/commands/scan/processScan.js +14 -0
  22. package/src/commands/scan/sca/scaAnalysis.js +10 -0
  23. package/src/common/HTTPClient.js +44 -2
  24. package/src/common/fail.js +7 -3
  25. package/src/common/versionChecker.ts +16 -6
  26. package/src/constants/constants.js +1 -1
  27. package/src/constants/locales.js +2 -3
  28. package/src/index.ts +1 -2
  29. package/src/lambda/lambda.ts +12 -0
  30. package/src/scaAnalysis/common/scaServicesUpload.js +54 -0
  31. package/src/scaAnalysis/javascript/index.js +4 -0
  32. package/src/scaAnalysis/javascript/scaServiceParser.js +145 -0
  33. package/src/scaAnalysis/ruby/analysis.js +137 -9
  34. package/src/scaAnalysis/ruby/index.js +6 -1
  35. package/src/scan/scanResults.js +1 -1
  36. package/src/{audit/languageAnalysisEngine/util → utils}/capabilities.js +0 -0
  37. 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 getRubyDeps = (config, languageFiles) => {
246
- try {
247
- checkForCorrectFiles(languageFiles)
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
- return { gemfilesDependanceies: parsedGem, gemfileLock: parsedLock }
252
- } catch (err) {
253
- throw err
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
- return createRubyTSMessage(rubyDeps)
6
+
7
+ if (config.experimental) {
8
+ return rubyDeps
9
+ } else {
10
+ return createRubyTSMessage(rubyDeps)
11
+ }
7
12
  }
8
13
 
9
14
  module.exports = {
@@ -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()
@@ -1,13 +1,13 @@
1
1
  const { featuresTeamServer } = require('./capabilities')
2
2
  const semver = require('semver')
3
- const { handleResponseErrors } = require('../../../common/errorHandling')
4
- const { getHttpClient } = require('../../../utils/commonApi')
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
  }