@appland/scanner 1.56.0 → 1.57.0

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 (247) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/built/algorithms/dataStructures/graph/Graph.js +53 -62
  3. package/built/algorithms/dataStructures/graph/GraphEdge.js +13 -16
  4. package/built/algorithms/dataStructures/graph/GraphVertex.js +37 -42
  5. package/built/algorithms/dataStructures/linked-list/LinkedList.js +33 -38
  6. package/built/algorithms/dataStructures/linked-list/LinkedListNode.js +6 -10
  7. package/built/algorithms/graph/depth-first-search/index.js +7 -8
  8. package/built/algorithms/graph/detect-cycle/index.js +15 -16
  9. package/built/algorithms/utils/Comparator.js +19 -21
  10. package/built/analyzer/recordSecrets.js +7 -30
  11. package/built/analyzer/secretsRegexes.js +8 -9
  12. package/built/appMapIndex.js +18 -20
  13. package/built/check.js +16 -18
  14. package/built/checkInstance.js +26 -48
  15. package/built/cli/ci/command.js +61 -156
  16. package/built/cli/ci/options.js +0 -1
  17. package/built/cli/codeVersionArgs.js +0 -1
  18. package/built/cli/exitCode.js +0 -1
  19. package/built/cli/fail.js +2 -3
  20. package/built/cli/merge/command.js +21 -63
  21. package/built/cli/merge/options.js +0 -1
  22. package/built/cli/reportUploadURL.js +2 -3
  23. package/built/cli/resolveAppId.js +34 -85
  24. package/built/cli/scan/command.js +52 -94
  25. package/built/cli/scan/formatReport.js +16 -89
  26. package/built/cli/scan/options.js +0 -1
  27. package/built/cli/scan/scanner.js +38 -117
  28. package/built/cli/scan/singleScan.js +61 -109
  29. package/built/cli/scan/watchScan.js +32 -82
  30. package/built/cli/scan.js +39 -132
  31. package/built/cli/scanArgs.js +0 -1
  32. package/built/cli/scanOptions.js +0 -1
  33. package/built/cli/updateCommitStatus.js +10 -47
  34. package/built/cli/upload/command.js +20 -64
  35. package/built/cli/upload/options.js +0 -1
  36. package/built/cli/upload/pruneAppMap.js +16 -0
  37. package/built/cli/upload.js +91 -172
  38. package/built/cli/validateFile.js +13 -52
  39. package/built/cli.js +34 -21
  40. package/built/configuration/configurationProvider.js +148 -233
  41. package/built/configuration/schema/options.json +76 -76
  42. package/built/configuration/types/checkConfig.js +0 -1
  43. package/built/configuration/types/configuration.js +0 -1
  44. package/built/configuration/types/matchEventConfig.js +0 -1
  45. package/built/configuration/types/matchPatternConfig.js +0 -1
  46. package/built/database/index.js +33 -127
  47. package/built/database/visit.js +16 -66
  48. package/built/errors.js +4 -30
  49. package/built/eventUtil.js +10 -35
  50. package/built/findings.js +3 -4
  51. package/built/integration/appland/app/exists.js +33 -76
  52. package/built/integration/appland/app/listFindingStatus.js +3 -36
  53. package/built/integration/appland/appMap/create.js +38 -89
  54. package/built/integration/appland/location.js +0 -1
  55. package/built/integration/appland/mapset/create.js +34 -85
  56. package/built/integration/appland/retry.js +10 -11
  57. package/built/integration/appland/retryOptions.js +0 -1
  58. package/built/integration/appland/scannerJob/create.js +34 -84
  59. package/built/integration/appland/scannerJob/merge.js +28 -74
  60. package/built/integration/appland/scannerJob.js +0 -1
  61. package/built/integration/github/commitStatus.js +3 -4
  62. package/built/integration/vars.js +1 -2
  63. package/built/openapi/index.js +39 -83
  64. package/built/report/appMapMetadata.js +0 -1
  65. package/built/report/findingSummary.js +0 -1
  66. package/built/report/findingsReport.js +14 -16
  67. package/built/report/scanResults.js +18 -45
  68. package/built/report/scanSummary.js +0 -1
  69. package/built/report/summaryReport.js +12 -13
  70. package/built/ruleChecker.js +146 -297
  71. package/built/rules/authzBeforeAuthn.js +25 -59
  72. package/built/rules/circularDependency.js +69 -101
  73. package/built/rules/deserializationOfUntrustedData.js +29 -63
  74. package/built/rules/execOfUntrustedCommand.js +28 -62
  75. package/built/rules/http-500/metadata.js +0 -1
  76. package/built/rules/http-500/rule.js +2 -3
  77. package/built/rules/illegalPackageDependency.js +16 -18
  78. package/built/rules/incompatibleHttpClientRequest.js +30 -69
  79. package/built/rules/insecureCompare.js +12 -13
  80. package/built/rules/jobNotCancelled.js +13 -45
  81. package/built/rules/lib/hasParameterOrReceiver.js +4 -7
  82. package/built/rules/lib/matchEvent.js +12 -13
  83. package/built/rules/lib/matchPattern.js +6 -7
  84. package/built/rules/lib/metadata.js +0 -1
  85. package/built/rules/lib/parseRuleDescription.js +5 -6
  86. package/built/rules/lib/precedingEvents.js +7 -75
  87. package/built/rules/lib/rpcWithoutProtection.js +5 -28
  88. package/built/rules/lib/sanitizesData.js +0 -1
  89. package/built/rules/lib/util.js +33 -73
  90. package/built/rules/logoutWithoutSessionReset.js +24 -58
  91. package/built/rules/missingAuthentication.js +28 -28
  92. package/built/rules/missingContentType.js +8 -9
  93. package/built/rules/nPlusOneQuery.js +35 -87
  94. package/built/rules/queryFromInvalidPackage.js +17 -19
  95. package/built/rules/queryFromView.js +13 -16
  96. package/built/rules/rpcWithoutCircuitBreaker.js +14 -84
  97. package/built/rules/saveWithoutValidation.js +8 -9
  98. package/built/rules/secretInLog.js +29 -92
  99. package/built/rules/slowFunctionCall.js +16 -20
  100. package/built/rules/slowHttpServerRequest.js +9 -11
  101. package/built/rules/slowQuery.js +9 -12
  102. package/built/rules/tooManyJoins.js +26 -51
  103. package/built/rules/tooManyUpdates.js +25 -105
  104. package/built/rules/unbatchedMaterializedQuery.js +26 -30
  105. package/built/rules/updateInGetRequest.js +30 -45
  106. package/built/scope/commandScope.js +24 -144
  107. package/built/scope/httpClientRequestScope.js +11 -98
  108. package/built/scope/httpServerRequestScope.js +11 -98
  109. package/built/scope/rootScope.js +11 -98
  110. package/built/scope/scopeImpl.js +10 -82
  111. package/built/scope/scopeIterator.js +6 -10
  112. package/built/scope/sqlTransactionScope.js +24 -122
  113. package/built/sqlWarning.js +9 -35
  114. package/built/telemetry.js +215 -0
  115. package/built/wellKnownLabels.js +0 -1
  116. package/package.json +7 -3
  117. package/built/algorithms/dataStructures/graph/Graph.js.map +0 -1
  118. package/built/algorithms/dataStructures/graph/GraphEdge.js.map +0 -1
  119. package/built/algorithms/dataStructures/graph/GraphVertex.js.map +0 -1
  120. package/built/algorithms/dataStructures/linked-list/LinkedList.js.map +0 -1
  121. package/built/algorithms/dataStructures/linked-list/LinkedListNode.js.map +0 -1
  122. package/built/algorithms/graph/depth-first-search/index.js.map +0 -1
  123. package/built/algorithms/graph/detect-cycle/index.js.map +0 -1
  124. package/built/algorithms/utils/Comparator.js.map +0 -1
  125. package/built/analyzer/recordSecrets.js.map +0 -1
  126. package/built/analyzer/secretsRegexes.js.map +0 -1
  127. package/built/appMapIndex.js.map +0 -1
  128. package/built/check.js.map +0 -1
  129. package/built/checkInstance.js.map +0 -1
  130. package/built/cli/ci/command.js.map +0 -1
  131. package/built/cli/ci/options.js.map +0 -1
  132. package/built/cli/codeVersionArgs.js.map +0 -1
  133. package/built/cli/exitCode.js.map +0 -1
  134. package/built/cli/fail.js.map +0 -1
  135. package/built/cli/merge/command.js.map +0 -1
  136. package/built/cli/merge/options.js.map +0 -1
  137. package/built/cli/reportUploadURL.js.map +0 -1
  138. package/built/cli/resolveAppId.js.map +0 -1
  139. package/built/cli/scan/command.js.map +0 -1
  140. package/built/cli/scan/formatReport.js.map +0 -1
  141. package/built/cli/scan/options.js.map +0 -1
  142. package/built/cli/scan/scanner.js.map +0 -1
  143. package/built/cli/scan/singleScan.js.map +0 -1
  144. package/built/cli/scan/watchScan.js.map +0 -1
  145. package/built/cli/scan.js.map +0 -1
  146. package/built/cli/scanArgs.js.map +0 -1
  147. package/built/cli/scanOptions.js.map +0 -1
  148. package/built/cli/updateCommitStatus.js.map +0 -1
  149. package/built/cli/upload/command.js.map +0 -1
  150. package/built/cli/upload/options.js.map +0 -1
  151. package/built/cli/upload.js.map +0 -1
  152. package/built/cli/validateFile.js.map +0 -1
  153. package/built/cli.js.map +0 -1
  154. package/built/configuration/configurationProvider.js.map +0 -1
  155. package/built/configuration/types/checkConfig.js.map +0 -1
  156. package/built/configuration/types/configuration.js.map +0 -1
  157. package/built/configuration/types/matchEventConfig.js.map +0 -1
  158. package/built/configuration/types/matchPatternConfig.js.map +0 -1
  159. package/built/database/index.js.map +0 -1
  160. package/built/database/visit.js.map +0 -1
  161. package/built/errors.js.map +0 -1
  162. package/built/eventUtil.js.map +0 -1
  163. package/built/findings.js.map +0 -1
  164. package/built/integration/appland/app/exists.js.map +0 -1
  165. package/built/integration/appland/app/listFindingStatus.js.map +0 -1
  166. package/built/integration/appland/appMap/create.js.map +0 -1
  167. package/built/integration/appland/location.js.map +0 -1
  168. package/built/integration/appland/mapset/create.js.map +0 -1
  169. package/built/integration/appland/retry.js.map +0 -1
  170. package/built/integration/appland/retryOptions.js.map +0 -1
  171. package/built/integration/appland/scannerJob/create.js.map +0 -1
  172. package/built/integration/appland/scannerJob/merge.js.map +0 -1
  173. package/built/integration/appland/scannerJob.js.map +0 -1
  174. package/built/integration/github/commitStatus.js.map +0 -1
  175. package/built/integration/vars.js.map +0 -1
  176. package/built/openapi/index.js.map +0 -1
  177. package/built/openapi/method.js +0 -120
  178. package/built/openapi/method.js.map +0 -1
  179. package/built/openapi/model.js +0 -49
  180. package/built/openapi/model.js.map +0 -1
  181. package/built/openapi/path.js +0 -36
  182. package/built/openapi/path.js.map +0 -1
  183. package/built/openapi/provider.js +0 -133
  184. package/built/openapi/provider.js.map +0 -1
  185. package/built/openapi/response.js +0 -59
  186. package/built/openapi/response.js.map +0 -1
  187. package/built/openapi/rpcRequest.js +0 -130
  188. package/built/openapi/rpcRequest.js.map +0 -1
  189. package/built/openapi/schema.js +0 -42
  190. package/built/openapi/schema.js.map +0 -1
  191. package/built/openapi/securitySchemes.js +0 -32
  192. package/built/openapi/securitySchemes.js.map +0 -1
  193. package/built/openapi/statusCodes.js +0 -68
  194. package/built/openapi/statusCodes.js.map +0 -1
  195. package/built/openapi/util.js +0 -91
  196. package/built/openapi/util.js.map +0 -1
  197. package/built/report/appMapMetadata.js.map +0 -1
  198. package/built/report/findingSummary.js.map +0 -1
  199. package/built/report/findingsReport.js.map +0 -1
  200. package/built/report/scanResults.js.map +0 -1
  201. package/built/report/scanSummary.js.map +0 -1
  202. package/built/report/summaryReport.js.map +0 -1
  203. package/built/ruleChecker.js.map +0 -1
  204. package/built/rules/authzBeforeAuthn.js.map +0 -1
  205. package/built/rules/circularDependency.js.map +0 -1
  206. package/built/rules/deserializationOfUntrustedData.js.map +0 -1
  207. package/built/rules/execOfUntrustedCommand.js.map +0 -1
  208. package/built/rules/http-500/metadata.js.map +0 -1
  209. package/built/rules/http-500/rule.js.map +0 -1
  210. package/built/rules/illegalPackageDependency.js.map +0 -1
  211. package/built/rules/incompatibleHttpClientRequest.js.map +0 -1
  212. package/built/rules/insecureCompare.js.map +0 -1
  213. package/built/rules/jobNotCancelled.js.map +0 -1
  214. package/built/rules/lib/hasParameterOrReceiver.js.map +0 -1
  215. package/built/rules/lib/matchEvent.js.map +0 -1
  216. package/built/rules/lib/matchPattern.js.map +0 -1
  217. package/built/rules/lib/metadata.js.map +0 -1
  218. package/built/rules/lib/parseRuleDescription.js.map +0 -1
  219. package/built/rules/lib/precedingEvents.js.map +0 -1
  220. package/built/rules/lib/rpcWithoutProtection.js.map +0 -1
  221. package/built/rules/lib/sanitizesData.js.map +0 -1
  222. package/built/rules/lib/util.js.map +0 -1
  223. package/built/rules/logoutWithoutSessionReset.js.map +0 -1
  224. package/built/rules/missingAuthentication.js.map +0 -1
  225. package/built/rules/missingContentType.js.map +0 -1
  226. package/built/rules/nPlusOneQuery.js.map +0 -1
  227. package/built/rules/queryFromInvalidPackage.js.map +0 -1
  228. package/built/rules/queryFromView.js.map +0 -1
  229. package/built/rules/rpcWithoutCircuitBreaker.js.map +0 -1
  230. package/built/rules/saveWithoutValidation.js.map +0 -1
  231. package/built/rules/secretInLog.js.map +0 -1
  232. package/built/rules/slowFunctionCall.js.map +0 -1
  233. package/built/rules/slowHttpServerRequest.js.map +0 -1
  234. package/built/rules/slowQuery.js.map +0 -1
  235. package/built/rules/tooManyJoins.js.map +0 -1
  236. package/built/rules/tooManyUpdates.js.map +0 -1
  237. package/built/rules/unbatchedMaterializedQuery.js.map +0 -1
  238. package/built/rules/updateInGetRequest.js.map +0 -1
  239. package/built/scope/commandScope.js.map +0 -1
  240. package/built/scope/httpClientRequestScope.js.map +0 -1
  241. package/built/scope/httpServerRequestScope.js.map +0 -1
  242. package/built/scope/rootScope.js.map +0 -1
  243. package/built/scope/scopeImpl.js.map +0 -1
  244. package/built/scope/scopeIterator.js.map +0 -1
  245. package/built/scope/sqlTransactionScope.js.map +0 -1
  246. package/built/sqlWarning.js.map +0 -1
  247. package/built/wellKnownLabels.js.map +0 -1
