@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.
Files changed (217) hide show
  1. package/README.md +2 -2
  2. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +16 -25
  3. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +103 -57
  4. package/dist/audit/languageAnalysisEngine/report/models/reportGuidanceModel.js +6 -0
  5. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +3 -3
  6. package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +1 -0
  7. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +68 -17
  8. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +39 -7
  9. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
  10. package/dist/audit/save.js +21 -13
  11. package/dist/commands/audit/auditConfig.js +3 -19
  12. package/dist/commands/audit/auditController.js +1 -10
  13. package/dist/commands/audit/help.js +7 -24
  14. package/dist/commands/audit/processAudit.js +5 -9
  15. package/dist/commands/audit/saveFile.js +2 -2
  16. package/dist/commands/auth/auth.js +1 -1
  17. package/dist/commands/config/config.js +2 -2
  18. package/dist/commands/scan/processScan.js +11 -4
  19. package/dist/commands/scan/sca/scaAnalysis.js +37 -13
  20. package/dist/common/HTTPClient.js +17 -8
  21. package/dist/common/errorHandling.js +2 -2
  22. package/dist/common/fail.js +66 -0
  23. package/dist/common/versionChecker.js +1 -1
  24. package/dist/constants/constants.js +7 -2
  25. package/dist/constants/locales.js +40 -38
  26. package/dist/constants.js +62 -12
  27. package/dist/index.js +57 -45
  28. package/dist/lambda/lambda.js +5 -2
  29. package/dist/sbom/generateSbom.js +2 -2
  30. package/dist/scaAnalysis/common/formatMessage.js +7 -1
  31. package/dist/scaAnalysis/common/scaParserForGoAndJava.js +32 -0
  32. package/dist/scaAnalysis/common/treeUpload.js +24 -10
  33. package/dist/scaAnalysis/dotnet/analysis.js +55 -0
  34. package/dist/scaAnalysis/dotnet/index.js +10 -0
  35. package/dist/scaAnalysis/go/goAnalysis.js +8 -2
  36. package/dist/scaAnalysis/java/analysis.js +10 -6
  37. package/dist/scaAnalysis/java/index.js +7 -1
  38. package/dist/scaAnalysis/java/javaBuildDepsParser.js +19 -3
  39. package/dist/scaAnalysis/javascript/analysis.js +4 -7
  40. package/dist/scaAnalysis/javascript/index.js +16 -4
  41. package/dist/scaAnalysis/php/analysis.js +14 -33
  42. package/dist/scaAnalysis/php/index.js +11 -4
  43. package/dist/scaAnalysis/python/analysis.js +43 -5
  44. package/dist/scaAnalysis/python/index.js +7 -2
  45. package/dist/scaAnalysis/ruby/analysis.js +16 -14
  46. package/dist/scan/autoDetection.js +13 -24
  47. package/dist/scan/fileUtils.js +31 -12
  48. package/dist/scan/formatScanOutput.js +9 -8
  49. package/dist/scan/populateProjectIdAndProjectName.js +5 -0
  50. package/dist/scan/scan.js +4 -0
  51. package/dist/scan/scanConfig.js +5 -5
  52. package/dist/scan/scanResults.js +39 -3
  53. package/dist/telemetry/telemetry.js +137 -0
  54. package/dist/utils/commonApi.js +1 -1
  55. package/dist/utils/getConfig.js +3 -8
  56. package/dist/utils/parsedCLIOptions.js +3 -1
  57. package/dist/utils/requestUtils.js +7 -1
  58. package/package.json +2 -3
  59. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +21 -57
  60. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +155 -77
  61. package/src/audit/languageAnalysisEngine/report/models/reportGuidanceModel.ts +5 -0
  62. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +5 -5
  63. package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +2 -0
  64. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +56 -27
  65. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +45 -6
  66. package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
  67. package/src/audit/save.js +32 -16
  68. package/src/commands/audit/auditConfig.ts +10 -28
  69. package/src/commands/audit/auditController.ts +0 -11
  70. package/src/commands/audit/help.ts +7 -24
  71. package/src/commands/audit/processAudit.ts +16 -8
  72. package/src/commands/audit/saveFile.ts +2 -2
  73. package/src/commands/auth/auth.js +3 -1
  74. package/src/commands/config/config.js +4 -2
  75. package/src/commands/scan/processScan.js +18 -5
  76. package/src/commands/scan/sca/scaAnalysis.js +50 -18
  77. package/src/common/HTTPClient.js +23 -9
  78. package/src/common/errorHandling.ts +2 -3
  79. package/src/common/fail.js +75 -0
  80. package/src/common/versionChecker.ts +1 -1
  81. package/src/constants/constants.js +9 -3
  82. package/src/constants/locales.js +70 -45
  83. package/src/constants.js +67 -13
  84. package/src/index.ts +91 -66
  85. package/src/lambda/lambda.ts +5 -2
  86. package/src/lambda/types.ts +1 -0
  87. package/src/sbom/generateSbom.ts +2 -2
  88. package/src/scaAnalysis/common/formatMessage.js +8 -1
  89. package/src/scaAnalysis/common/scaParserForGoAndJava.js +41 -0
  90. package/src/scaAnalysis/common/treeUpload.js +25 -11
  91. package/src/scaAnalysis/dotnet/analysis.js +72 -0
  92. package/src/scaAnalysis/dotnet/index.js +11 -0
  93. package/src/scaAnalysis/go/goAnalysis.js +9 -2
  94. package/src/scaAnalysis/java/analysis.js +11 -6
  95. package/src/scaAnalysis/java/index.js +9 -1
  96. package/src/scaAnalysis/java/javaBuildDepsParser.js +25 -6
  97. package/src/scaAnalysis/javascript/analysis.js +6 -7
  98. package/src/scaAnalysis/javascript/index.js +25 -6
  99. package/src/scaAnalysis/php/analysis.js +15 -35
  100. package/src/scaAnalysis/php/index.js +15 -4
  101. package/src/scaAnalysis/python/analysis.js +49 -5
  102. package/src/scaAnalysis/python/index.js +7 -2
  103. package/src/scaAnalysis/ruby/analysis.js +18 -15
  104. package/src/scan/autoDetection.js +14 -27
  105. package/src/scan/fileUtils.js +33 -12
  106. package/src/scan/formatScanOutput.ts +10 -8
  107. package/src/scan/populateProjectIdAndProjectName.js +5 -1
  108. package/src/scan/scan.ts +4 -0
  109. package/src/scan/scanConfig.js +7 -7
  110. package/src/scan/scanResults.js +46 -3
  111. package/src/telemetry/telemetry.ts +154 -0
  112. package/src/utils/commonApi.js +1 -1
  113. package/src/utils/getConfig.ts +5 -18
  114. package/src/utils/parsedCLIOptions.js +14 -1
  115. package/src/utils/requestUtils.js +8 -1
  116. package/dist/audit/AnalysisEngine.js +0 -37
  117. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  118. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  119. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  120. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  121. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  122. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  123. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  124. package/dist/audit/goAnalysisEngine/index.js +0 -17
  125. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  126. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  127. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  128. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  129. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -155
  130. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  131. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  132. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  133. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -25
  134. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
  135. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  136. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
  137. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  138. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  139. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  140. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -66
  141. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -166
  142. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  143. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  144. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  145. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  146. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  147. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  148. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  149. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  150. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  151. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  152. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  153. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  154. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  155. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  156. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  157. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  158. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  159. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  160. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  161. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  162. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  163. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  164. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  165. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  166. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  167. package/src/audit/AnalysisEngine.js +0 -103
  168. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  169. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  170. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  171. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  172. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  173. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  174. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  175. package/src/audit/goAnalysisEngine/index.js +0 -18
  176. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  177. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  178. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  179. package/src/audit/javaAnalysisEngine/index.js +0 -41
  180. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -225
  181. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  182. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  183. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  184. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -36
  185. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
  186. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  187. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
  188. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  189. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  190. package/src/audit/languageAnalysisEngine/index.js +0 -45
  191. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -96
  192. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -251
  193. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  194. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  195. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  196. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  197. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  198. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  199. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  200. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  201. package/src/audit/phpAnalysisEngine/index.js +0 -27
  202. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  203. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  204. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  205. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  206. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  207. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  208. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  209. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  210. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  211. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  212. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  213. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  214. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  215. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  216. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  217. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ const fs = require('fs');
