@appland/scanner 1.54.1 → 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 (244) hide show
  1. package/CHANGELOG.md +31 -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 -147
  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 +58 -233
  25. package/built/cli/scan/formatReport.js +44 -0
  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 +80 -0
  29. package/built/cli/scan/watchScan.js +84 -0
  30. package/built/cli/scan.js +39 -132
  31. package/built/cli/scanArgs.js +2 -4
  32. package/built/cli/scanOptions.js +0 -1
  33. package/built/cli/updateCommitStatus.js +10 -47
  34. package/built/cli/upload/command.js +21 -65
  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 -48
  39. package/built/cli.js +34 -21
  40. package/built/configuration/configurationProvider.js +148 -227
  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 +5 -38
  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 +48 -25
  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 +30 -93
  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 +10 -4
  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/options.js.map +0 -1
  141. package/built/cli/scan/scanner.js.map +0 -1
  142. package/built/cli/scan.js.map +0 -1
  143. package/built/cli/scanArgs.js.map +0 -1
  144. package/built/cli/scanOptions.js.map +0 -1
  145. package/built/cli/updateCommitStatus.js.map +0 -1
  146. package/built/cli/upload/command.js.map +0 -1
  147. package/built/cli/upload/options.js.map +0 -1
  148. package/built/cli/upload.js.map +0 -1
  149. package/built/cli/validateFile.js.map +0 -1
  150. package/built/cli.js.map +0 -1
  151. package/built/configuration/configurationProvider.js.map +0 -1
  152. package/built/configuration/types/checkConfig.js.map +0 -1
  153. package/built/configuration/types/configuration.js.map +0 -1
  154. package/built/configuration/types/matchEventConfig.js.map +0 -1
  155. package/built/configuration/types/matchPatternConfig.js.map +0 -1
  156. package/built/database/index.js.map +0 -1
  157. package/built/database/visit.js.map +0 -1
  158. package/built/errors.js.map +0 -1
  159. package/built/eventUtil.js.map +0 -1
  160. package/built/findings.js.map +0 -1
  161. package/built/integration/appland/app/exists.js.map +0 -1
  162. package/built/integration/appland/app/listFindingStatus.js.map +0 -1
  163. package/built/integration/appland/appMap/create.js.map +0 -1
  164. package/built/integration/appland/location.js.map +0 -1
  165. package/built/integration/appland/mapset/create.js.map +0 -1
  166. package/built/integration/appland/retry.js.map +0 -1
  167. package/built/integration/appland/retryOptions.js.map +0 -1
  168. package/built/integration/appland/scannerJob/create.js.map +0 -1
  169. package/built/integration/appland/scannerJob/merge.js.map +0 -1
  170. package/built/integration/appland/scannerJob.js.map +0 -1
  171. package/built/integration/github/commitStatus.js.map +0 -1
  172. package/built/integration/vars.js.map +0 -1
  173. package/built/openapi/index.js.map +0 -1
  174. package/built/openapi/method.js +0 -120
  175. package/built/openapi/method.js.map +0 -1
  176. package/built/openapi/model.js +0 -49
  177. package/built/openapi/model.js.map +0 -1
  178. package/built/openapi/path.js +0 -36
  179. package/built/openapi/path.js.map +0 -1
  180. package/built/openapi/provider.js +0 -133
  181. package/built/openapi/provider.js.map +0 -1
  182. package/built/openapi/response.js +0 -59
  183. package/built/openapi/response.js.map +0 -1
  184. package/built/openapi/rpcRequest.js +0 -130
  185. package/built/openapi/rpcRequest.js.map +0 -1
  186. package/built/openapi/schema.js +0 -42
  187. package/built/openapi/schema.js.map +0 -1
  188. package/built/openapi/securitySchemes.js +0 -32
  189. package/built/openapi/securitySchemes.js.map +0 -1
  190. package/built/openapi/statusCodes.js +0 -68
  191. package/built/openapi/statusCodes.js.map +0 -1
  192. package/built/openapi/util.js +0 -91
  193. package/built/openapi/util.js.map +0 -1
  194. package/built/report/appMapMetadata.js.map +0 -1
  195. package/built/report/findingSummary.js.map +0 -1
  196. package/built/report/findingsReport.js.map +0 -1
  197. package/built/report/scanResults.js.map +0 -1
  198. package/built/report/scanSummary.js.map +0 -1
  199. package/built/report/summaryReport.js.map +0 -1
  200. package/built/ruleChecker.js.map +0 -1
  201. package/built/rules/authzBeforeAuthn.js.map +0 -1
  202. package/built/rules/circularDependency.js.map +0 -1
  203. package/built/rules/deserializationOfUntrustedData.js.map +0 -1
  204. package/built/rules/execOfUntrustedCommand.js.map +0 -1
  205. package/built/rules/http-500/metadata.js.map +0 -1
  206. package/built/rules/http-500/rule.js.map +0 -1
  207. package/built/rules/illegalPackageDependency.js.map +0 -1
  208. package/built/rules/incompatibleHttpClientRequest.js.map +0 -1
  209. package/built/rules/insecureCompare.js.map +0 -1
  210. package/built/rules/jobNotCancelled.js.map +0 -1
  211. package/built/rules/lib/hasParameterOrReceiver.js.map +0 -1
  212. package/built/rules/lib/matchEvent.js.map +0 -1
  213. package/built/rules/lib/matchPattern.js.map +0 -1
  214. package/built/rules/lib/metadata.js.map +0 -1
  215. package/built/rules/lib/parseRuleDescription.js.map +0 -1
  216. package/built/rules/lib/precedingEvents.js.map +0 -1
  217. package/built/rules/lib/rpcWithoutProtection.js.map +0 -1
  218. package/built/rules/lib/sanitizesData.js.map +0 -1
  219. package/built/rules/lib/util.js.map +0 -1
  220. package/built/rules/logoutWithoutSessionReset.js.map +0 -1
  221. package/built/rules/missingAuthentication.js.map +0 -1
  222. package/built/rules/missingContentType.js.map +0 -1
  223. package/built/rules/nPlusOneQuery.js.map +0 -1
  224. package/built/rules/queryFromInvalidPackage.js.map +0 -1
  225. package/built/rules/queryFromView.js.map +0 -1
  226. package/built/rules/rpcWithoutCircuitBreaker.js.map +0 -1
  227. package/built/rules/saveWithoutValidation.js.map +0 -1
  228. package/built/rules/secretInLog.js.map +0 -1
  229. package/built/rules/slowFunctionCall.js.map +0 -1
  230. package/built/rules/slowHttpServerRequest.js.map +0 -1
  231. package/built/rules/slowQuery.js.map +0 -1
  232. package/built/rules/tooManyJoins.js.map +0 -1
  233. package/built/rules/tooManyUpdates.js.map +0 -1
  234. package/built/rules/unbatchedMaterializedQuery.js.map +0 -1
  235. package/built/rules/updateInGetRequest.js.map +0 -1
  236. package/built/scope/commandScope.js.map +0 -1
  237. package/built/scope/httpClientRequestScope.js.map +0 -1
  238. package/built/scope/httpServerRequestScope.js.map +0 -1
  239. package/built/scope/rootScope.js.map +0 -1
  240. package/built/scope/scopeImpl.js.map +0 -1
  241. package/built/scope/scopeIterator.js.map +0 -1
  242. package/built/scope/sqlTransactionScope.js.map +0 -1
  243. package/built/sqlWarning.js.map +0 -1
  244. package/built/wellKnownLabels.js.map +0 -1