@@ -31,272 +31,187 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
31
31
  step((generator = generator.apply(thisArg, _arguments || [])).next());
32
32
  });
33
33
  };
34
- var __generator = (this && this.__generator) || function (thisArg, body) {
35
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
- function verb(n) { return function (v) { return step([n, v]); }; }
38
- function step(op) {
39
- if (f) throw new TypeError("Generator is already executing.");
40
- while (_) try {
41
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
- if (y = 0, t) op = [op[0] & 2, t.value];
43
- switch (op[0]) {
44
- case 0: case 1: t = op; break;
45
- case 4: _.label++; return { value: op[1], done: false };
46
- case 5: _.label++; y = op[1]; op = [0]; continue;
47
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
- default:
49
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
- if (t[2]) _.ops.pop();
54
- _.trys.pop(); continue;
55
- }
56
- op = body.call(thisArg, _);
57
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
- }
60
- };
61
34
  var __importDefault = (this && this.__importDefault) || function (mod) {
62
35
  return (mod && mod.__esModule) ? mod : { "default": mod };
63
36
  };
64
37
  Object.defineProperty(exports, "__esModule", { value: true });
65
38
  exports.parseConfigFile = exports.loadConfig = exports.loadRule = void 0;
66
- var ajv_1 = __importDefault(require("ajv"));
67
- var js_yaml_1 = __importDefault(require("js-yaml"));
68
- var fs_1 = require("fs");
69
- var check_1 = __importDefault(require("../check"));
70
- var util_1 = require("../rules/lib/util");
71
- var matchEvent_1 = require("../rules/lib/matchEvent");
72
- var parseRuleDescription_1 = __importDefault(require("../rules/lib/parseRuleDescription"));
73
- var options_json_1 = __importDefault(require("./schema/options.json"));
74
- var match_pattern_config_json_1 = __importDefault(require("./schema/match-pattern-config.json"));
75
- var url_1 = require("url");
76
- var util_2 = require("util");
77
- var path_1 = require("path");
78
- var ajv = new ajv_1.default();
39
+ const ajv_1 = __importDefault(require("ajv"));
40
+ const js_yaml_1 = __importDefault(require("js-yaml"));
41
+ const fs_1 = require("fs");
42
+ const check_1 = __importDefault(require("../check"));
43
+ const util_1 = require("../rules/lib/util");
44
+ const matchEvent_1 = require("../rules/lib/matchEvent");
45
+ const parseRuleDescription_1 = __importDefault(require("../rules/lib/parseRuleDescription"));
46
+ const options_json_1 = __importDefault(require("./schema/options.json"));
47
+ const match_pattern_config_json_1 = __importDefault(require("./schema/match-pattern-config.json"));
48
+ const url_1 = require("url");
49
+ const util_2 = require("util");
50
+ const path_1 = require("path");
51
+ const ajv = new ajv_1.default();
79
52
  ajv.addSchema(match_pattern_config_json_1.default);
80
53
  function loadFromFile(ruleName) {
81
- var _this = this;
82
- return function () { return __awaiter(_this, void 0, void 0, function () {
83
- var ruleSpec, e_1;
84
- return __generator(this, function (_a) {
85
- switch (_a.label) {
86
- case 0:
87
- _a.trys.push([0, 2, , 3]);
88
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("../rules/".concat(ruleName))); })];
89
- case 1:
90
- ruleSpec = _a.sent();
91
- return [3 /*break*/, 3];
92
- case 2:
93
- e_1 = _a.sent();
94
- return [2 /*return*/];
95
- case 3: return [2 /*return*/, ruleSpec.default];
96
- }
97
- });
98
- }); };
54
+ return () => __awaiter(this, void 0, void 0, function* () {
55
+ let ruleSpec;
56
+ try {
57
+ ruleSpec = yield Promise.resolve().then(() => __importStar(require(`../rules/${ruleName}`)));
58
+ }
59
+ catch (e) {
60
+ return;
61
+ }
62
+ return ruleSpec.default;
63
+ });
99
64
  }