3
+ const xml2js = require('xml2js');
4
+ const i18n = require('i18n');
5
+ const readAndParseProjectFile = projectFilePath => {
6
+ const projectFile = fs.readFileSync(projectFilePath);
7
+ return new xml2js.Parser({
8
+ explicitArray: false,
9
+ mergeAttrs: true
10
+ }).parseString(projectFile);
11
+ };
12
+ const readAndParseLockFile = lockFilePath => {
13
+ const lockFile = JSON.parse(fs.readFileSync(lockFilePath).toString());
14
+ let count = 0;
15
+ for (const dependenciesNode in lockFile.dependencies) {
16
+ for (const innerNode in lockFile.dependencies[dependenciesNode]) {
17
+ const nodeValidation = JSON.stringify(lockFile.dependencies[dependenciesNode][innerNode]);
18
+ if (nodeValidation.includes('"type":"Project"')) {
19
+ count += 1;
20
+ delete lockFile.dependencies[dependenciesNode][innerNode];
21
+ lockFile.additionalInfo = 'dependenciesNote';
22
+ }
23
+ }
24
+ }
25
+ if (count > 0) {
26
+ const multiLevelProjectWarning = () => {
27
+ console.log('');
28
+ console.log(i18n.__('dependenciesNote'));
29
+ };
30
+ setTimeout(multiLevelProjectWarning, 7000);
31
+ }
32
+ return lockFile;
33
+ };
34
+ const checkForCorrectFiles = languageFiles => {
35
+ if (!languageFiles.includes('packages.lock.json')) {
36
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', '.NET'));
37
+ }
38
+ if (!languageFiles.some(i => i.includes('.csproj'))) {
39
+ throw new Error(i18n.__('languageAnalysisProjectFileError', '.NET'));
40
+ }
41
+ };
42
+ const getDotNetDeps = (filePath, languageFiles) => {
43
+ checkForCorrectFiles(languageFiles);
44
+ const projectFileName = languageFiles.find(fileName => fileName.includes('.csproj'));
45
+ const lockFileName = languageFiles.find(fileName => fileName.includes('.json'));
46
+ const projectFile = readAndParseProjectFile(filePath + `/${projectFileName}`);
47
+ const lockFile = readAndParseLockFile(filePath + `/${lockFileName}`);
48
+ return { projectFile, lockFile };
49
+ };
50
+ module.exports = {
51
+ getDotNetDeps,
52
+ readAndParseProjectFile,
53
+ readAndParseLockFile,
54
+ checkForCorrectFiles
55
+ };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ const { getDotNetDeps } = require('./analysis');
3
+ const { createDotNetTSMessage } = require('../common/formatMessage');
4
+ const dotNetAnalysis = (config, languageFiles) => {
5
+ const dotNetDeps = getDotNetDeps(config.file, languageFiles.DOTNET);
6
+ return createDotNetTSMessage(dotNetDeps);
7
+ };
8
+ module.exports = {
9
+ dotNetAnalysis
10
+ };
@@ -1,12 +1,18 @@
1
1
  "use strict";