@@ -31,266 +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 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();
77
52
  ajv.addSchema(match_pattern_config_json_1.default);
78
53
  function loadFromFile(ruleName) {
79
- var _this = this;
80
- return function () { return __awaiter(_this, void 0, void 0, function () {
81
- var ruleSpec, e_1;
82
- return __generator(this, function (_a) {
83
- switch (_a.label) {
84
- case 0:
85
- _a.trys.push([0, 2, , 3]);
86
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("../rules/".concat(ruleName))); })];
87
- case 1:
88
- ruleSpec = _a.sent();
89
- return [3 /*break*/, 3];
90
- case 2:
91
- e_1 = _a.sent();
92
- return [2 /*return*/];
93
- case 3: return [2 /*return*/, ruleSpec.default];
94
- }
95
- });
96
- }); };
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
+ });
97
64
  }
98
65
  function loadFromDir(ruleName) {
99
- var _this = this;
100
- return function () { return __awaiter(_this, void 0, void 0, function () {
101
- var metadata, rule, options, e_2, _a, _b, description, references;
102
- return __generator(this, function (_c) {
103
- switch (_c.label) {
104
- case 0:
105
- _c.trys.push([0, 2, , 3]);
106
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("../rules/".concat(ruleName, "/metadata"))); })];
107
- case 1:
108
- metadata = (_c.sent()).default;
109
- return [3 /*break*/, 3];
110
- case 2:
111
- e_2 = _c.sent();
112
- return [2 /*return*/];
113
- case 3:
114
- _c.trys.push([3, 5, , 6]);
115
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("../rules/".concat(ruleName, "/rule"))); })];
116
- case 4:
117
- rule = (_c.sent()).default;
118
- return [3 /*break*/, 6];
119
- case 5:
120
- _a = _c.sent();
121
- console.warn("Rule ".concat(ruleName, " has no rule.js or rule.ts file, or the file doesn't have a default export"));
122
- return [2 /*return*/];
123
- case 6:
124
- if ((0, util_1.verbose)())
125
- console.log("Loaded rule ".concat(ruleName, ": ").concat(rule));
126
- _c.label = 7;
127
- case 7:
128
- _c.trys.push([7, 9, , 10]);
129
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("../rules/".concat(ruleName, "/options"))); })];
130
- case 8:
131
- options = _c.sent();
132
- if ((0, util_1.verbose)())
133
- console.log("Loaded rule ".concat(ruleName, " options: ").concat(options));
134
- return [3 /*break*/, 10];
135
- case 9:
136
- _b = _c.sent();
137
- return [3 /*break*/, 10];
138
- case 10:
139
- description = (0, parseRuleDescription_1.default)(ruleName);
140
- references = Object.keys(metadata.references || {}).reduce(function (memo, key) {
141
- memo[key] = new url_1.URL(metadata.references[key]);
142
- return memo;
143
- }, {});
144
- return [2 /*return*/, {
145
- id: (0, util_1.dasherize)(ruleName),
146
- title: metadata.title,
147
- description: description,
148
- url: "https://appland.com/docs/analysis/rules-reference.html#".concat((0, util_1.dasherize)(ruleName)),
149
- labels: metadata.labels || [],
150
- scope: metadata.scope,
151
- enumerateScope: metadata.enumerateScope,
152
- impactDomain: metadata.impactDomain,
153
- references: references,
154
- Options: options,
155
- build: rule,
156
- }];
157
- }
158
- });
159
- }); };
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
+ });
160
112
  }