100
65
  function loadFromDir(ruleName) {
101
- var _this = this;
102
- return function () { return __awaiter(_this, void 0, void 0, function () {
103
- var metadata, rule, options, e_2, _a, _b, description, references;
104
- return __generator(this, function (_c) {
105
- switch (_c.label) {
106
- case 0:
107
- _c.trys.push([0, 2, , 3]);
108
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("../rules/".concat(ruleName, "/metadata"))); })];
109
- case 1:
110
- metadata = (_c.sent()).default;
111
- return [3 /*break*/, 3];
112
- case 2:
113
- e_2 = _c.sent();
114
- return [2 /*return*/];
115
- case 3:
116
- _c.trys.push([3, 5, , 6]);
117
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("../rules/".concat(ruleName, "/rule"))); })];
118
- case 4:
119
- rule = (_c.sent()).default;
120
- return [3 /*break*/, 6];
121
- case 5:
122
- _a = _c.sent();
123
- console.warn("Rule ".concat(ruleName, " has no rule.js or rule.ts file, or the file doesn't have a default export"));
124
- return [2 /*return*/];
125
- case 6:
126
- if ((0, util_1.verbose)())
127
- console.log("Loaded rule ".concat(ruleName, ": ").concat(rule));
128
- _c.label = 7;
129
- case 7:
130
- _c.trys.push([7, 9, , 10]);
131
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("../rules/".concat(ruleName, "/options"))); })];
132
- case 8:
133
- options = _c.sent();
134
- if ((0, util_1.verbose)())
135
- console.log("Loaded rule ".concat(ruleName, " options: ").concat(options));
136
- return [3 /*break*/, 10];
137
- case 9:
138
- _b = _c.sent();
139
- return [3 /*break*/, 10];
140
- case 10:
141
- description = (0, parseRuleDescription_1.default)(ruleName);
142
- references = Object.keys(metadata.references || {}).reduce(function (memo, key) {
143
- memo[key] = new url_1.URL(metadata.references[key]);
144
- return memo;
145
- }, {});
146
- return [2 /*return*/, {
147
- id: (0, util_1.dasherize)(ruleName),
148
- title: metadata.title,
149
- description: description,
150
- url: "https://appland.com/docs/analysis/rules-reference.html#".concat((0, util_1.dasherize)(ruleName)),
151
- labels: metadata.labels || [],
152
- scope: metadata.scope,
153
- enumerateScope: metadata.enumerateScope,
154
- impactDomain: metadata.impactDomain,
155
- references: references,
156
- Options: options,
157
- build: rule,
158
- }];
159
- }
160
- });
161
- }); };
66
+ return () => __awaiter(this, void 0, void 0, function* () {
67
+ let metadata;
68
+ let rule;
69
+ let options;
70
+ try {
71
+ metadata = (yield Promise.resolve().then(() => __importStar(require(`../rules/${ruleName}/metadata`)))).default;
72
+ }
73
+ catch (e) {
74
+ return;
75
+ }
76
+ try {
77
+ rule = (yield Promise.resolve().then(() => __importStar(require(`../rules/${ruleName}/rule`)))).default;
78
+ }
79
+ catch (_a) {
80
+ console.warn(`Rule ${ruleName} has no rule.js or rule.ts file, or the file doesn't have a default export`);
81
+ return;
82
+ }
83
+ if ((0, util_1.verbose)())
84
+ console.log(`Loaded rule ${ruleName}: ${rule}`);
85
+ try {
86
+ options = yield Promise.resolve().then(() => __importStar(require(`../rules/${ruleName}/options`)));
87
+ if ((0, util_1.verbose)())
88
+ console.log(`Loaded rule ${ruleName} options: ${options}`);
89
+ }
90
+ catch (_b) {
91
+ // This is OK
92
+ }
93
+ const description = (0, parseRuleDescription_1.default)(ruleName);
94
+ const references = Object.keys(metadata.references || {}).reduce((memo, key) => {
95
+ memo[key] = new url_1.URL(metadata.references[key]);
96
+ return memo;
97
+ }, {});
98
+ return {
99
+ id: (0, util_1.dasherize)(ruleName),
100
+ title: metadata.title,
101
+ description,
102
+ url: `https://appland.com/docs/analysis/rules-reference.html#${(0, util_1.dasherize)(ruleName)}`,
103
+ labels: metadata.labels || [],
104
+ scope: metadata.scope,
105
+ enumerateScope: metadata.enumerateScope,
106
+ impactDomain: metadata.impactDomain,
107
+ references,
108
+ Options: options,
109
+ build: rule,
110
+ };
111
+ });
162
112
  }