2
2
  const { createGoTSMessage } = require('../common/formatMessage');
3
+ const { parseDependenciesForSCAServices } = require('../common/scaParserForGoAndJava');
3
4
  const goReadDepFile = require('./goReadDepFile');
4
5
  const goParseDeps = require('./goParseDeps');
5
- const goAnalysis = (config, languageFiles) => {
6
+ const goAnalysis = config => {
6
7
  try {
7
8
  const rawGoDependencies = goReadDepFile.getGoDependencies(config);
8
9
  const parsedGoDependencies = goParseDeps.parseGoDependencies(rawGoDependencies);
9
- return createGoTSMessage(parsedGoDependencies);
10
+ if (config.experimental) {
11
+ return parseDependenciesForSCAServices(parsedGoDependencies);
12
+ }
13
+ else {
14
+ return createGoTSMessage(parsedGoDependencies);
15
+ }
10
16
  }
11
17
  catch (e) {
12
18
  console.log(e.message.toString());
@@ -5,17 +5,20 @@ const i18n = require('i18n');
5
5
  const fs = require('fs');
6
6
  const MAVEN = 'maven';
7
7
  const GRADLE = 'gradle';
8
- const determineProjectTypeAndCwd = (files, file) => {
8
+ const determineProjectTypeAndCwd = (files, config) => {
9
9
  const projectData = {};
10
+ if (files.length > 1) {
11
+ files = files.filter(i => config.fileName.includes(i));
12
+ }
10
13
  if (files[0].includes('pom.xml')) {
11
14
  projectData.projectType = MAVEN;
12
15
  }
13
16
  else if (files[0].includes('build.gradle')) {
14
17
  projectData.projectType = GRADLE;
15
18
  }
16
- projectData.cwd = file
17
- ? file.replace('pom.xml', '').replace('build.gradle', '')
18
- : file;
19
+ projectData.cwd = config.file
20
+ ? config.file.replace('pom.xml', '').replace('build.gradle', '')
21
+ : config.file;
19
22
  return projectData;
20
23
  };
21
24
  const buildMaven = (config, projectData, timeout) => {
@@ -86,7 +89,7 @@ const getJavaBuildDeps = (config, files) => {
86
89
  projectType: undefined
87
90
  };
88
91
  try {
89
- const projectData = determineProjectTypeAndCwd(files, config.file);
92
+ const projectData = determineProjectTypeAndCwd(files, config);
90
93
  if (projectData.projectType === MAVEN) {
91
94
  output.mvnDependancyTreeOutput = buildMaven(config, projectData, timeout);
92
95
  }
@@ -101,5 +104,6 @@ const getJavaBuildDeps = (config, files) => {
101
104
  }
102
105
  };
103
106
  module.exports = {
104
- getJavaBuildDeps
107
+ getJavaBuildDeps,
108
+ determineProjectTypeAndCwd
105
109
  };
@@ -2,12 +2,18 @@
2
2
  const analysis = require('./analysis');
3
3
  const { parseBuildDeps } = require('./javaBuildDepsParser');
4
4
  const { createJavaTSMessage } = require('../common/formatMessage');
5
+ const { parseDependenciesForSCAServices } = require('../common/scaParserForGoAndJava');
5
6
  const javaAnalysis = (config, languageFiles) => {
6
7
  languageFiles.JAVA.forEach(file => {
7
8
  file.replace('build.gradle.kts', 'build.gradle');
8
9
  });
9
10
  const javaDeps = buildJavaTree(config, languageFiles.JAVA);
10
- return createJavaTSMessage(javaDeps);
11
+ if (config.experimental) {
12
+ return parseDependenciesForSCAServices(javaDeps);
13
+ }
14
+ else {
15
+ return createJavaTSMessage(javaDeps);
16
+ }
11
17
  };
12
18
  const buildJavaTree = (config, files) => {
13
19
  const javaBuildDeps = analysis.getJavaBuildDeps(config, files);
@@ -14,13 +14,12 @@ 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]);
17
18
  obj.push(shavedOutput[dep]
18
19
  .replace('+-', '+---')
19
20
  .replace('[INFO]', '')
20
21
  .replace('\\-', '\\---')
21
22
  .replace(':jar:', ':')
22
- .replace(':test', '')
23
- .replace(':compile', '')
24
23
  .replace(' +', '+')
25
24
  .replace(' |', '|')
26
25
  .replace(' \\', '\\')
@@ -50,6 +49,21 @@ const preParser = shavedOutput => {
50
49
  }
51
50
  return depTree;
52
51
  };
52
+ const shaveDependencyType = dep => {
53
+ if (dep.endsWith('\r')) {
54
+ dep = dep.slice(0, -1);
55
+ }
56
+ if (dep.endsWith(':test')) {
57
+ dep = dep.slice(0, -5);
58
+ }
59
+ if (dep.endsWith(':compile')) {
60
+ dep = dep.slice(0, -8);
61
+ }
62
+ if (dep.endsWith(':provided')) {
63
+ dep = dep.slice(0, -9);
64
+ }
65
+ return dep;
66
+ };
53
67
  const shaveOutput = (gradleDependencyTreeOutput, projectType) => {
54
68
  let shavedOutput = gradleDependencyTreeOutput.split('\n');
55
69
  if (projectType === 'maven') {
@@ -335,5 +349,7 @@ module.exports = {
335
349
  computeRelationToLastElement,
336
350
  addIndentation,
337
351
  computeLevel,
338
- computeIndentation
352
+ computeIndentation,
353
+ shaveDependencyType,
354
+ preParser
339
355
  };
@@ -10,7 +10,7 @@ const readFile = async (config, languageFiles, nameOfFile) => {
10
10
  return fs.readFileSync(config.file.concat(languageFiles[index]), 'utf8');
11
11
  }
12
12
  else {
13
- console.log('could not find file');
13
+ throw new Error('could not find file');
14
14
  }
15
15
  };
16
16
  const readYarn = async (config, languageFiles, nameOfFile) => {
@@ -29,8 +29,7 @@ const readYarn = async (config, languageFiles, nameOfFile) => {
29
29
  return yarn;
30
30
  }
31
31
  catch (err) {
32
- console.log(i18n.__('nodeReadYarnLockFileError') + `${err.message}`);
33
- return;
32
+ throw new Error(i18n.__('nodeReadYarnLockFileError') + `${err.message}`);
34
33
  }
35
34
  };
36
35
  const parseNpmLockFile = async (js) => {
@@ -67,8 +66,7 @@ const parseNpmLockFile = async (js) => {
67
66
  }
68
67
  }
69
68
  catch (err) {
70
- console.log(i18n.__('NodeParseNPM') + `${err.message}`);
71
- return;
69
+ throw new Error(i18n.__('NodeParseNPM') + `${err.message}`);
72
70
  }
73
71
  };
74
72
  const addDepToLockFile = (js, depObj, key) => {
@@ -97,8 +95,7 @@ const parseYarnLockFile = async (js) => {
97
95
  }
98
96
  }
99
97
  catch (err) {
100
- console.log(i18n.__('NodeParseYarn') + `${err.message}`);
101
- return;
98
+ throw new Error(i18n.__('NodeParseYarn', js.yarn.yarnVersion) + `${err.message}`);
102
99
  }
103
100
  };
104
101
  module.exports = {
@@ -3,10 +3,9 @@ const analysis = require('./analysis');
3
3
  const i18n = require('i18n');
4
4
  const formatMessage = require('../common/formatMessage');
5
5
  const jsAnalysis = async (config, languageFiles) => {
6
- if (languageFiles.JAVASCRIPT.includes('package-lock.json') &&
7
- languageFiles.JAVASCRIPT.includes('yarn.lock')) {
8
- console.log(i18n.__('languageAnalysisMultipleLanguages1'));
9
- return;
6
+ checkForCorrectFiles(languageFiles);
7
+ if (!config.file.endsWith('/')) {
8
+ config.file = config.file.concat('/');
10
9
  }
11
10
  return buildNodeTree(config, languageFiles.JAVASCRIPT);
12
11
  };
@@ -36,6 +35,19 @@ const parseFiles = async (config, files, js) => {
36
35
  }
37
36
  return js;
38
37
  };
38
+ const checkForCorrectFiles = languageFiles => {
39
+ if (languageFiles.JAVASCRIPT.includes('package-lock.json') &&
40
+ languageFiles.JAVASCRIPT.includes('yarn.lock')) {
41
+ throw new Error(i18n.__('languageAnalysisHasMultipleLockFiles', 'javascript'));
42
+ }
43
+ if (!languageFiles.JAVASCRIPT.includes('package-lock.json') &&
44
+ !languageFiles.JAVASCRIPT.includes('yarn.lock')) {
45
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'javascript'));
46
+ }
47
+ if (!languageFiles.JAVASCRIPT.includes('package.json')) {
48
+ throw new Error(i18n.__('languageAnalysisHasNoPackageJsonFile'));
49
+ }
50
+ };
39
51
  module.exports = {
40
52
  jsAnalysis
41
53
  };
@@ -2,23 +2,21 @@
2
2
  const fs = require('fs');
3
3
  const i18n = require('i18n');
4
4
  const _ = require('lodash');
5
- let php = {};
6
- const readProjectFile = (projectPath, customFile) => {
7
- const filePath = filePathForWindows(projectPath + customFile);
8
- try {
9
- php.composerJSON = JSON.parse(fs.readFileSync(filePath, 'utf8'));
10
- php.composerJSON.dependencies = php.composerJSON.require;
11
- php.composerJSON.devDependencies = php.composerJSON['require-dev'];
12
- return php;
13
- }
14
- catch (err) {
15
- console.log(err.message.toString());
5
+ const readFile = (config, nameOfFile) => {
6
+ if (config.file) {
7
+ try {
8
+ return fs.readFileSync(config.file + '/' + nameOfFile);
9
+ }
10
+ catch (error) {
11
+ console.log('Unable to find file');
12
+ console.log(error);
13
+ }
16
14
  }
17
15
  };
18
- const readAndParseLockFile = (projectPath, customFile) => {
19
- const filePath = filePathForWindows(projectPath + customFile);
16
+ const parseProjectFiles = php => {
20
17
  try {
21
- php.rawLockFileContents = JSON.parse(fs.readFileSync(filePath, 'utf8'));
18
+ php.composerJSON.dependencies = php.composerJSON.require;
19
+ php.composerJSON.devDependencies = php.composerJSON['require-dev'];
22
20
  php.lockFile = php.rawLockFileContents;
23
21
  let packages = _.keyBy(php.lockFile.packages, 'name');
24
22
  let packagesDev = _.keyBy(php.lockFile['packages-dev'], 'name');
@@ -50,22 +48,6 @@ const readAndParseLockFile = (projectPath, customFile) => {
50
48
  return console.log(i18n.__('phpParseComposerLock', php) + `${err.message}`);
51
49
  }
52
50
  };
53
- const getPhpDeps = (config, files) => {
54
- try {
55
- return (readProjectFile(config.file, files[0].projectFilename),
56
- readAndParseLockFile(config.file, files[1].lockFilename));
57
- }
58
- catch (err) {
59
- console.log(err.message.toString());
60
- process.exit(1);
61
- }
62
- };
63
- const filePathForWindows = path => {
64
- if (process.platform === 'win32') {
65
- path = path.replace(/\//g, '\\');
66
- }
67
- return path;
68
- };
69
51
  function addChildDepToLockFileAsOwnObj(php, depObj, key) {
70
52
  php.lockFile.dependencies[key] = { version: depObj[key] };
71
53
  }
@@ -83,7 +65,6 @@ function formatParentDepToLockFile(php) {
83
65
  }
84
66
  }
85
67
  module.exports = {
86
- getPhpDeps,
87
- readAndParseLockFile,
88
- readProjectFile
68
+ parseProjectFiles,
69
+ readFile
89
70
  };
@@ -1,9 +1,16 @@
1
1
  "use strict";
2
- const { getPhpDeps } = require('./analysis');
2
+ const { readFile, parseProjectFiles } = require('./analysis');
3
3
  const { createPhpTSMessage } = require('../common/formatMessage');
4
- const phpAnalysis = (config, languageFiles) => {
5
- const phpDeps = getPhpDeps(config, languageFiles.PHP);
6
- return createPhpTSMessage(phpDeps);
4
+ const phpAnalysis = (config, files) => {
5
+ let analysis = readFiles(config, files.PHP);
6
+ const phpDep = parseProjectFiles(analysis);
7
+ return createPhpTSMessage(phpDep);
8
+ };
9
+ const readFiles = (config, files) => {
10
+ let php = {};
11
+ php.composerJSON = JSON.parse(readFile(config, 'composer.json'));
12
+ php.rawLockFileContents = JSON.parse(readFile(config, 'composer.lock'));
13
+ return php;
7
14
  };
8
15
  module.exports = {
9
16
  phpAnalysis
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  const multiReplace = require('string-multiple-replace');
3
3
  const fs = require('fs');
4
+ const i18n = require('i18n');
4
5
  const readAndParseProjectFile = file => {
5
6
  const filePath = filePathForWindows(file + '/Pipfile');
6
7
  const pipFile = fs.readFileSync(filePath, 'utf8');
@@ -18,11 +19,45 @@ const readAndParseLockFile = file => {
18
19
  delete parsedPipLock['default'];
19
20
  return parsedPipLock;
20
21
  };
21
- const getPythonDeps = config => {
22
+ const readLockFile = file => {
23
+ const filePath = filePathForWindows(file + '/Pipfile.lock');
24
+ const lockFile = fs.readFileSync(filePath, 'utf8');
25
+ let parsedPipLock = JSON.parse(lockFile);
26
+ return parsedPipLock['default'];
27
+ };
28
+ const scaPythonParser = pythonDependencies => {
29
+ let pythonParsedDeps = {};
30
+ for (let key in pythonDependencies) {
31
+ pythonParsedDeps[key] = {};
32
+ pythonParsedDeps[key].version = pythonDependencies[key].version.replace('==', '');
33
+ pythonParsedDeps[key].group = null;
34
+ pythonParsedDeps[key].name = key;
35
+ pythonParsedDeps[key].isProduction = true;
36
+ pythonParsedDeps[key].dependencies = [];
37
+ pythonParsedDeps[key].directDependency = true;
38
+ }
39
+ return pythonParsedDeps;
40
+ };
41
+ const checkForCorrectFiles = languageFiles => {
42
+ if (!languageFiles.includes('Pipfile.lock')) {
43
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'python'));
44
+ }
45
+ if (!languageFiles.includes('Pipfile')) {
46
+ throw new Error(i18n.__('languageAnalysisProjectFileError', 'python'));
47
+ }
48
+ };
49
+ const getPythonDeps = (config, languageFiles) => {
22
50
  try {
23
- const parseProject = readAndParseProjectFile(config.file);
24
- const parsePip = readAndParseLockFile(config.file);
25
- return { pipfileLock: parsePip, pipfilDependanceies: parseProject };
51
+ if (config.experimental) {
52
+ let pythonLockFileContents = readLockFile(config.file);
53
+ return scaPythonParser(pythonLockFileContents);
54
+ }
55
+ else {
56
+ checkForCorrectFiles(languageFiles);
57
+ const parseProject = readAndParseProjectFile(config.file);
58
+ const parsePip = readAndParseLockFile(config.file);
59
+ return { pipfileLock: parsePip, pipfilDependanceies: parseProject };
60
+ }
26
61
  }
27
62
  catch (err) {
28
63
  console.log(err.message.toString());
@@ -37,6 +72,9 @@ const filePathForWindows = path => {
37
72
  };
38
73
  module.exports = {
39
74
  getPythonDeps,
75
+ scaPythonParser,
76
+ readAndParseLockFile,
40
77
  readAndParseProjectFile,
41
- readAndParseLockFile
78
+ checkForCorrectFiles,
79
+ readLockFile
42
80
  };
@@ -1,9 +1,14 @@
1
1
  "use strict";
2
2
  const { createPythonTSMessage } = require('../common/formatMessage');
3
- const { getPythonDeps } = require('./analysis');
3
+ const { getPythonDeps, secondaryParser } = require('./analysis');
4
4
  const pythonAnalysis = (config, languageFiles) => {
5
5
  const pythonDeps = getPythonDeps(config, languageFiles.PYTHON);
6
- return createPythonTSMessage(pythonDeps);
6
+ if (config.experimental) {
7
+ return pythonDeps;
8
+ }
9
+ else {
10
+ return createPythonTSMessage(pythonDeps);
11
+ }
7
12
  };
8
13
  module.exports = {
9
14
  pythonAnalysis
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  const fs = require('fs');
3
+ const i18n = require('i18n');
3
4
  const readAndParseGemfile = file => {
4
- const fileName = filePathForWindows(file + '/Gemfile');
5
- const gemFile = fs.readFileSync(fileName, 'utf8');
5
+ const gemFile = fs.readFileSync(file + '/Gemfile', 'utf8');
6
6
  const rubyArray = gemFile.split('\n');
7
7
  let filteredRubyDep = rubyArray.filter(element => {
8
8
  return (!element.includes('#') &&
@@ -15,8 +15,7 @@ const readAndParseGemfile = file => {
15
15
  return filteredRubyDep;
16
16
  };
17
17
  const readAndParseGemLockFile = file => {
18
- const fileName = filePathForWindows(file + '/Gemfile.lock');
19
- const lockFile = fs.readFileSync(fileName, 'utf8');
18
+ const lockFile = fs.readFileSync(file + '/Gemfile.lock', 'utf8');
20
19
  const dependencyRegEx = /^\s*([A-Za-z0-9.!@#$%\-^&*_+]*)\s*(\((.*?)\))/;
21
20
  const lines = lockFile.split('\n');
22
21
  return {
@@ -190,26 +189,28 @@ const buildSourceDependencyWithVersion = (whitespaceRegx, dependencyRegEx, line,
190
189
  }
191
190
  return dependencies;
192
191
  };
193
- const getRubyDeps = config => {
192
+ const getRubyDeps = (config, languageFiles) => {
194
193
  try {
194
+ checkForCorrectFiles(languageFiles);
195
195
  const parsedGem = readAndParseGemfile(config.file);
196
196
  const parsedLock = readAndParseGemLockFile(config.file);
197
197
  return { gemfilesDependanceies: parsedGem, gemfileLock: parsedLock };
198
198
  }
199
199
  catch (err) {
200
- console.log(err.message);
201
- process.exit(1);
200
+ throw err;
201
+ }
202
+ };
203
+ const checkForCorrectFiles = languageFiles => {
204
+ if (!languageFiles.includes('Gemfile.lock')) {
205
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'ruby'));
206
+ }
207
+ if (!languageFiles.includes('Gemfile')) {
208
+ throw new Error(i18n.__('languageAnalysisProjectFileError', 'ruby'));
202
209
  }
203
210
  };
204
211
  const trimWhiteSpace = string => {
205
212
  return string.replace(/\s+/g, '');
206
213
  };
207
- const filePathForWindows = path => {
208
- if (process.platform === 'win32') {
209
- path = path.replace(/\//g, '\\');
210
- }
211
- return path;
212
- };
213
214
  module.exports = {
214
215
  getRubyDeps,
215
216
  readAndParseGemfile,
@@ -222,5 +223,6 @@ module.exports = {
222
223
  getVersion,
223
224
  getPatchLevel,
224
225
  formatSourceArr,
225
- getSourceArray
226
+ getSourceArray,
227
+ checkForCorrectFiles
226
228
  };
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  const i18n = require('i18n');
3
3
  const fileFinder = require('./fileUtils');
4
- const languageResolver = require('../audit/languageAnalysisEngine/reduceIdentifiedLanguages');
5
4
  const rootFile = require('../audit/languageAnalysisEngine/getProjectRootFilenames');
5
+ const path = require('path');
6
6
  const autoDetectFileAndLanguage = async (configToUse) => {
7
7
  const entries = await fileFinder.findFile();
8
8
  if (entries.length === 1) {
@@ -24,30 +24,20 @@ const autoDetectFileAndLanguage = async (configToUse) => {
24
24
  errorOnFileDetection(entries);
25
25
  }
26
26
  };
27
- const autoDetectAuditFilesAndLanguages = async () => {
27
+ const autoDetectAuditFilesAndLanguages = async (filePath) => {
28
28
  let languagesFound = [];
29
- console.log(i18n.__('searchingAuditFileDirectory', process.cwd()));
30
- await fileFinder.findFilesJava(languagesFound);
31
- await fileFinder.findFilesJavascript(languagesFound);
32
- await fileFinder.findFilesPython(languagesFound);
33
- await fileFinder.findFilesGo(languagesFound);
34
- await fileFinder.findFilesPhp(languagesFound);
35
- await fileFinder.findFilesRuby(languagesFound);
36
- if (languagesFound.length === 1) {
29
+ console.log(i18n.__('searchingAuditFileDirectory', filePath));
30
+ await fileFinder.findFilesJava(languagesFound, filePath);
31
+ await fileFinder.findFilesJavascript(languagesFound, filePath);
32
+ await fileFinder.findFilesPython(languagesFound, filePath);
33
+ await fileFinder.findFilesGo(languagesFound, filePath);
34
+ await fileFinder.findFilesPhp(languagesFound, filePath);
35
+ await fileFinder.findFilesRuby(languagesFound, filePath);
36
+ await fileFinder.findFilesDotNet(languagesFound, filePath);
37
+ if (languagesFound) {
37
38
  return languagesFound;
38
39
  }
39
- else {
40
- console.log('found multiple languages, please specify one using --file to run SCA audit');
41
- }
42
- };
43
- const manualDetectAuditFilesAndLanguages = file => {
44
- let projectRootFilenames = rootFile.getProjectRootFilenames(file);
45
- let identifiedLanguages = languageResolver.deduceLanguageScaAnalysis(projectRootFilenames);
46
- if (Object.keys(identifiedLanguages).length === 0) {
47
- console.log(i18n.__('languageAnalysisNoLanguage', file));
48
- return [];
49
- }
50
- return [identifiedLanguages];
40
+ return [];
51
41
  };
52
42
  const hasWhiteSpace = s => {
53
43
  const filename = s.split('/').pop();
@@ -88,6 +78,5 @@ module.exports = {
88
78
  autoDetectFileAndLanguage,
89
79
  errorOnFileDetection,
90
80
  autoDetectAuditFilesAndLanguages,
91
- errorOnAuditFileDetection,
92
- manualDetectAuditFilesAndLanguages
81
+ errorOnAuditFileDetection
93
82
  };