161
113
  function buildBuiltinCheck(config) {
162
- return __awaiter(this, void 0, void 0, function () {
163
- var rule, options, check;
164
- return __generator(this, function (_a) {
165
- switch (_a.label) {
166
- case 0: return [4 /*yield*/, loadRule(config.rule)];
167
- case 1:
168
- rule = _a.sent();
169
- if ((0, util_1.verbose)()) {
170
- console.log("Loaded rule: ".concat(rule));
171
- }
172
- if (rule.Options) {
173
- options = new rule.Options();
174
- }
175
- else {
176
- options = {};
177
- }
178
- if (config.properties) {
179
- Object.keys(config.properties).forEach(function (name) {
180
- var value = config.properties[name];
181
- options[name] = value;
182
- });
183
- }
184
- check = new check_1.default(rule, options);
185
- if (config.scope) {
186
- check.scope = config.scope;
187
- }
188
- if (config.id) {
189
- check.id = (0, util_1.dasherize)(config.id);
190
- }
191
- check.includeScope = (0, matchEvent_1.buildFilters)((config.include || []).filter(function (item) { return item.scope; }).map(function (item) { return item.scope; }));
192
- check.excludeScope = (0, matchEvent_1.buildFilters)((config.exclude || []).filter(function (item) { return item.scope; }).map(function (item) { return item.scope; }));
193
- check.includeEvent = (0, matchEvent_1.buildFilters)((config.include || []).filter(function (item) { return item.event; }).map(function (item) { return item.event; }));
194
- check.excludeEvent = (0, matchEvent_1.buildFilters)((config.exclude || []).filter(function (item) { return item.event; }).map(function (item) { return item.event; }));
195
- if ((0, util_1.verbose)()) {
196
- console.log("Loaded check: ".concat(check));
197
- }
198
- return [2 /*return*/, check];
199
- }
200
- });
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;
201
147
  });
202
148
  }