163
113
  function buildBuiltinCheck(config) {
164
- return __awaiter(this, void 0, void 0, function () {
165
- var rule, options, check;
166
- return __generator(this, function (_a) {
167
- switch (_a.label) {
168
- case 0: return [4 /*yield*/, loadRule(config.rule)];
169
- case 1:
170
- rule = _a.sent();
171
- if ((0, util_1.verbose)()) {
172
- console.log("Loaded rule: ".concat(rule));
173
- }
174
- if (rule.Options) {
175
- options = new rule.Options();
176
- }
177
- else {
178
- options = {};
179
- }
180
- if (config.properties) {
181
- Object.keys(config.properties).forEach(function (name) {
182
- var value = config.properties[name];
183
- options[name] = value;
184
- });
185
- }
186
- check = new check_1.default(rule, options);
187
- if (config.scope) {
188
- check.scope = config.scope;
189
- }
190
- if (config.id) {
191
- check.id = (0, util_1.dasherize)(config.id);
192
- }
193
- check.includeScope = (0, matchEvent_1.buildFilters)((config.include || []).filter(function (item) { return item.scope; }).map(function (item) { return item.scope; }));
194
- check.excludeScope = (0, matchEvent_1.buildFilters)((config.exclude || []).filter(function (item) { return item.scope; }).map(function (item) { return item.scope; }));
195
- check.includeEvent = (0, matchEvent_1.buildFilters)((config.include || []).filter(function (item) { return item.event; }).map(function (item) { return item.event; }));
196
- check.excludeEvent = (0, matchEvent_1.buildFilters)((config.exclude || []).filter(function (item) { return item.event; }).map(function (item) { return item.event; }));
197
- if ((0, util_1.verbose)()) {
198
- console.log("Loaded check: ".concat(check));
199
- }
200
- return [2 /*return*/, check];
201
- }
202
- });
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ const rule = yield loadRule(config.rule);
116
+ if ((0, util_1.verbose)()) {
117
+ console.log(`Loaded rule: ${rule}`);
118
+ }
119
+ let options;
120
+ if (rule.Options) {
121
+ options = new rule.Options();
122
+ }
123
+ else {
124
+ options = {};
125
+ }
126
+ if (config.properties) {
127
+ Object.keys(config.properties).forEach((name) => {
128
+ const value = config.properties[name];
129
+ options[name] = value;
130
+ });
131
+ }
132
+ const check = new check_1.default(rule, options);
133
+ if (config.scope) {
134
+ check.scope = config.scope;
135
+ }
136
+ if (config.id) {
137
+ check.id = (0, util_1.dasherize)(config.id);
138
+ }
139
+ check.includeScope = (0, matchEvent_1.buildFilters)((config.include || []).filter((item) => item.scope).map((item) => item.scope));
140
+ check.excludeScope = (0, matchEvent_1.buildFilters)((config.exclude || []).filter((item) => item.scope).map((item) => item.scope));
141
+ check.includeEvent = (0, matchEvent_1.buildFilters)((config.include || []).filter((item) => item.event).map((item) => item.event));
142
+ check.excludeEvent = (0, matchEvent_1.buildFilters)((config.exclude || []).filter((item) => item.event).map((item) => item.event));
143
+ if ((0, util_1.verbose)()) {
144
+ console.log(`Loaded check: ${check}`);
145
+ }
146
+ return check;
203
147
  });
204
148
  }
