@contrast/contrast 1.0.0 → 1.0.3

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 (213) hide show
  1. package/.prettierignore +3 -0
  2. package/README.md +115 -78
  3. package/dist/audit/AnalysisEngine.js +37 -0
  4. package/dist/audit/catalogueApplication/catalogueApplication.js +36 -0
  5. package/dist/audit/dotnetAnalysisEngine/index.js +25 -0
  6. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +35 -0
  7. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +15 -0
  8. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +18 -0
  9. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +14 -0
  10. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +9 -0
  11. package/dist/audit/goAnalysisEngine/index.js +17 -0
  12. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +164 -0
  13. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +21 -0
  14. package/dist/audit/goAnalysisEngine/sanitizer.js +5 -0
  15. package/dist/audit/javaAnalysisEngine/index.js +34 -0
  16. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +153 -0
  17. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +353 -0
  18. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +98 -0
  19. package/dist/audit/javaAnalysisEngine/sanitizer.js +5 -0
  20. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +24 -0
  21. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +24 -0
  22. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +35 -0
  23. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +23 -0
  24. package/dist/audit/languageAnalysisEngine/commonApi.js +18 -0
  25. package/dist/audit/languageAnalysisEngine/constants.js +20 -0
  26. package/dist/audit/languageAnalysisEngine/filterProjectPath.js +20 -0
  27. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +25 -0
  28. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +39 -0
  29. package/dist/audit/languageAnalysisEngine/index.js +39 -0
  30. package/dist/audit/languageAnalysisEngine/langugageAnalysisFactory.js +95 -0
  31. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +121 -0
  32. package/dist/audit/languageAnalysisEngine/report/checkIgnoreDevDep.js +17 -0
  33. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +257 -0
  34. package/dist/audit/languageAnalysisEngine/report/newReportingFeature.js +81 -0
  35. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +133 -0
  36. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +41 -0
  37. package/dist/audit/languageAnalysisEngine/util/capabilities.js +11 -0
  38. package/dist/audit/languageAnalysisEngine/util/generalAPI.js +39 -0
  39. package/dist/audit/languageAnalysisEngine/util/requestUtils.js +14 -0
  40. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +40 -0
  41. package/dist/audit/nodeAnalysisEngine/index.js +31 -0
  42. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +18 -0
  43. package/dist/audit/nodeAnalysisEngine/parseYarn2LockFileContents.js +51 -0
  44. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +18 -0
  45. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +17 -0
  46. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +14 -0
  47. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +24 -0
  48. package/dist/audit/nodeAnalysisEngine/sanitizer.js +9 -0
  49. package/dist/audit/phpAnalysisEngine/index.js +23 -0
  50. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +52 -0
  51. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +13 -0
  52. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +16 -0
  53. package/dist/audit/phpAnalysisEngine/sanitizer.js +5 -0
  54. package/dist/audit/pythonAnalysisEngine/index.js +25 -0
  55. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +17 -0
  56. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +21 -0
  57. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +13 -0
  58. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +14 -0
  59. package/dist/audit/pythonAnalysisEngine/sanitizer.js +7 -0
  60. package/dist/audit/rubyAnalysisEngine/index.js +25 -0
  61. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +176 -0
  62. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +22 -0
  63. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +14 -0
  64. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +14 -0
  65. package/dist/audit/rubyAnalysisEngine/sanitizer.js +6 -0
  66. package/dist/commands/audit/auditConfig.js +25 -0
  67. package/dist/commands/audit/auditController.js +31 -0
  68. package/dist/commands/audit/help.js +52 -0
  69. package/dist/commands/audit/processAudit.js +18 -0
  70. package/dist/commands/audit/saveFile.js +11 -0
  71. package/dist/commands/auth/auth.js +20 -2
  72. package/dist/commands/config/config.js +19 -8
  73. package/dist/commands/scan/processScan.js +9 -13
  74. package/dist/common/HTTPClient.js +112 -13
  75. package/dist/common/errorHandling.js +65 -1
  76. package/dist/common/versionChecker.js +30 -0
  77. package/dist/constants/constants.js +4 -2
  78. package/dist/constants/lambda.js +32 -4
  79. package/dist/constants/locales.js +60 -21
  80. package/dist/constants.js +181 -21
  81. package/dist/index.js +50 -23
  82. package/dist/lambda/aws.js +14 -11
  83. package/dist/lambda/help.js +4 -0
  84. package/dist/lambda/lambda.js +50 -27
  85. package/dist/lambda/lambdaUtils.js +72 -0
  86. package/dist/lambda/logUtils.js +11 -1
  87. package/dist/lambda/scanDetailCompletion.js +4 -4
  88. package/dist/lambda/scanRequest.js +11 -5
  89. package/dist/lambda/utils.js +110 -53
  90. package/dist/sbom/generateSbom.js +20 -0
  91. package/dist/scan/autoDetection.js +0 -32
  92. package/dist/scan/fileUtils.js +1 -1
  93. package/dist/scan/help.js +14 -40
  94. package/dist/scan/populateProjectIdAndProjectName.js +5 -0
  95. package/dist/scan/saveResults.js +14 -0
  96. package/dist/scan/scan.js +105 -40
  97. package/dist/scan/scanConfig.js +39 -0
  98. package/dist/scan/scanController.js +19 -16
  99. package/dist/scan/scanResults.js +24 -16
  100. package/dist/utils/commonApi.js +3 -3
  101. package/dist/utils/paramsUtil/commandlineParams.js +1 -20
  102. package/dist/utils/paramsUtil/paramHandler.js +3 -6
  103. package/dist/utils/parsedCLIOptions.js +14 -8
  104. package/dist/utils/requestUtils.js +1 -1
  105. package/dist/utils/saveFile.js +19 -0
  106. package/package.json +26 -21
  107. package/src/audit/AnalysisEngine.js +103 -0
  108. package/src/audit/catalogueApplication/catalogueApplication.js +42 -0
  109. package/src/audit/dotnetAnalysisEngine/index.js +26 -0
  110. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +47 -0
  111. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +29 -0
  112. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +30 -0
  113. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +26 -0
  114. package/src/audit/dotnetAnalysisEngine/sanitizer.js +11 -0
  115. package/src/audit/goAnalysisEngine/index.js +18 -0
  116. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +209 -0
  117. package/src/audit/goAnalysisEngine/readProjectFileContents.js +31 -0
  118. package/src/audit/goAnalysisEngine/sanitizer.js +7 -0
  119. package/src/audit/javaAnalysisEngine/index.js +41 -0
  120. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +222 -0
  121. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +420 -0
  122. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +141 -0
  123. package/src/audit/javaAnalysisEngine/sanitizer.js +6 -0
  124. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +35 -0
  125. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +41 -0
  126. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +54 -0
  127. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +32 -0
  128. package/src/audit/languageAnalysisEngine/commonApi.js +20 -0
  129. package/src/audit/languageAnalysisEngine/constants.js +23 -0
  130. package/src/audit/languageAnalysisEngine/filterProjectPath.js +21 -0
  131. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +41 -0
  132. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +72 -0
  133. package/src/audit/languageAnalysisEngine/index.js +45 -0
  134. package/src/audit/languageAnalysisEngine/langugageAnalysisFactory.js +126 -0
  135. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +177 -0
  136. package/src/audit/languageAnalysisEngine/report/checkIgnoreDevDep.js +27 -0
  137. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.js +303 -0
  138. package/src/audit/languageAnalysisEngine/report/newReportingFeature.js +124 -0
  139. package/src/audit/languageAnalysisEngine/report/reportingFeature.js +190 -0
  140. package/src/audit/languageAnalysisEngine/sendSnapshot.js +51 -0
  141. package/src/audit/languageAnalysisEngine/util/capabilities.js +12 -0
  142. package/src/audit/languageAnalysisEngine/util/generalAPI.js +43 -0
  143. package/src/audit/languageAnalysisEngine/util/requestUtils.js +17 -0
  144. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +49 -0
  145. package/src/audit/nodeAnalysisEngine/index.js +35 -0
  146. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +20 -0
  147. package/src/audit/nodeAnalysisEngine/parseYarn2LockFileContents.js +63 -0
  148. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +26 -0
  149. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +23 -0
  150. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +27 -0
  151. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +36 -0
  152. package/src/audit/nodeAnalysisEngine/sanitizer.js +11 -0
  153. package/src/audit/phpAnalysisEngine/index.js +27 -0
  154. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +60 -0
  155. package/src/audit/phpAnalysisEngine/readLockFileContents.js +14 -0
  156. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +25 -0
  157. package/src/audit/phpAnalysisEngine/sanitizer.js +4 -0
  158. package/src/audit/pythonAnalysisEngine/index.js +55 -0
  159. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +23 -0
  160. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +33 -0
  161. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +16 -0
  162. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +22 -0
  163. package/src/audit/pythonAnalysisEngine/sanitizer.js +9 -0
  164. package/src/audit/rubyAnalysisEngine/index.js +30 -0
  165. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +215 -0
  166. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +39 -0
  167. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +18 -0
  168. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +17 -0
  169. package/src/audit/rubyAnalysisEngine/sanitizer.js +8 -0
  170. package/src/commands/audit/auditConfig.ts +30 -0
  171. package/src/commands/audit/auditController.ts +31 -0
  172. package/src/commands/audit/help.ts +48 -0
  173. package/src/commands/audit/processAudit.ts +18 -0
  174. package/src/commands/audit/saveFile.ts +6 -0
  175. package/src/commands/auth/auth.js +26 -2
  176. package/src/commands/config/config.js +22 -8
  177. package/src/commands/scan/processScan.js +9 -13
  178. package/src/common/HTTPClient.js +149 -14
  179. package/src/common/errorHandling.ts +85 -2
  180. package/src/common/versionChecker.ts +39 -0
  181. package/src/constants/constants.js +5 -4
  182. package/src/constants/lambda.js +45 -4
  183. package/src/constants/locales.js +76 -26
  184. package/src/constants.js +204 -23
  185. package/src/index.ts +67 -27
  186. package/src/lambda/aws.ts +13 -12
  187. package/src/lambda/help.ts +4 -0
  188. package/src/lambda/lambda.ts +53 -34
  189. package/src/lambda/lambdaUtils.ts +111 -0
  190. package/src/lambda/logUtils.ts +19 -1
  191. package/src/lambda/scanDetailCompletion.ts +4 -4
  192. package/src/lambda/scanRequest.ts +13 -11
  193. package/src/lambda/utils.ts +149 -81
  194. package/src/sbom/generateSbom.ts +17 -0
  195. package/src/scan/autoDetection.js +0 -29
  196. package/src/scan/fileUtils.js +1 -1
  197. package/src/scan/help.js +14 -45
  198. package/src/scan/populateProjectIdAndProjectName.js +5 -0
  199. package/src/scan/saveResults.js +14 -0
  200. package/src/scan/scan.js +127 -58
  201. package/src/scan/scanConfig.js +54 -0
  202. package/src/scan/scanController.js +22 -15
  203. package/src/scan/scanResults.js +32 -19
  204. package/src/utils/commonApi.js +2 -3
  205. package/src/utils/getConfig.ts +2 -0
  206. package/src/utils/paramsUtil/commandlineParams.js +1 -26
  207. package/src/utils/paramsUtil/paramHandler.js +3 -7
  208. package/src/utils/parsedCLIOptions.js +11 -9
  209. package/src/utils/requestUtils.js +1 -1
  210. package/src/utils/saveFile.js +19 -0
  211. package/dist/lambda/scanDetail.js +0 -30
  212. package/dist/scan/fileFinder.js +0 -15
  213. package/dist/utils/paramsUtil/yamlParams.js +0 -6
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ const i18n = require('i18n');
3
+ module.exports = exports = (analysis, next) => {
4
+ try {
5
+ const { languageAnalysis } = analysis;
6
+ if (Object.getOwnPropertyNames(languageAnalysis.identifiedLanguages)[0] ===
7
+ 'JAVA' ||
8
+ Object.getOwnPropertyNames(languageAnalysis.identifiedLanguages)[0] ===
9
+ 'GO') {
10
+ next();
11
+ return;
12
+ }
13
+ checkForLockFile(languageAnalysis.identifiedLanguages);
14
+ }
15
+ catch (err) {
16
+ next(err);
17
+ return;
18
+ }
19
+ next();
20
+ return;
21
+ };
22
+ const checkForLockFile = identifiedLanguages => {
23
+ if (Object.keys(identifiedLanguages).length == 1) {
24
+ let { lockFilenames } = Object.values(identifiedLanguages)[0];
25
+ if (lockFilenames.length == 0) {
26
+ const [language] = Object.keys(identifiedLanguages);
27
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', language));
28
+ }
29
+ if (lockFilenames.length > 1) {
30
+ const [language] = Object.keys(identifiedLanguages);
31
+ throw new Error(i18n.__('languageAnalysisHasMultipleLockFiles', language, String(lockFilenames)));
32
+ }
33
+ }
34
+ };
35
+ exports.checkForLockFile = checkForLockFile;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ const i18n = require('i18n');
3
+ module.exports = exports = (analysis, next) => {
4
+ const { languageAnalysis } = analysis;
5
+ try {
6
+ checkIdentifiedLanguageHasProjectFile(languageAnalysis.identifiedLanguages);
7
+ }
8
+ catch (err) {
9
+ next(err);
10
+ return;
11
+ }
12
+ next();
13
+ };
14
+ const checkIdentifiedLanguageHasProjectFile = identifiedLanguages => {
15
+ if (Object.keys(identifiedLanguages).length == 1) {
16
+ let { projectFilenames } = Object.values(identifiedLanguages)[0];
17
+ if (projectFilenames.length == 0) {
18
+ const [language] = Object.keys(identifiedLanguages);
19
+ throw new Error(i18n.__('languageAnalysisProjectFileError', language));
20
+ }
21
+ }
22
+ };
23
+ exports.checkIdentifiedLanguageHasProjectFile = checkIdentifiedLanguageHasProjectFile;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ const { getHttpClient } = require('../../utils/commonApi');
3
+ const returnAppId = async (config) => {
4
+ const client = getHttpClient(config);
5
+ let appId;
6
+ await client.getAppId(config).then(res => {
7
+ if (res.body) {
8
+ let obj = res.body['applications'];
9
+ if (obj) {
10
+ appId = obj.length === 0 ? '' : obj[0].app_id;
11
+ }
12
+ }
13
+ });
14
+ return appId;
15
+ };
16
+ module.exports = {
17
+ returnAppId: returnAppId
18
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ const NODE = 'NODE';
3
+ const JAVASCRIPT = 'JAVASCRIPT';
4
+ const DOTNET = 'DOTNET';
5
+ const JAVA = 'JAVA';
6
+ const RUBY = 'RUBY';
7
+ const PYTHON = 'PYTHON';
8
+ const GO = 'GO';
9
+ const PHP = 'PHP';
10
+ const LOW = 'LOW';
11
+ const MEDIUM = 'MEDIUM';
12
+ const HIGH = 'HIGH';
13
+ const CRITICAL = 'CRITICAL';
14
+ module.exports = {
15
+ supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT },
16
+ LOW: LOW,
17
+ MEDIUM: MEDIUM,
18
+ HIGH: HIGH,
19
+ CRITICAL: CRITICAL
20
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ const path = require('path');
3
+ function resolveFilePath(filepath) {
4
+ if (filepath[0] === '~') {
5
+ return path.join(process.env.HOME, filepath.slice(1));
6
+ }
7
+ return filepath;
8
+ }
9
+ const returnProjectPath = () => {
10
+ if (process.env.PWD !== (undefined || null || 'undefined')) {
11
+ return process.env.PWD;
12
+ }
13
+ else {
14
+ return process.argv[process.argv.indexOf('--project_path') + 1];
15
+ }
16
+ };
17
+ module.exports = {
18
+ returnProjectPath: returnProjectPath,
19
+ resolveFilePath: resolveFilePath
20
+ };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ const path = require('path');
3
+ module.exports = exports = (analysis, next) => {
4
+ const { projectPath, languageAnalysis } = analysis;
5
+ languageAnalysis.identifiedLanguageInfo = getIdentifiedLanguageInfo(projectPath, languageAnalysis.identifiedLanguages);
6
+ next();
7
+ };
8
+ const getIdentifiedLanguageInfo = (projectPath, identifiedLanguages) => {
9
+ const [language] = Object.keys(identifiedLanguages);
10
+ const { projectFilenames: [projectFilename], lockFilenames: [lockFilename] } = Object.values(identifiedLanguages)[0];
11
+ let identifiedLanguageInfo = {
12
+ language,
13
+ projectFilename,
14
+ projectFilePath: path.join(projectPath, projectFilename)
15
+ };
16
+ if (lockFilename) {
17
+ identifiedLanguageInfo = {
18
+ ...identifiedLanguageInfo,
19
+ lockFilename,
20
+ lockFilePath: path.join(projectPath, lockFilename)
21
+ };
22
+ }
23
+ return identifiedLanguageInfo;
24
+ };
25
+ exports.getIdentifiedLanguageInfo = getIdentifiedLanguageInfo;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const i18n = require('i18n');
5
+ module.exports = exports = (analysis, next) => {
6
+ const { projectPath, languageAnalysis } = analysis;
7
+ try {
8
+ languageAnalysis.projectRootFilenames = getProjectRootFilenames(projectPath);
9
+ }
10
+ catch (err) {
11
+ next(err);
12
+ return;
13
+ }
14
+ next();
15
+ };
16
+ const getProjectRootFilenames = projectPath => {
17
+ let projectStats = null;
18
+ try {
19
+ projectStats = fs.statSync(projectPath);
20
+ }
21
+ catch (err) {
22
+ throw new Error(i18n.__('languageAnalysisProjectRootFileNameFailure', projectPath) +
23
+ `${err.message}`);
24
+ }
25
+ if (projectStats.isDirectory()) {
26
+ try {
27
+ return fs.readdirSync(projectPath);
28
+ }
29
+ catch (err) {
30
+ throw new Error(i18n.__('languageAnalysisProjectRootFileNameReadError', projectPath) +
31
+ `${err.message}`);
32
+ }
33
+ }
34
+ if (projectStats.isFile()) {
35
+ return [path.basename(projectPath)];
36
+ }
37
+ throw new Error(i18n.__('languageAnalysisProjectRootFileNameMissingError'), projectPath);
38
+ };
39
+ exports.getProjectRootFilenames = getProjectRootFilenames;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ const AnalysisEngine = require('./../AnalysisEngine');
3
+ const i18n = require('i18n');
4
+ const getProjectRootFilenames = require('./getProjectRootFilenames');
5
+ const reduceIdentifiedLanguages = require('./reduceIdentifiedLanguages');
6
+ const checkForMultipleIdentifiedLanguages = require('./checkForMultipleIdentifiedLanguages');
7
+ const checkForMultipleIdentifiedProjectFiles = require('./checkForMultipleIdentifiedProjectFiles');
8
+ const checkIdentifiedLanguageHasProjectFile = require('./checkIdentifiedLanguageHasProjectFile');
9
+ const checkIdentifiedLanguageHasLockFile = require('./checkIdentifiedLanguageHasLockFile');
10
+ const getIdentifiedLanguageInfo = require('./getIdentifiedLanguageInfo');
11
+ const { libraryAnalysisError } = require('../../common/errorHandling');
12
+ module.exports = exports = (projectPath, callback, appId, config) => {
13
+ const ae = new AnalysisEngine({
14
+ projectPath,
15
+ appId,
16
+ languageAnalysis: { appId: appId },
17
+ config
18
+ });
19
+ ae.use([
20
+ getProjectRootFilenames,
21
+ reduceIdentifiedLanguages,
22
+ checkForMultipleIdentifiedLanguages,
23
+ checkForMultipleIdentifiedProjectFiles,
24
+ checkIdentifiedLanguageHasProjectFile,
25
+ checkIdentifiedLanguageHasLockFile,
26
+ getIdentifiedLanguageInfo
27
+ ]);
28
+ ae.analyze((err, analysis) => {
29
+ if (err) {
30
+ console.log('*******************' +
31
+ i18n.__('languageAnalysisFailureMessage') +
32
+ '****************');
33
+ console.error(`${err.message}`);
34
+ libraryAnalysisError();
35
+ process.exit(1);
36
+ }
37
+ callback(null, analysis);
38
+ });
39
+ };
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ const { supportedLanguages: { DOTNET, NODE, JAVA, RUBY, PYTHON, GO, PHP } } = require('../languageAnalysisEngine/constants');
3
+ const i18n = require('i18n');
4
+ const dotnetAE = require('../dotnetAnalysisEngine');
5
+ const nodeAE = require('../nodeAnalysisEngine');
6
+ const javaAE = require('../javaAnalysisEngine');
7
+ const rubyAE = require('../rubyAnalysisEngine');
8
+ const pythonAE = require('../pythonAnalysisEngine');
9
+ const phpAE = require('../phpAnalysisEngine');
10
+ const goAE = require('../goAnalysisEngine');
11
+ const { vulnerabilityReport } = require('./report/reportingFeature');
12
+ const { vulnReportWithoutDevDep } = require('./report/newReportingFeature');
13
+ const { checkDevDeps } = require('./report/checkIgnoreDevDep');
14
+ const { newSendSnapShot } = require('../languageAnalysisEngine/sendSnapshot');
15
+ const fs = require('fs');
16
+ const chalk = require('chalk');
17
+ const saveFile = require('../../commands/audit/saveFile').default;
18
+ const generateSbom = require('../../sbom/generateSbom').default;
19
+ module.exports = exports = (err, analysis) => {
20
+ const { identifiedLanguageInfo } = analysis.languageAnalysis;
21
+ const catalogueAppId = analysis.languageAnalysis.appId;
22
+ if (err) {
23
+ console.error(err);
24
+ return;
25
+ }
26
+ const langCallback = async (err, analysis) => {
27
+ const config = analysis.config;
28
+ if (err) {
29
+ console.log();
30
+ console.log('***********' +
31
+ i18n.__('languageAnalysisFactoryFailureHeader') +
32
+ '****************');
33
+ console.log(identifiedLanguageInfo.language);
34
+ console.log();
35
+ console.error(`${identifiedLanguageInfo.language}` +
36
+ i18n.__('languageAnalysisFailure') +
37
+ err);
38
+ return process.exit(5);
39
+ }
40
+ console.log('\n **************CONTRAST OSS ANALYSIS BEGINS**************');
41
+ const snapshotResponse = await newSendSnapShot(analysis, catalogueAppId);
42
+ if (config.report) {
43
+ const ignoreDevUrl = await checkDevDeps(config);
44
+ if (ignoreDevUrl) {
45
+ await vulnReportWithoutDevDep(analysis, catalogueAppId, snapshotResponse.id, config);
46
+ }
47
+ else {
48
+ await vulnerabilityReport(analysis, catalogueAppId, config);
49
+ }
50
+ }
51
+ await auditSave(config);
52
+ console.log('\n ***************CONTRAST OSS ANALYSIS COMPLETE************** \n');
53
+ };
54
+ if (identifiedLanguageInfo.language === DOTNET) {
55
+ dotnetAE(identifiedLanguageInfo, analysis.config, langCallback);
56
+ }
57
+ if (identifiedLanguageInfo.language === NODE) {
58
+ nodeAE(identifiedLanguageInfo, analysis.config, langCallback);
59
+ }
60
+ if (identifiedLanguageInfo.language === JAVA) {
61
+ javaAE(identifiedLanguageInfo, analysis.config, langCallback);
62
+ }
63
+ if (identifiedLanguageInfo.language === RUBY) {
64
+ rubyAE(identifiedLanguageInfo, analysis.config, langCallback);
65
+ }
66
+ if (identifiedLanguageInfo.language === PYTHON) {
67
+ pythonAE(identifiedLanguageInfo, analysis.config, langCallback);
68
+ }
69
+ if (identifiedLanguageInfo.language === PHP) {
70
+ phpAE(identifiedLanguageInfo, analysis.config, langCallback);
71
+ }
72
+ if (identifiedLanguageInfo.language === GO) {
73
+ goAE(identifiedLanguageInfo, analysis.config, langCallback);
74
+ }
75
+ };
76
+ async function auditSave(config) {
77
+ if (config.save) {
78
+ if (config.save.toLowerCase() === 'sbom') {
79
+ saveFile(config, await generateSbom(config));
80
+ const filename = `${config.applicationId}-sbom-cyclonedx.json`;
81
+ if (fs.existsSync(filename)) {
82
+ console.log(i18n.__('auditSBOMSaveSuccess') + ` - ${filename}`);
83
+ }
84
+ else {
85
+ console.log(chalk.yellow.bold(`\n Unable to save ${filename} Software Bill of Materials (SBOM)`));
86
+ }
87
+ }
88
+ else {
89
+ console.log(i18n.__('auditBadFiletypeSpecifiedForSave'));
90
+ }
91
+ }
92
+ else {
93
+ console.log(i18n.__('auditNoFiletypeSpecifiedForSave'));
94
+ }
95
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ const { supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT } } = require('./constants');
3
+ const i18n = require('i18n');
4
+ const DOT_NET_PROJECT_FILE_REGEX = /.+\.csproj$/;
5
+ const DOT_NET_LOCK_FILENAME = 'packages.lock.json';
6
+ const isDotNetProjectFilename = filename => filename.search(DOT_NET_PROJECT_FILE_REGEX) !== -1;
7
+ const isDotNetLockFilename = filename => filename === DOT_NET_LOCK_FILENAME;
8
+ function isJavaMavenProjectFilename(filename) {
9
+ return filename === 'pom.xml';
10
+ }
11
+ function isJavaGradleProjectFilename(filename) {
12
+ return filename === 'build.gradle' || filename === 'build.gradle.kts';
13
+ }
14
+ const isRubyProjectFilename = filename => filename === 'Gemfile';
15
+ const isNodeProjectFilename = filename => filename === 'package.json';
16
+ const isPythonProjectFilename = filename => filename === 'requirements.txt' || filename === 'Pipfile';
17
+ const isPhpProjectFilename = filename => filename === 'composer.json';
18
+ const isPhpLockFilename = filename => filename === 'composer.lock';
19
+ function isNodeLockFilename(filename) {
20
+ return filename === 'package-lock.json' || filename === 'yarn.lock';
21
+ }
22
+ const isRubyLockFilename = filename => filename === 'Gemfile.lock';
23
+ const isPipfileLockLockFilename = filename => filename === 'Pipfile.lock';
24
+ const isGoProjectFilename = filename => filename === 'go.mod';
25
+ const deduceLanguage = filename => {
26
+ const deducedLanguages = [];
27
+ if (isJavaMavenProjectFilename(filename)) {
28
+ deducedLanguages.push({ language: JAVA, projectFilename: filename });
29
+ }
30
+ if (isJavaGradleProjectFilename(filename)) {
31
+ deducedLanguages.push({ language: JAVA, projectFilename: filename });
32
+ }
33
+ if (isNodeProjectFilename(filename)) {
34
+ deducedLanguages.push({ language: NODE, projectFilename: filename });
35
+ }
36
+ if (isDotNetProjectFilename(filename)) {
37
+ deducedLanguages.push({ language: DOTNET, projectFilename: filename });
38
+ }
39
+ if (isRubyProjectFilename(filename)) {
40
+ deducedLanguages.push({ language: RUBY, projectFilename: filename });
41
+ }
42
+ if (isPythonProjectFilename(filename)) {
43
+ deducedLanguages.push({ language: PYTHON, projectFilename: filename });
44
+ }
45
+ if (isPhpProjectFilename(filename)) {
46
+ deducedLanguages.push({ language: PHP, projectFilename: filename });
47
+ }
48
+ if (isDotNetLockFilename(filename)) {
49
+ deducedLanguages.push({ language: DOTNET, lockFilename: filename });
50
+ }
51
+ if (isNodeLockFilename(filename)) {
52
+ deducedLanguages.push({ language: NODE, lockFilename: filename });
53
+ }
54
+ if (isRubyLockFilename(filename)) {
55
+ deducedLanguages.push({ language: RUBY, lockFilename: filename });
56
+ }
57
+ if (isPipfileLockLockFilename(filename)) {
58
+ deducedLanguages.push({ language: PYTHON, lockFilename: filename });
59
+ }
60
+ if (isPhpLockFilename(filename)) {
61
+ deducedLanguages.push({ language: PHP, lockFilename: filename });
62
+ }
63
+ if (isGoProjectFilename(filename)) {
64
+ deducedLanguages.push({ language: GO, projectFilename: filename });
65
+ }
66
+ return deducedLanguages;
67
+ };
68
+ const reduceIdentifiedLanguages = identifiedLanguages => identifiedLanguages.reduce((accumulator, identifiedLanguageInfo) => {
69
+ const { language, projectFilename, lockFilename } = identifiedLanguageInfo;
70
+ if (!(language in accumulator)) {
71
+ accumulator[language] = { projectFilenames: [], lockFilenames: [] };
72
+ }
73
+ if (projectFilename) {
74
+ accumulator[language].projectFilenames.push(projectFilename);
75
+ }
76
+ else {
77
+ accumulator[language].lockFilenames.push(lockFilename);
78
+ }
79
+ return accumulator;
80
+ }, {});
81
+ module.exports = exports = (analysis, next) => {
82
+ const { projectPath, languageAnalysis, config } = analysis;
83
+ let identifiedLanguages = languageAnalysis.projectRootFilenames.reduce((accumulator, filename) => {
84
+ const deducedLanguages = deduceLanguage(filename);
85
+ return [...accumulator, ...deducedLanguages];
86
+ }, []);
87
+ if (Object.keys(identifiedLanguages).length === 0) {
88
+ next(new Error(i18n.__('languageAnalysisNoLanguage', projectPath)));
89
+ return;
90
+ }
91
+ let language = config.language;
92
+ if (language === undefined) {
93
+ languageAnalysis.identifiedLanguages = reduceIdentifiedLanguages(identifiedLanguages);
94
+ }
95
+ else {
96
+ let refinedIdentifiedLanguages = [];
97
+ for (let x in identifiedLanguages) {
98
+ if (identifiedLanguages[x].language === language.toUpperCase() ||
99
+ (identifiedLanguages[x].language === NODE &&
100
+ language.toUpperCase() === JAVASCRIPT)) {
101
+ refinedIdentifiedLanguages.push(identifiedLanguages[x]);
102
+ }
103
+ }
104
+ if (refinedIdentifiedLanguages.length === 0) {
105
+ console.log(`Could not detect language as specified: ${config.language}`);
106
+ process.exit(1);
107
+ }
108
+ languageAnalysis.identifiedLanguages = reduceIdentifiedLanguages(refinedIdentifiedLanguages);
109
+ }
110
+ next();
111
+ };
112
+ exports.isJavaMavenProjectFilename = isJavaMavenProjectFilename;
113
+ exports.isJavaGradleProjectFilename = isJavaGradleProjectFilename;
114
+ exports.isNodeProjectFilename = isNodeProjectFilename;
115
+ exports.isDotNetProjectFilename = isDotNetProjectFilename;
116
+ exports.isDotNetLockFilename = isDotNetLockFilename;
117
+ exports.isGoProjectFilename = isGoProjectFilename;
118
+ exports.isPhpProjectFilename = isPhpProjectFilename;
119
+ exports.isPhpLockFilename = isPhpLockFilename;
120
+ exports.deduceLanguage = deduceLanguage;
121
+ exports.reduceIdentifiedLanguages = reduceIdentifiedLanguages;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ const { getGlobalProperties, getFeatures, isFeatureEnabled } = require('../util/generalAPI');
3
+ const { CLI_IGNORE_DEV_DEPS } = require('../util/capabilities');
4
+ const checkDevDeps = async (config) => {
5
+ const shouldIgnoreDev = config.ignoreDev;
6
+ const globalProperties = await getGlobalProperties();
7
+ const features = getFeatures(globalProperties.internal_version);
8
+ const isfeatureEnabled = isFeatureEnabled(features, CLI_IGNORE_DEV_DEPS);
9
+ let ignoreDevUrl = false;
10
+ if (shouldIgnoreDev) {
11
+ ignoreDevUrl = isfeatureEnabled;
12
+ }
13
+ return ignoreDevUrl;
14
+ };
15
+ module.exports = {
16
+ checkDevDeps
17
+ };