203
- var validate = function (validator, data, context) {
204
- var valid = validator(data);
149
+ const validate = (validator, data, context) => {
150
+ const valid = validator(data);
205
151
  if (!valid) {
206
152
  throw new Error(validator
207
- .errors.map(function (err) {
208
- var instance = err.instancePath;
153
+ .errors.map((err) => {
154
+ let instance = err.instancePath;
209
155
  if (!instance || instance === '') {
210
156
  instance = context;
211
157
  }
212
- return "".concat(instance, " ").concat(err.message, " (").concat(err.schemaPath, ")");
158
+ return `${instance} ${err.message} (${err.schemaPath})`;
213
159
  })
214
160
  .join(', '));
215
161
  }
216
162
  };
217
163
  function loadRule(ruleName) {
218
- return __awaiter(this, void 0, void 0, function () {
219
- var ruleId, rules, rule;
220
- var _this = this;
221
- return __generator(this, function (_a) {
222
- switch (_a.label) {
223
- case 0:
224
- ruleId = (0, util_1.dasherize)(ruleName);
225
- return [4 /*yield*/, Promise.all([
226
- loadFromDir(ruleId),
227
- loadFromFile(ruleId),
228
- loadFromDir((0, util_1.camelize)(ruleId)),
229
- loadFromFile((0, util_1.camelize)(ruleId)),
230
- ].map(function (loader) { return __awaiter(_this, void 0, void 0, function () {
231
- return __generator(this, function (_a) {
232
- switch (_a.label) {
233
- case 0: return [4 /*yield*/, loader()];
234
- case 1: return [2 /*return*/, _a.sent()];
235
- }
236
- });
237
- }); }))];
238
- case 1:
239
- rules = _a.sent();
240
- rule = rules.find(function (rule) { return rule; });
241
- if (!rule)
242
- throw new Error("Rule ".concat(ruleName, " not found"));
243
- return [2 /*return*/, rule];
244
- }
245
- });
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;
246
178
  });
247
179
  }
248
180
  exports.loadRule = loadRule;
249
181
  function loadConfig(config) {
250
- return __awaiter(this, void 0, void 0, function () {
251
- var _this = this;
252
- return __generator(this, function (_a) {
253
- config.checks
254
- .filter(function (check) { return check.properties; })
255
- .forEach(function (check) {
256
- var ruleId = check.rule;
257
- var schemaKey = [(0, util_1.capitalize)(ruleId), 'Options'].join('.');
258
- if ((0, util_1.verbose)()) {
259
- console.warn(schemaKey);
260
- }
261
- var propertiesSchema = options_json_1.default.definitions[schemaKey];
262
- if (!propertiesSchema) {
263
- return;
264
- }
265
- if ((0, util_1.verbose)()) {
266
- console.warn(propertiesSchema);
267
- console.warn(check.properties);
268
- }
269
- validate(ajv.compile(propertiesSchema), check.properties || {}, "".concat(ruleId, " properties"));
270
- });
271
- return [2 /*return*/, Promise.all(config.checks.map(function (c) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
272
- return [2 /*return*/, buildBuiltinCheck(c)];
273
- }); }); }))];
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`);
274
200
  });
201
+ return Promise.all(config.checks.map((c) => __awaiter(this, void 0, void 0, function* () { return buildBuiltinCheck(c); })));
275
202
  });
276
203
  }
277
204
  exports.loadConfig = loadConfig;
278
205
  function parseConfigFile(configPath) {
279
- return __awaiter(this, void 0, void 0, function () {
280
- var yamlConfig;
281
- return __generator(this, function (_a) {
282
- switch (_a.label) {
283
- case 0:
284
- console.log("Using scanner configuration file ".concat(configPath));
285
- return [4 /*yield*/, fs_1.promises.readFile(configPath, 'utf-8')];
286
- case 1:
287
- yamlConfig = _a.sent();
288
- return [2 /*return*/, js_yaml_1.default.load(yamlConfig, {
289
- filename: configPath,
290
- })];
291
- }
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,
292
214
  });
293
215
  });
294
216
  }
295
217
  exports.parseConfigFile = parseConfigFile;
296
- //# sourceMappingURL=configurationProvider.js.map