205
- var validate = function (validator, data, context) {
206
- var valid = validator(data);
149
+ const validate = (validator, data, context) => {
150
+ const valid = validator(data);
207
151
  if (!valid) {
208
152
  throw new Error(validator
209
- .errors.map(function (err) {
210
- var instance = err.instancePath;
153
+ .errors.map((err) => {
154
+ let instance = err.instancePath;
211
155
  if (!instance || instance === '') {
212
156
  instance = context;
213
157
  }
214
- return "".concat(instance, " ").concat(err.message, " (").concat(err.schemaPath, ")");
158
+ return `${instance} ${err.message} (${err.schemaPath})`;
215
159
  })
216
160
  .join(', '));
217
161
  }
218
162
  };
219
163
  function loadRule(ruleName) {
220
- return __awaiter(this, void 0, void 0, function () {
221
- var ruleId, rules, rule;
222
- var _this = this;
223
- return __generator(this, function (_a) {
224
- switch (_a.label) {
225
- case 0:
226
- ruleId = (0, util_1.dasherize)(ruleName);
227
- return [4 /*yield*/, Promise.all([
228
- loadFromDir(ruleId),
229
- loadFromFile(ruleId),
230
- loadFromDir((0, util_1.camelize)(ruleId)),
231
- loadFromFile((0, util_1.camelize)(ruleId)),
232
- ].map(function (loader) { return __awaiter(_this, void 0, void 0, function () {
233
- return __generator(this, function (_a) {
234
- switch (_a.label) {
235
- case 0: return [4 /*yield*/, loader()];
236
- case 1: return [2 /*return*/, _a.sent()];
237
- }
238
- });
239
- }); }))];
240
- case 1:
241
- rules = _a.sent();
242
- rule = rules.find(function (rule) { return rule; });
243
- if (!rule)
244
- throw new Error("Rule ".concat(ruleName, " not found"));
245
- return [2 /*return*/, rule];
246
- }
247
- });
164
+ return __awaiter(this, void 0, void 0, function* () {
165
+ const ruleId = (0, util_1.dasherize)(ruleName);
166
+ const rules = yield Promise.all([
167
+ loadFromDir(ruleId),
168
+ loadFromFile(ruleId),
169
+ loadFromDir((0, util_1.camelize)(ruleId)),
170
+ loadFromFile((0, util_1.camelize)(ruleId)),
171
+ ].map((loader) => __awaiter(this, void 0, void 0, function* () {
172
+ return yield loader();
173
+ })));
174
+ const rule = rules.find((rule) => rule);
175
+ if (!rule)
176
+ throw new Error(`Rule ${ruleName} not found`);
177
+ return rule;
248
178
  });
249
179
  }
250
180
  exports.loadRule = loadRule;
251
181
  function loadConfig(config) {
252
- return __awaiter(this, void 0, void 0, function () {
253
- var _this = this;
254
- return __generator(this, function (_a) {
255
- config.checks
256
- .filter(function (check) { return check.properties; })
257
- .forEach(function (check) {
258
- var ruleId = check.rule;
259
- var schemaKey = [(0, util_1.capitalize)(ruleId), 'Options'].join('.');
260
- if ((0, util_1.verbose)()) {
261
- console.warn(schemaKey);
262
- }
263
- var propertiesSchema = options_json_1.default.definitions[schemaKey];
264
- if (!propertiesSchema) {
265
- return;
266
- }
267
- if ((0, util_1.verbose)()) {
268
- console.warn(propertiesSchema);
269
- console.warn(check.properties);
270
- }
271
- validate(ajv.compile(propertiesSchema), check.properties || {}, "".concat(ruleId, " properties"));
272
- });
273
- return [2 /*return*/, Promise.all(config.checks.map(function (c) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
274
- return [2 /*return*/, buildBuiltinCheck(c)];
275
- }); }); }))];
182
+ return __awaiter(this, void 0, void 0, function* () {
183
+ config.checks
184
+ .filter((check) => check.properties)
185
+ .forEach((check) => {
186
+ const ruleId = check.rule;
187
+ const schemaKey = [(0, util_1.capitalize)(ruleId), 'Options'].join('.');
188
+ if ((0, util_1.verbose)()) {
189
+ console.warn(schemaKey);
190
+ }
191
+ const propertiesSchema = options_json_1.default.definitions[schemaKey];
192
+ if (!propertiesSchema) {
193
+ return;
194
+ }
195
+ if ((0, util_1.verbose)()) {
196
+ console.warn(propertiesSchema);
197
+ console.warn(check.properties);
198
+ }
199
+ validate(ajv.compile(propertiesSchema), check.properties || {}, `${ruleId} properties`);
276
200
  });
201
+ return Promise.all(config.checks.map((c) => __awaiter(this, void 0, void 0, function* () { return buildBuiltinCheck(c); })));
277
202
  });
278
203
  }
279
204
  exports.loadConfig = loadConfig;
280
205
  function parseConfigFile(configPath) {
281
- return __awaiter(this, void 0, void 0, function () {
282
- var yamlConfig;
283
- return __generator(this, function (_a) {
284
- switch (_a.label) {
285
- case 0: return [4 /*yield*/, (0, util_2.promisify)(fs_1.exists)(configPath)];
286
- case 1:
287
- if (!(_a.sent())) {
288
- configPath = (0, path_1.join)(__dirname, '../sampleConfig/default.yml');
289
- }
290
- console.log("Using scanner configuration file ".concat(configPath));
291
- return [4 /*yield*/, fs_1.promises.readFile(configPath, 'utf-8')];
292
- case 2:
293
- yamlConfig = _a.sent();
294
- return [2 /*return*/, js_yaml_1.default.load(yamlConfig, {
295
- filename: configPath,
296
- })];
297
- }
206
+ return __awaiter(this, void 0, void 0, function* () {
207
+ if (!(yield (0, util_2.promisify)(fs_1.exists)(configPath))) {
208
+ configPath = (0, path_1.join)(__dirname, '../sampleConfig/default.yml');
209
+ }
210
+ console.log(`Using scanner configuration file ${configPath}`);
211
+ const yamlConfig = yield fs_1.promises.readFile(configPath, 'utf-8');
212
+ return js_yaml_1.default.load(yamlConfig, {
213
+ filename: configPath,
298
214
  });
299
215
  });
300
216
  }
301
217
  exports.parseConfigFile = parseConfigFile;
302
- //# sourceMappingURL=configurationProvider.js.map