@appland/scanner 1.33.1

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 (196) hide show
  1. package/LICENSE.txt +25 -0
  2. package/README.md +122 -0
  3. package/built/algorithms/dataStructures/graph/Graph.js +155 -0
  4. package/built/algorithms/dataStructures/graph/Graph.js.map +1 -0
  5. package/built/algorithms/dataStructures/graph/GraphEdge.js +27 -0
  6. package/built/algorithms/dataStructures/graph/GraphEdge.js.map +1 -0
  7. package/built/algorithms/dataStructures/graph/GraphVertex.js +79 -0
  8. package/built/algorithms/dataStructures/graph/GraphVertex.js.map +1 -0
  9. package/built/algorithms/dataStructures/linked-list/LinkedList.js +134 -0
  10. package/built/algorithms/dataStructures/linked-list/LinkedList.js.map +1 -0
  11. package/built/algorithms/dataStructures/linked-list/LinkedListNode.js +16 -0
  12. package/built/algorithms/dataStructures/linked-list/LinkedListNode.js.map +1 -0
  13. package/built/algorithms/graph/depth-first-search/index.js +49 -0
  14. package/built/algorithms/graph/depth-first-search/index.js.map +1 -0
  15. package/built/algorithms/graph/detect-cycle/index.js +77 -0
  16. package/built/algorithms/graph/detect-cycle/index.js.map +1 -0
  17. package/built/algorithms/utils/Comparator.js +35 -0
  18. package/built/algorithms/utils/Comparator.js.map +1 -0
  19. package/built/analyzer/recordSecrets.js +17 -0
  20. package/built/analyzer/recordSecrets.js.map +1 -0
  21. package/built/analyzer/secretsRegexes.js +13 -0
  22. package/built/analyzer/secretsRegexes.js.map +1 -0
  23. package/built/analyzer/secretsRegexesData.json +51 -0
  24. package/built/check.js +47 -0
  25. package/built/check.js.map +1 -0
  26. package/built/checkInstance.js +69 -0
  27. package/built/checkInstance.js.map +1 -0
  28. package/built/cli/ci/command.js +183 -0
  29. package/built/cli/ci/command.js.map +1 -0
  30. package/built/cli/ci/options.js +3 -0
  31. package/built/cli/ci/options.js.map +1 -0
  32. package/built/cli/exitCode.js +11 -0
  33. package/built/cli/exitCode.js.map +1 -0
  34. package/built/cli/progressReporter.js +16 -0
  35. package/built/cli/progressReporter.js.map +1 -0
  36. package/built/cli/resolveAppId.js +83 -0
  37. package/built/cli/resolveAppId.js.map +1 -0
  38. package/built/cli/scan/command.js +174 -0
  39. package/built/cli/scan/command.js.map +1 -0
  40. package/built/cli/scan/options.js +3 -0
  41. package/built/cli/scan/options.js.map +1 -0
  42. package/built/cli/scan/scanner.js +154 -0
  43. package/built/cli/scan/scanner.js.map +1 -0
  44. package/built/cli/scan.js +103 -0
  45. package/built/cli/scan.js.map +1 -0
  46. package/built/cli/scanArgs.js +26 -0
  47. package/built/cli/scanArgs.js.map +1 -0
  48. package/built/cli/scanOptions.js +3 -0
  49. package/built/cli/scanOptions.js.map +1 -0
  50. package/built/cli/upload/command.js +95 -0
  51. package/built/cli/upload/command.js.map +1 -0
  52. package/built/cli/upload/options.js +3 -0
  53. package/built/cli/upload/options.js.map +1 -0
  54. package/built/cli/validateFile.js +66 -0
  55. package/built/cli/validateFile.js.map +1 -0
  56. package/built/cli.js +32 -0
  57. package/built/cli.js.map +1 -0
  58. package/built/configuration/configurationProvider.js +169 -0
  59. package/built/configuration/configurationProvider.js.map +1 -0
  60. package/built/configuration/schema/match-pattern-config.json +32 -0
  61. package/built/configuration/schema/options.json +193 -0
  62. package/built/configuration/types/checkConfig.js +3 -0
  63. package/built/configuration/types/checkConfig.js.map +1 -0
  64. package/built/configuration/types/configuration.js +3 -0
  65. package/built/configuration/types/configuration.js.map +1 -0
  66. package/built/configuration/types/matchEventConfig.js +3 -0
  67. package/built/configuration/types/matchEventConfig.js.map +1 -0
  68. package/built/configuration/types/matchPatternConfig.js +3 -0
  69. package/built/configuration/types/matchPatternConfig.js.map +1 -0
  70. package/built/database/index.js +259 -0
  71. package/built/database/index.js.map +1 -0
  72. package/built/database/visit.js +80 -0
  73. package/built/database/visit.js.map +1 -0
  74. package/built/errors.js +35 -0
  75. package/built/errors.js.map +1 -0
  76. package/built/findings.js +15 -0
  77. package/built/findings.js.map +1 -0
  78. package/built/integration/appland/fetchStatus.js +51 -0
  79. package/built/integration/appland/fetchStatus.js.map +1 -0
  80. package/built/integration/appland/upload.js +193 -0
  81. package/built/integration/appland/upload.js.map +1 -0
  82. package/built/integration/github/commitStatus.js +19 -0
  83. package/built/integration/github/commitStatus.js.map +1 -0
  84. package/built/integration/vars.js +68 -0
  85. package/built/integration/vars.js.map +1 -0
  86. package/built/openapi/index.js +100 -0
  87. package/built/openapi/index.js.map +1 -0
  88. package/built/openapi/method.js +120 -0
  89. package/built/openapi/method.js.map +1 -0
  90. package/built/openapi/model.js +49 -0
  91. package/built/openapi/model.js.map +1 -0
  92. package/built/openapi/path.js +36 -0
  93. package/built/openapi/path.js.map +1 -0
  94. package/built/openapi/provider.js +133 -0
  95. package/built/openapi/provider.js.map +1 -0
  96. package/built/openapi/response.js +59 -0
  97. package/built/openapi/response.js.map +1 -0
  98. package/built/openapi/rpcRequest.js +130 -0
  99. package/built/openapi/rpcRequest.js.map +1 -0
  100. package/built/openapi/schema.js +42 -0
  101. package/built/openapi/schema.js.map +1 -0
  102. package/built/openapi/securitySchemes.js +32 -0
  103. package/built/openapi/securitySchemes.js.map +1 -0
  104. package/built/openapi/statusCodes.js +68 -0
  105. package/built/openapi/statusCodes.js.map +1 -0
  106. package/built/openapi/util.js +91 -0
  107. package/built/openapi/util.js.map +1 -0
  108. package/built/report/appMapMetadata.js +2 -0
  109. package/built/report/appMapMetadata.js.map +1 -0
  110. package/built/report/findingSummary.js +3 -0
  111. package/built/report/findingSummary.js.map +1 -0
  112. package/built/report/findingsReport.js +37 -0
  113. package/built/report/findingsReport.js.map +1 -0
  114. package/built/report/scanResults.js +103 -0
  115. package/built/report/scanResults.js.map +1 -0
  116. package/built/report/scanSummary.js +3 -0
  117. package/built/report/scanSummary.js.map +1 -0
  118. package/built/report/summaryReport.js +70 -0
  119. package/built/report/summaryReport.js.map +1 -0
  120. package/built/ruleChecker.js +260 -0
  121. package/built/ruleChecker.js.map +1 -0
  122. package/built/rules/authzBeforeAuthn.js +82 -0
  123. package/built/rules/authzBeforeAuthn.js.map +1 -0
  124. package/built/rules/circularDependency.js +227 -0
  125. package/built/rules/circularDependency.js.map +1 -0
  126. package/built/rules/http500.js +18 -0
  127. package/built/rules/http500.js.map +1 -0
  128. package/built/rules/illegalPackageDependency.js +38 -0
  129. package/built/rules/illegalPackageDependency.js.map +1 -0
  130. package/built/rules/incompatibleHttpClientRequest.js +96 -0
  131. package/built/rules/incompatibleHttpClientRequest.js.map +1 -0
  132. package/built/rules/insecureCompare.js +59 -0
  133. package/built/rules/insecureCompare.js.map +1 -0
  134. package/built/rules/jobNotCancelled.js +72 -0
  135. package/built/rules/jobNotCancelled.js.map +1 -0
  136. package/built/rules/lib/hasParameterOrReceiver.js +11 -0
  137. package/built/rules/lib/hasParameterOrReceiver.js.map +1 -0
  138. package/built/rules/lib/matchEvent.js +32 -0
  139. package/built/rules/lib/matchEvent.js.map +1 -0
  140. package/built/rules/lib/matchPattern.js +28 -0
  141. package/built/rules/lib/matchPattern.js.map +1 -0
  142. package/built/rules/lib/rpcWithoutProtection.js +40 -0
  143. package/built/rules/lib/rpcWithoutProtection.js.map +1 -0
  144. package/built/rules/missingAuthentication.js +65 -0
  145. package/built/rules/missingAuthentication.js.map +1 -0
  146. package/built/rules/missingContentType.js +27 -0
  147. package/built/rules/missingContentType.js.map +1 -0
  148. package/built/rules/nPlusOneQuery.js +84 -0
  149. package/built/rules/nPlusOneQuery.js.map +1 -0
  150. package/built/rules/queryFromInvalidPackage.js +37 -0
  151. package/built/rules/queryFromInvalidPackage.js.map +1 -0
  152. package/built/rules/queryFromView.js +29 -0
  153. package/built/rules/queryFromView.js.map +1 -0
  154. package/built/rules/rpcWithoutCircuitBreaker.js +97 -0
  155. package/built/rules/rpcWithoutCircuitBreaker.js.map +1 -0
  156. package/built/rules/saveWithoutValidation.js +27 -0
  157. package/built/rules/saveWithoutValidation.js.map +1 -0
  158. package/built/rules/secretInLog.js +76 -0
  159. package/built/rules/secretInLog.js.map +1 -0
  160. package/built/rules/slowFunctionCall.js +37 -0
  161. package/built/rules/slowFunctionCall.js.map +1 -0
  162. package/built/rules/slowHttpServerRequest.js +24 -0
  163. package/built/rules/slowHttpServerRequest.js.map +1 -0
  164. package/built/rules/slowQuery.js +23 -0
  165. package/built/rules/slowQuery.js.map +1 -0
  166. package/built/rules/tooManyJoins.js +77 -0
  167. package/built/rules/tooManyJoins.js.map +1 -0
  168. package/built/rules/tooManyUpdates.js +143 -0
  169. package/built/rules/tooManyUpdates.js.map +1 -0
  170. package/built/rules/unbatchedMaterializedQuery.js +65 -0
  171. package/built/rules/unbatchedMaterializedQuery.js.map +1 -0
  172. package/built/rules/updateInGetRequest.js +66 -0
  173. package/built/rules/updateInGetRequest.js.map +1 -0
  174. package/built/rules/util.js +102 -0
  175. package/built/rules/util.js.map +1 -0
  176. package/built/sampleConfig/bike_index.yml +10 -0
  177. package/built/sampleConfig/default.yml +19 -0
  178. package/built/sampleConfig/railsSampleApp6thEd.yml +29 -0
  179. package/built/sampleConfig/solidus.yml +31 -0
  180. package/built/scope/commandScope.js +156 -0
  181. package/built/scope/commandScope.js.map +1 -0
  182. package/built/scope/httpClientRequestScope.js +105 -0
  183. package/built/scope/httpClientRequestScope.js.map +1 -0
  184. package/built/scope/httpServerRequestScope.js +105 -0
  185. package/built/scope/httpServerRequestScope.js.map +1 -0
  186. package/built/scope/rootScope.js +105 -0
  187. package/built/scope/rootScope.js.map +1 -0
  188. package/built/scope/scopeImpl.js +88 -0
  189. package/built/scope/scopeImpl.js.map +1 -0
  190. package/built/scope/scopeIterator.js +21 -0
  191. package/built/scope/scopeIterator.js.map +1 -0
  192. package/built/scope/sqlTransactionScope.js +175 -0
  193. package/built/scope/sqlTransactionScope.js.map +1 -0
  194. package/built/wellKnownLabels.js +9 -0
  195. package/built/wellKnownLabels.js.map +1 -0
  196. package/package.json +89 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"illegalPackageDependency.js","sourceRoot":"","sources":["../../src/rules/illegalPackageDependency.ts"],"names":[],"mappings":";;AAIA,mDAA+D;AAE/D;IAAA;QACS,mBAAc,GAAyB,EAAE,CAAC;QAC1C,kBAAa,GAAuB,EAAwB,CAAC;IACtE,CAAC;IAAD,cAAC;AAAD,CAAC,AAHD,IAGC;AAED,SAAS,KAAK,CAAC,OAAgB;IAC7B,IAAM,cAAc,GAAG,IAAA,2BAAY,EAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAClE,IAAM,aAAa,GAAG,IAAA,0BAAW,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEzD,SAAS,KAAK,CAAC,CAAQ;QACrB,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAO,CAAC,UAAU,CAAC,SAAS,IAAI,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACjG,CAAC;IAED,SAAS,OAAO,CAAC,CAAQ;QACvB,IAAM,eAAe,GAAG,OAAO,CAAC,cAAc;aAC3C,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAA9C,CAA8C,CAAC;aAC/D,GAAG,CAAC,MAAM,CAAC;aACX,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,IAAM,aAAa,GAAG,CAAC,CAAC,MAAO,CAAC,UAAU,CAAC,SAAS,CAAC;QACrD,IACE,CAAC,CACC,CAAC,CAAC,UAAU,CAAC,SAAS,KAAK,aAAa;YACxC,cAAc,CAAC,IAAI,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,aAAa,CAAC,EAAtB,CAAsB,CAAC,CACzD,EACD;YACA,OAAO,iBAAe,CAAC,CAAC,UAAU,CAAC,EAAE,0BAAqB,aAAa,mBAAc,eAAiB,CAAC;SACxG;IACH,CAAC;IAED,OAAO,EAAE,KAAK,OAAA,EAAE,OAAO,SAAA,EAAE,CAAC;AAC5B,CAAC;AAED,kBAAe;IACb,EAAE,EAAE,4BAA4B;IAChC,KAAK,EAAE,kDAAkD;IACzD,KAAK,EAAE,SAAsB;IAC7B,cAAc,EAAE,IAAI;IACpB,OAAO,SAAA;IACP,KAAK,OAAA;CACE,CAAC"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var openapi_1 = require("../openapi");
40
+ var Options = /** @class */ (function () {
41
+ function Options() {
42
+ this.schemata = {};
43
+ }
44
+ return Options;
45
+ }());
46
+ var changeMessage = function (change) {
47
+ return "HTTP client request is incompatible with OpenAPI schema. Change details: " + change.action + " " + change.sourceSpecEntityDetails
48
+ .concat(change.destinationSpecEntityDetails)
49
+ .map(function (detail) { return detail.location; })
50
+ .join(', ');
51
+ };
52
+ function build(options) {
53
+ function matcher(event) {
54
+ return __awaiter(this, void 0, void 0, function () {
55
+ var clientFragment, serverSchema, clientSchema, changes;
56
+ return __generator(this, function (_a) {
57
+ switch (_a.label) {
58
+ case 0:
59
+ clientFragment = (0, openapi_1.forClientRequest)(event);
60
+ return [4 /*yield*/, (0, openapi_1.forURL)(event.httpClientRequest.url, options.schemata)];
61
+ case 1:
62
+ serverSchema = _a.sent();
63
+ clientSchema = {
64
+ openapi: '3.0.0',
65
+ info: {
66
+ title: 'Schema derived from client request',
67
+ version: serverSchema.info.version, // Indicate that it *should* be compatible.
68
+ },
69
+ paths: clientFragment.paths,
70
+ components: { securitySchemes: clientFragment.securitySchemes },
71
+ };
72
+ return [4 /*yield*/, (0, openapi_1.breakingChanges)(clientSchema, serverSchema)];
73
+ case 2:
74
+ changes = _a.sent();
75
+ return [2 /*return*/, changes.map(function (change) { return ({
76
+ level: 'error',
77
+ message: changeMessage(change),
78
+ }); })];
79
+ }
80
+ });
81
+ });
82
+ }
83
+ return {
84
+ matcher: matcher,
85
+ where: function (e) { return !!e.httpClientRequest && !!e.httpClientRequest.url; },
86
+ };
87
+ }
88
+ exports.default = {
89
+ id: 'incompatible-http-client-request',
90
+ title: 'Incompatible HTTP client request',
91
+ scope: 'http_client_request',
92
+ enumerateScope: false,
93
+ Options: Options,
94
+ build: build,
95
+ };
96
+ //# sourceMappingURL=incompatibleHttpClientRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incompatibleHttpClientRequest.js","sourceRoot":"","sources":["../../src/rules/incompatibleHttpClientRequest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,sCAAuE;AAMvE;IAAA;QACS,aAAQ,GAA2B,EAAE,CAAC;IAC/C,CAAC;IAAD,cAAC;AAAD,CAAC,AAFD,IAEC;AAED,IAAM,aAAa,GAAG,UAAC,MAA0C;IAC/D,OAAO,8EACL,MAAM,CAAC,MAAM,SACX,MAAM,CAAC,uBAAuB;SAC/B,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC;SAC3C,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,MAAM,CAAC,QAAQ,EAAf,CAAe,CAAC;SAChC,IAAI,CAAC,IAAI,CAAG,CAAC;AAClB,CAAC,CAAC;AAEF,SAAS,KAAK,CAAC,OAAgB;IAC7B,SAAe,OAAO,CAAC,KAAY;;;;;;wBAC3B,cAAc,GAAG,IAAA,0BAAgB,EAAC,KAAK,CAAC,CAAC;wBAC1B,qBAAM,IAAA,gBAAM,EAAC,KAAK,CAAC,iBAAkB,CAAC,GAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAA;;wBAA5E,YAAY,GAAG,SAA6D;wBAC5E,YAAY,GAAG;4BACnB,OAAO,EAAE,OAAO;4BAChB,IAAI,EAAE;gCACJ,KAAK,EAAE,oCAAoC;gCAC3C,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,2CAA2C;6BAChF;4BACD,KAAK,EAAE,cAAe,CAAC,KAAK;4BAC5B,UAAU,EAAE,EAAE,eAAe,EAAE,cAAe,CAAC,eAAe,EAAE;yBAC3C,CAAC;wBACR,qBAAM,IAAA,yBAAe,EAAC,YAAY,EAAE,YAAY,CAAC,EAAA;;wBAA3D,OAAO,GAAG,SAAiD;wBACjE,sBAAO,OAAO,CAAC,GAAG,CAAC,UAAC,MAA0C,IAAK,OAAA,CAAC;gCAClE,KAAK,EAAE,OAAO;gCACd,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;6BAC/B,CAAC,EAHiE,CAGjE,CAAC,EAAC;;;;KACL;IAED,OAAO;QACL,OAAO,SAAA;QACP,KAAK,EAAE,UAAC,CAAQ,IAAK,OAAA,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAkB,CAAC,GAAG,EAAnD,CAAmD;KACzE,CAAC;AACJ,CAAC;AAED,kBAAe;IACb,EAAE,EAAE,kCAAkC;IACtC,KAAK,EAAE,kCAAkC;IACzC,KAAK,EAAE,qBAAqB;IAC5B,cAAc,EAAE,KAAK;IACrB,OAAO,SAAA;IACP,KAAK,OAAA;CACE,CAAC"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var recordSecrets_1 = __importDefault(require("../analyzer/recordSecrets"));
7
+ var secretsRegexes_1 = __importDefault(require("../analyzer/secretsRegexes"));
8
+ var BCRYPT_REGEXP = /^[$]2[abxy]?[$](?:0[4-9]|[12][0-9]|3[01])[$][./0-9a-zA-Z]{53}$/;
9
+ var secrets = new Set();
10
+ function stringEquals(e) {
11
+ if (!e.parameters || !e.receiver || e.parameters.length !== 1) {
12
+ return;
13
+ }
14
+ var args = [e.receiver.value, e.parameters[0].value];
15
+ function isBcrypt(str) {
16
+ return BCRYPT_REGEXP.test(str);
17
+ }
18
+ function isSecret(str) {
19
+ if (secrets.has(str)) {
20
+ return true;
21
+ }
22
+ return !!Object.keys(secretsRegexes_1.default).find(function (key) { return !!secretsRegexes_1.default[key].find(function (re) { return re.test(str); }); });
23
+ }
24
+ // BCrypted strings are safe to compare using equals()
25
+ if (args.every(isBcrypt)) {
26
+ return;
27
+ }
28
+ if (!args.every(isSecret)) {
29
+ return;
30
+ }
31
+ return true;
32
+ }
33
+ function build() {
34
+ function matcher(e) {
35
+ if (e.codeObject.labels.has(Secret)) {
36
+ (0, recordSecrets_1.default)(secrets, e);
37
+ }
38
+ if (e.parameters && e.codeObject.labels.has(StringEquals)) {
39
+ return stringEquals(e);
40
+ }
41
+ }
42
+ function where(e) {
43
+ return (e.isFunction && (e.codeObject.labels.has(StringEquals) || e.codeObject.labels.has(Secret)));
44
+ }
45
+ return {
46
+ matcher: matcher,
47
+ where: where,
48
+ };
49
+ }
50
+ var Secret = 'secret';
51
+ var StringEquals = 'string.equals';
52
+ exports.default = {
53
+ id: 'insecure-compare',
54
+ title: 'Insecure comparison of secrets',
55
+ labels: [Secret, StringEquals],
56
+ enumerateScope: true,
57
+ build: build,
58
+ };
59
+ //# sourceMappingURL=insecureCompare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insecureCompare.js","sourceRoot":"","sources":["../../src/rules/insecureCompare.ts"],"names":[],"mappings":";;;;;AACA,4EAAsD;AACtD,8EAAwD;AAGxD,IAAM,aAAa,GAAG,gEAAgE,CAAC;AAEvF,IAAM,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;AAEvC,SAAS,YAAY,CAAC,CAAQ;IAC5B,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAW,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9D,OAAO;KACR;IAED,IAAM,IAAI,GAAG,CAAC,CAAC,CAAC,QAAS,CAAC,KAAK,EAAE,CAAC,CAAC,UAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzD,SAAS,QAAQ,CAAC,GAAW;QAC3B,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,QAAQ,CAAC,GAAW;QAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,OAAO,IAAI,CAAC;SACb;QACD,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAc,CAAC,CAAC,IAAI,CACvC,UAAC,GAAG,IAAc,OAAA,CAAC,CAAC,wBAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAC,EAAU,IAAc,OAAA,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAZ,CAAY,CAAC,EAAjE,CAAiE,CACpF,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QACxB,OAAO;KACR;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QACzB,OAAO;KACR;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,KAAK;IACZ,SAAS,OAAO,CAAC,CAAQ;QACvB,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACnC,IAAA,uBAAa,EAAC,OAAO,EAAE,CAAC,CAAC,CAAC;SAC3B;QACD,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YACzD,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;SACxB;IACH,CAAC;IAED,SAAS,KAAK,CAAC,CAAQ;QACrB,OAAO,CACL,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAC3F,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,SAAA;QACP,KAAK,OAAA;KACN,CAAC;AACJ,CAAC;AAED,IAAM,MAAM,GAAG,QAAQ,CAAC;AACxB,IAAM,YAAY,GAAG,eAAe,CAAC;AAErC,kBAAe;IACb,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,cAAc,EAAE,IAAI;IACpB,KAAK,OAAA;CACE,CAAC"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __read = (this && this.__read) || function (o, n) {
3
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
4
+ if (!m) return o;
5
+ var i = m.call(o), r, ar = [], e;
6
+ try {
7
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
+ }
9
+ catch (error) { e = { error: error }; }
10
+ finally {
11
+ try {
12
+ if (r && !r.done && (m = i["return"])) m.call(i);
13
+ }
14
+ finally { if (e) throw e.error; }
15
+ }
16
+ return ar;
17
+ };
18
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
19
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
20
+ if (ar || !(i in from)) {
21
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
22
+ ar[i] = from[i];
23
+ }
24
+ }
25
+ return to.concat(ar || Array.prototype.slice.call(from));
26
+ };
27
+ var __importDefault = (this && this.__importDefault) || function (mod) {
28
+ return (mod && mod.__esModule) ? mod : { "default": mod };
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ var wellKnownLabels_1 = __importDefault(require("../wellKnownLabels"));
32
+ var sqlTransactionScope_1 = require("../scope/sqlTransactionScope");
33
+ function build() {
34
+ function matcher(event) {
35
+ if (!(0, sqlTransactionScope_1.hasTransactionDetails)(event))
36
+ throw new Error("expected event " + event.id + " to be a transaction");
37
+ if (event.transaction.status === 'commit')
38
+ return;
39
+ var creationEvents = event.transaction.events.filter(function (_a) {
40
+ var labels = _a.labels;
41
+ return labels.has(wellKnownLabels_1.default.JobCreate);
42
+ });
43
+ var cancellationEvents = event.transaction.events.filter(function (_a) {
44
+ var labels = _a.labels;
45
+ return labels.has(wellKnownLabels_1.default.JobCancel);
46
+ });
47
+ var missing = creationEvents.length - cancellationEvents.length;
48
+ if (missing === 0)
49
+ return;
50
+ var result = {
51
+ level: 'error',
52
+ event: event,
53
+ message: missing + " jobs created but not cancelled in this rolled back transaction",
54
+ // if there's a mismatch and there are cancellations we can't tell
55
+ // for sure which creations they match, so return everything
56
+ relatedEvents: __spreadArray(__spreadArray([], __read(creationEvents), false), __read(cancellationEvents), false),
57
+ };
58
+ return [result];
59
+ }
60
+ return {
61
+ matcher: matcher,
62
+ };
63
+ }
64
+ exports.default = {
65
+ id: 'job-not-cancelled',
66
+ title: 'Job created in a rolled back transaction and not cancelled',
67
+ scope: 'transaction',
68
+ enumerateScope: false,
69
+ labels: [wellKnownLabels_1.default.JobCreate, wellKnownLabels_1.default.JobCancel],
70
+ build: build,
71
+ };
72
+ //# sourceMappingURL=jobNotCancelled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobNotCancelled.js","sourceRoot":"","sources":["../../src/rules/jobNotCancelled.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uEAAwC;AACxC,oEAAqE;AAErE,SAAS,KAAK;IACZ,SAAS,OAAO,CAAC,KAAY;QAC3B,IAAI,CAAC,IAAA,2CAAqB,EAAC,KAAK,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,oBAAkB,KAAK,CAAC,EAAE,yBAAsB,CAAC,CAAC;QACpE,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;QAElD,IAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,UAAC,EAAU;gBAAR,MAAM,YAAA;YAC9D,OAAA,MAAM,CAAC,GAAG,CAAC,yBAAM,CAAC,SAAS,CAAC;QAA5B,CAA4B,CAC7B,CAAC;QACF,IAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,UAAC,EAAU;gBAAR,MAAM,YAAA;YAClE,OAAA,MAAM,CAAC,GAAG,CAAC,yBAAM,CAAC,SAAS,CAAC;QAA5B,CAA4B,CAC7B,CAAC;QACF,IAAM,OAAO,GAAG,cAAc,CAAC,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;QAClE,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO;QAE1B,IAAM,MAAM,GAAgB;YAC1B,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,KAAK;YACZ,OAAO,EAAK,OAAO,oEAAiE;YACpF,kEAAkE;YAClE,4DAA4D;YAC5D,aAAa,yCAAM,cAAc,kBAAK,kBAAkB,SAAC;SAC1D,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;QACL,OAAO,SAAA;KACR,CAAC;AACJ,CAAC;AAED,kBAAe;IACb,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,4DAA4D;IACnE,KAAK,EAAE,aAAa;IACpB,cAAc,EAAE,KAAK;IACrB,MAAM,EAAE,CAAC,yBAAM,CAAC,SAAS,EAAE,yBAAM,CAAC,SAAS,CAAC;IAC5C,KAAK,OAAA;CACE,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // Builds a function that returns true if the provided event argument has the specified
4
+ // objectId as the receiver or as a parameter value.
5
+ exports.default = (function (objectId) {
6
+ return function (event) {
7
+ return (!!event.receiver && event.receiver.object_id === objectId) ||
8
+ (!!event.parameters && event.parameters.some(function (param) { return param.object_id === objectId; }));
9
+ };
10
+ });
11
+ //# sourceMappingURL=hasParameterOrReceiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasParameterOrReceiver.js","sourceRoot":"","sources":["../../../src/rules/lib/hasParameterOrReceiver.ts"],"names":[],"mappings":";;AAEA,uFAAuF;AACvF,oDAAoD;AACpD,mBAAe,UAAC,QAAgB;IAC9B,OAAO,UAAC,KAAY;QAClB,OAAA,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAS,CAAC,SAAS,KAAK,QAAQ,CAAC;YAC5D,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAW,CAAC,IAAI,CAAC,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,SAAS,KAAK,QAAQ,EAA5B,CAA4B,CAAC,CAAC;IADvF,CACuF,CAAC;AAC5F,CAAC,EAAC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildFilters = exports.buildFilter = void 0;
4
+ var database_1 = require("../../database");
5
+ var matchPattern_1 = require("./matchPattern");
6
+ function buildFilter(pattern) {
7
+ var testFn = (0, matchPattern_1.buildFilter)(pattern.test);
8
+ var propertyFn = {
9
+ id: function (e) { return e.codeObject.id; },
10
+ type: function (e) { return e.codeObject.type; },
11
+ fqid: function (e) { return e.codeObject.fqid; },
12
+ query: function (e) { return (e.sql ? (0, database_1.sqlNormalized)(e.sql) : null); },
13
+ route: function (e) { return e.route; },
14
+ };
15
+ return function (event) {
16
+ var fn = propertyFn[pattern.property];
17
+ if (!fn) {
18
+ throw new Error("Unrecognized Event filter property: " + pattern.property);
19
+ }
20
+ var value = fn(event);
21
+ if (!value) {
22
+ return false;
23
+ }
24
+ return testFn(value);
25
+ };
26
+ }
27
+ exports.buildFilter = buildFilter;
28
+ function buildFilters(patterns) {
29
+ return patterns.map(buildFilter);
30
+ }
31
+ exports.buildFilters = buildFilters;
32
+ //# sourceMappingURL=matchEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchEvent.js","sourceRoot":"","sources":["../../../src/rules/lib/matchEvent.ts"],"names":[],"mappings":";;;AACA,2CAA+C;AAG/C,+CAAkE;AAElE,SAAgB,WAAW,CAAC,OAAyB;IACnD,IAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C,IAAM,UAAU,GAAG;QACjB,EAAE,EAAE,UAAC,CAAQ,IAAK,OAAA,CAAC,CAAC,UAAU,CAAC,EAAE,EAAf,CAAe;QACjC,IAAI,EAAE,UAAC,CAAQ,IAAK,OAAA,CAAC,CAAC,UAAU,CAAC,IAAI,EAAjB,CAAiB;QACrC,IAAI,EAAE,UAAC,CAAQ,IAAK,OAAA,CAAC,CAAC,UAAU,CAAC,IAAI,EAAjB,CAAiB;QACrC,KAAK,EAAE,UAAC,CAAQ,IAAK,OAAA,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAArC,CAAqC;QAC1D,KAAK,EAAE,UAAC,CAAQ,IAAK,OAAA,CAAC,CAAC,KAAK,EAAP,CAAO;KAC7B,CAAC;IAEF,OAAO,UAAC,KAAY;QAClB,IAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,EAAE;YACP,MAAM,IAAI,KAAK,CAAC,yCAAuC,OAAO,CAAC,QAAU,CAAC,CAAC;SAC5E;QACD,IAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,KAAK,CAAC;SACd;QAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC;AAvBD,kCAuBC;AAED,SAAgB,YAAY,CAAC,QAA4B;IACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAFD,oCAEC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildFilters = exports.buildFilter = void 0;
4
+ function buildFilter(pattern) {
5
+ function respectIgnoreCaseFlag(value) {
6
+ return pattern.ignoreCase ? value.toLocaleLowerCase() : value;
7
+ }
8
+ if (pattern.equal) {
9
+ var testStr_1 = respectIgnoreCaseFlag(pattern.equal);
10
+ return function (value) { return respectIgnoreCaseFlag(value) === testStr_1; };
11
+ }
12
+ else if (pattern.include) {
13
+ var testStr_2 = respectIgnoreCaseFlag(pattern.include);
14
+ return function (value) { return respectIgnoreCaseFlag(value).includes(testStr_2); };
15
+ }
16
+ else {
17
+ var regexp_1 = pattern.match instanceof RegExp
18
+ ? pattern.match
19
+ : new RegExp(pattern.match, pattern.ignoreCase ? 'i' : undefined);
20
+ return function (value) { return regexp_1.test(value); };
21
+ }
22
+ }
23
+ exports.buildFilter = buildFilter;
24
+ function buildFilters(patterns) {
25
+ return patterns.map(buildFilter);
26
+ }
27
+ exports.buildFilters = buildFilters;
28
+ //# sourceMappingURL=matchPattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchPattern.js","sourceRoot":"","sources":["../../../src/rules/lib/matchPattern.ts"],"names":[],"mappings":";;;AAGA,SAAgB,WAAW,CAAC,OAA2B;IACrD,SAAS,qBAAqB,CAAC,KAAa;QAC1C,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE;QACjB,IAAM,SAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;QACtD,OAAO,UAAC,KAAa,IAAc,OAAA,qBAAqB,CAAC,KAAK,CAAC,KAAK,SAAO,EAAxC,CAAwC,CAAC;KAC7E;SAAM,IAAI,OAAO,CAAC,OAAO,EAAE;QAC1B,IAAM,SAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAQ,CAAC,CAAC;QACxD,OAAO,UAAC,KAAa,IAAc,OAAA,qBAAqB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAO,CAAC,EAA9C,CAA8C,CAAC;KACnF;SAAM;QACL,IAAM,QAAM,GACV,OAAO,CAAC,KAAK,YAAY,MAAM;YAC7B,CAAC,CAAC,OAAO,CAAC,KAAK;YACf,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAA0B,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3F,OAAO,UAAC,KAAa,IAAc,OAAA,QAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAlB,CAAkB,CAAC;KACvD;AACH,CAAC;AAlBD,kCAkBC;AAED,SAAgB,YAAY,CAAC,QAA8B;IACzD,OAAO,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAFD,oCAEC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __values = (this && this.__values) || function(o) {
3
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
+ if (m) return m.call(o);
5
+ if (o && typeof o.length === "number") return {
6
+ next: function () {
7
+ if (o && i >= o.length) o = void 0;
8
+ return { value: o && o[i++], done: !o };
9
+ }
10
+ };
11
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.rpcWithoutProtection = void 0;
15
+ function rpcWithoutProtection(candidateGenerator, options) {
16
+ return {
17
+ matcher: function (httpClientRequest) {
18
+ var e_1, _a;
19
+ try {
20
+ for (var _b = __values(candidateGenerator(httpClientRequest)), _c = _b.next(); !_c.done; _c = _b.next()) {
21
+ var candidate = _c.value;
22
+ if (candidate.codeObject.labels.has(options.expectedLabel)) {
23
+ return false;
24
+ }
25
+ }
26
+ }
27
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
28
+ finally {
29
+ try {
30
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
31
+ }
32
+ finally { if (e_1) throw e_1.error; }
33
+ }
34
+ return true;
35
+ },
36
+ where: function (e) { return !!e.httpClientRequest; },
37
+ };
38
+ }
39
+ exports.rpcWithoutProtection = rpcWithoutProtection;
40
+ //# sourceMappingURL=rpcWithoutProtection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpcWithoutProtection.js","sourceRoot":"","sources":["../../../src/rules/lib/rpcWithoutProtection.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAOA,SAAgB,oBAAoB,CAClC,kBAAkE,EAClE,OAAoC;IAEpC,OAAO;QACL,OAAO,EAAE,UAAC,iBAAwB;;;gBAChC,KAAwB,IAAA,KAAA,SAAA,kBAAkB,CAAC,iBAAiB,CAAC,CAAA,gBAAA,4BAAE;oBAA1D,IAAM,SAAS,WAAA;oBAClB,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;wBAC1D,OAAO,KAAK,CAAC;qBACd;iBACF;;;;;;;;;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,EAAE,UAAC,CAAQ,IAAK,OAAA,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAArB,CAAqB;KAC3C,CAAC;AACJ,CAAC;AAfD,oDAeC"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var models_1 = require("@appland/models");
4
+ var rpcRequest_1 = require("../openapi/rpcRequest");
5
+ var util_1 = require("./util");
6
+ var matchPattern_1 = require("./lib/matchPattern");
7
+ function isPublic(event) {
8
+ return event.labels.has(Public);
9
+ }
10
+ var authenticatedBy = function (iterator) {
11
+ var i = iterator.next();
12
+ while (!i.done) {
13
+ if (isPublic(i.value.event) || (0, util_1.providesAuthentication)(i.value.event, SecurityAuthentication)) {
14
+ return true;
15
+ }
16
+ i = iterator.next();
17
+ }
18
+ return false;
19
+ };
20
+ var Options = /** @class */ (function () {
21
+ function Options() {
22
+ this.includeContentTypes = [];
23
+ this.excludeContentTypes = [];
24
+ }
25
+ return Options;
26
+ }());
27
+ function build(options) {
28
+ if (options === void 0) { options = new Options(); }
29
+ var includeContentTypes = (0, matchPattern_1.buildFilters)(options.includeContentTypes);
30
+ var excludeContentTypes = (0, matchPattern_1.buildFilters)(options.excludeContentTypes);
31
+ function testContentType(contentType) {
32
+ function test(filter) {
33
+ return filter(contentType);
34
+ }
35
+ return ((includeContentTypes.length === 0 || includeContentTypes.some(test)) &&
36
+ !excludeContentTypes.some(test));
37
+ }
38
+ function matcher(event) {
39
+ return !authenticatedBy(new models_1.EventNavigator(event).descendants());
40
+ }
41
+ function where(e) {
42
+ return (e.route !== undefined &&
43
+ e.httpServerResponse !== undefined &&
44
+ e.httpServerResponse.status < 300 &&
45
+ !!(0, rpcRequest_1.rpcRequestForEvent)(e) &&
46
+ !!(0, rpcRequest_1.rpcRequestForEvent)(e).contentType &&
47
+ testContentType((0, rpcRequest_1.rpcRequestForEvent)(e).contentType));
48
+ }
49
+ return {
50
+ where: where,
51
+ matcher: matcher,
52
+ };
53
+ }
54
+ var Public = 'public';
55
+ var SecurityAuthentication = 'security.authentication';
56
+ exports.default = {
57
+ id: 'missing-authentication',
58
+ title: 'Unauthenticated HTTP server request',
59
+ scope: 'http_server_request',
60
+ labels: [Public, SecurityAuthentication],
61
+ enumerateScope: false,
62
+ Options: Options,
63
+ build: build,
64
+ };
65
+ //# sourceMappingURL=missingAuthentication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missingAuthentication.js","sourceRoot":"","sources":["../../src/rules/missingAuthentication.ts"],"names":[],"mappings":";;AAAA,0CAAwD;AACxD,oDAA2D;AAG3D,+BAAgD;AAEhD,mDAAkD;AAElD,SAAS,QAAQ,CAAC,KAAY;IAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,IAAM,eAAe,GAAG,UAAC,QAAkC;IACzD,IAAI,CAAC,GAAmC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxD,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;QACd,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAA,6BAAsB,EAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,sBAAsB,CAAC,EAAE;YAC5F,OAAO,IAAI,CAAC;SACb;QACD,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;KACrB;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;IAAA;QACS,wBAAmB,GAAyB,EAAE,CAAC;QAC/C,wBAAmB,GAAyB,EAAE,CAAC;IACxD,CAAC;IAAD,cAAC;AAAD,CAAC,AAHD,IAGC;AAED,SAAS,KAAK,CAAC,OAAgC;IAAhC,wBAAA,EAAA,cAAuB,OAAO,EAAE;IAC7C,IAAM,mBAAmB,GAAG,IAAA,2BAAY,EAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtE,IAAM,mBAAmB,GAAG,IAAA,2BAAY,EAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEtE,SAAS,eAAe,CAAC,WAAmB;QAC1C,SAAS,IAAI,CAAC,MAAoB;YAChC,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,CACL,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAChC,CAAC;IACJ,CAAC;IAED,SAAS,OAAO,CAAC,KAAY;QAC3B,OAAO,CAAC,eAAe,CAAC,IAAI,uBAAc,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,SAAS,KAAK,CAAC,CAAQ;QACrB,OAAO,CACL,CAAC,CAAC,KAAK,KAAK,SAAS;YACrB,CAAC,CAAC,kBAAkB,KAAK,SAAS;YAClC,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,GAAG;YACjC,CAAC,CAAC,IAAA,+BAAkB,EAAC,CAAC,CAAC;YACvB,CAAC,CAAC,IAAA,+BAAkB,EAAC,CAAC,CAAE,CAAC,WAAW;YACpC,eAAe,CAAC,IAAA,+BAAkB,EAAC,CAAC,CAAE,CAAC,WAAW,CAAC,CACpD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,OAAA;QACL,OAAO,SAAA;KACR,CAAC;AACJ,CAAC;AACD,IAAM,MAAM,GAAG,QAAQ,CAAC;AACxB,IAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAEzD,kBAAe;IACb,EAAE,EAAE,wBAAwB;IAC5B,KAAK,EAAE,qCAAqC;IAC5C,KAAK,EAAE,qBAAqB;IAC5B,MAAM,EAAE,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,cAAc,EAAE,KAAK;IACrB,OAAO,SAAA;IACP,KAAK,OAAA;CACE,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var rpcRequest_1 = require("../openapi/rpcRequest");
4
+ var isRedirect = function (status) { return [301, 302, 303, 307, 308].includes(status); };
5
+ var hasContent = function (status) { return status !== 204; };
6
+ function build() {
7
+ function matcher(e) {
8
+ return (0, rpcRequest_1.rpcRequestForEvent)(e).contentType === undefined;
9
+ }
10
+ function where(e) {
11
+ return (!!e.httpServerResponse &&
12
+ !isRedirect(e.httpServerResponse.status) &&
13
+ hasContent(e.httpServerResponse.status));
14
+ }
15
+ return {
16
+ matcher: matcher,
17
+ where: where,
18
+ };
19
+ }
20
+ exports.default = {
21
+ id: 'missing-content-type',
22
+ title: 'HTTP server request without a Content-Type header',
23
+ scope: 'http_server_request',
24
+ enumerateScope: false,
25
+ build: build,
26
+ };
27
+ //# sourceMappingURL=missingContentType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missingContentType.js","sourceRoot":"","sources":["../../src/rules/missingContentType.ts"],"names":[],"mappings":";;AAEA,oDAA2D;AAE3D,IAAM,UAAU,GAAG,UAAC,MAAc,IAAK,OAAA,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAA1C,CAA0C,CAAC;AAClF,IAAM,UAAU,GAAG,UAAC,MAAc,IAAK,OAAA,MAAM,KAAK,GAAG,EAAd,CAAc,CAAC;AAEtD,SAAS,KAAK;IACZ,SAAS,OAAO,CAAC,CAAQ;QACvB,OAAO,IAAA,+BAAkB,EAAC,CAAC,CAAE,CAAC,WAAW,KAAK,SAAS,CAAC;IAC1D,CAAC;IACD,SAAS,KAAK,CAAC,CAAQ;QACrB,OAAO,CACL,CAAC,CAAC,CAAC,CAAC,kBAAkB;YACtB,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAmB,CAAC,MAAM,CAAC;YACzC,UAAU,CAAC,CAAC,CAAC,kBAAmB,CAAC,MAAM,CAAC,CACzC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,SAAA;QACP,KAAK,OAAA;KACN,CAAC;AACJ,CAAC;AAED,kBAAe;IACb,EAAE,EAAE,sBAAsB;IAC1B,KAAK,EAAE,mDAAmD;IAC1D,KAAK,EAAE,qBAAqB;IAC5B,cAAc,EAAE,KAAK;IACrB,KAAK,OAAA;CACE,CAAC"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __values = (this && this.__values) || function(o) {
3
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
+ if (m) return m.call(o);
5
+ if (o && typeof o.length === "number") return {
6
+ next: function () {
7
+ if (o && i >= o.length) o = void 0;
8
+ return { value: o && o[i++], done: !o };
9
+ }
10
+ };
11
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ var database_1 = require("../database");
15
+ var Options = /** @class */ (function () {
16
+ function Options() {
17
+ this.warningLimit = 5;
18
+ this.errorLimit = 10;
19
+ }
20
+ return Options;
21
+ }());
22
+ // TODO: clean up according to https://github.com/applandinc/scanner/issues/43
23
+ function build(options) {
24
+ var sqlCount = {};
25
+ function matcher(command, _appMap, eventFilter) {
26
+ var e_1, _a;
27
+ try {
28
+ for (var _b = __values((0, database_1.sqlStrings)(command, eventFilter)), _c = _b.next(); !_c.done; _c = _b.next()) {
29
+ var sqlEvent = _c.value;
30
+ var occurrence = sqlCount[sqlEvent.sql];
31
+ if (!occurrence) {
32
+ occurrence = {
33
+ count: 1,
34
+ events: [sqlEvent.event],
35
+ };
36
+ sqlCount[sqlEvent.sql] = occurrence;
37
+ }
38
+ else {
39
+ occurrence.count += 1;
40
+ occurrence.events.push(sqlEvent.event);
41
+ }
42
+ }
43
+ }
44
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
45
+ finally {
46
+ try {
47
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
48
+ }
49
+ finally { if (e_1) throw e_1.error; }
50
+ }
51
+ return Object.keys(sqlCount).reduce(function (matchResults, sql) {
52
+ var occurrence = sqlCount[sql];
53
+ var buildMatchResult = function (level) {
54
+ return {
55
+ level: level,
56
+ event: occurrence.events[0],
57
+ message: occurrence.count + " occurrences of SQL: " + sql,
58
+ groupMessage: sql,
59
+ occurranceCount: occurrence.count,
60
+ relatedEvents: occurrence.events,
61
+ };
62
+ };
63
+ if (occurrence.count >= options.errorLimit) {
64
+ matchResults.push(buildMatchResult('error'));
65
+ }
66
+ else if (occurrence.count >= options.warningLimit) {
67
+ matchResults.push(buildMatchResult('warning'));
68
+ }
69
+ return matchResults;
70
+ }, []);
71
+ }
72
+ return {
73
+ matcher: matcher,
74
+ };
75
+ }
76
+ exports.default = {
77
+ id: 'n-plus-one-query',
78
+ title: 'N plus 1 SQL query',
79
+ scope: 'command',
80
+ enumerateScope: false,
81
+ Options: Options,
82
+ build: build,
83
+ };
84
+ //# sourceMappingURL=nPlusOneQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nPlusOneQuery.js","sourceRoot":"","sources":["../../src/rules/nPlusOneQuery.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAGA,wCAAmD;AAEnD;IAAA;QACS,iBAAY,GAAG,CAAC,CAAC;QACjB,eAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAAD,cAAC;AAAD,CAAC,AAHD,IAGC;AAED,8EAA8E;AAC9E,SAAS,KAAK,CAAC,OAAgB;IAC7B,IAAM,QAAQ,GAA6B,EAAE,CAAC;IAE9C,SAAS,OAAO,CACd,OAAc,EACd,OAAe,EACf,WAAwB;;;YAExB,KAAuB,IAAA,KAAA,SAAA,IAAA,qBAAU,EAAC,OAAO,EAAE,WAAW,CAAC,CAAA,gBAAA,4BAAE;gBAApD,IAAM,QAAQ,WAAA;gBACjB,IAAI,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,CAAC,UAAU,EAAE;oBACf,UAAU,GAAG;wBACX,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;qBACzB,CAAC;oBACF,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;iBACrC;qBAAM;oBACL,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;oBACtB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;iBACxC;aACF;;;;;;;;;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAC,YAAY,EAAE,GAAG;YACpD,IAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEjC,IAAM,gBAAgB,GAAG,UAAC,KAAY;gBACpC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC3B,OAAO,EAAK,UAAU,CAAC,KAAK,6BAAwB,GAAK;oBACzD,YAAY,EAAE,GAAG;oBACjB,eAAe,EAAE,UAAU,CAAC,KAAK;oBACjC,aAAa,EAAE,UAAU,CAAC,MAAM;iBACjC,CAAC;YACJ,CAAC,CAAC;YAEF,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE;gBAC1C,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;aAC9C;iBAAM,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE;gBACnD,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;aAChD;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,EAAE,EAAmB,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,OAAO,SAAA;KACR,CAAC;AACJ,CAAC;AAED,kBAAe;IACb,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,oBAAoB;IAC3B,KAAK,EAAE,SAAS;IAChB,cAAc,EAAE,KAAK;IACrB,OAAO,SAAA;IACP,KAAK,OAAA;CACE,CAAC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var matchPattern_1 = require("./lib/matchPattern");
4
+ // TODO: Use the Query AST for this.
5
+ var WHITELIST = [/\bBEGIN\b/i, /\bCOMMIT\b/i, /\bROLLBACK\b/i, /\bRELEASE\b/i, /\bSAVEPOINT\b/i];
6
+ var Options = /** @class */ (function () {
7
+ function Options() {
8
+ this.allowedPackages = [];
9
+ this.allowedQueries = WHITELIST.map(function (regexp) { return ({ match: regexp }); });
10
+ }
11
+ return Options;
12
+ }());
13
+ function build(options) {
14
+ var allowedPackages = (0, matchPattern_1.buildFilters)(options.allowedPackages);
15
+ var allowedQueries = (0, matchPattern_1.buildFilters)(options.allowedQueries);
16
+ function matcher(e) {
17
+ if (!allowedPackages.some(function (filter) { return filter(e.parent.codeObject.packageOf); })) {
18
+ return e.codeObject.id + " is invoked from illegal package " + e.parent.codeObject.packageOf;
19
+ }
20
+ return false;
21
+ }
22
+ function where(e) {
23
+ return !!e.sqlQuery && !!e.parent && !allowedQueries.some(function (pattern) { return pattern(e.sqlQuery); });
24
+ }
25
+ return {
26
+ matcher: matcher,
27
+ where: where,
28
+ };
29
+ }
30
+ exports.default = {
31
+ id: 'query-from-invalid-package',
32
+ title: 'Queries from invalid packages',
33
+ Options: Options,
34
+ enumerateScope: true,
35
+ build: build,
36
+ };
37
+ //# sourceMappingURL=queryFromInvalidPackage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryFromInvalidPackage.js","sourceRoot":"","sources":["../../src/rules/queryFromInvalidPackage.ts"],"names":[],"mappings":";;AAIA,mDAAkD;AAElD,oCAAoC;AACpC,IAAM,SAAS,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;AAEnG;IAAA;QACS,oBAAe,GAAyB,EAAE,CAAC;QAC3C,mBAAc,GAAyB,SAAS,CAAC,GAAG,CACzD,UAAC,MAAM,IAAK,OAAA,CAAC,EAAE,KAAK,EAAE,MAAM,EAAyB,CAAA,EAAzC,CAAyC,CACtD,CAAC;IACJ,CAAC;IAAD,cAAC;AAAD,CAAC,AALD,IAKC;AAED,SAAS,KAAK,CAAC,OAAgB;IAC7B,IAAM,eAAe,GAAG,IAAA,2BAAY,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9D,IAAM,cAAc,GAAG,IAAA,2BAAY,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5D,SAAS,OAAO,CAAC,CAAQ;QACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAC,MAAM,IAAK,OAAA,MAAM,CAAC,CAAC,CAAC,MAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAtC,CAAsC,CAAC,EAAE;YAC7E,OAAU,CAAC,CAAC,UAAU,CAAC,EAAE,yCAAoC,CAAC,CAAC,MAAO,CAAC,UAAU,CAAC,SAAW,CAAC;SAC/F;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,KAAK,CAAC,CAAQ;QACrB,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,CAAC,CAAC,QAAS,CAAC,EAApB,CAAoB,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO;QACL,OAAO,SAAA;QACP,KAAK,OAAA;KACN,CAAC;AACJ,CAAC;AAED,kBAAe;IACb,EAAE,EAAE,4BAA4B;IAChC,KAAK,EAAE,+BAA+B;IACtC,OAAO,SAAA;IACP,cAAc,EAAE,IAAI;IACpB,KAAK,OAAA;CACE,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var Options = /** @class */ (function () {
4
+ function Options() {
5
+ this.forbiddenLabel = 'mvc.template';
6
+ }
7
+ return Options;
8
+ }());
9
+ function build(options) {
10
+ if (options === void 0) { options = new Options(); }
11
+ function matcher(e) {
12
+ return e.ancestors().some(function (e) { return e.codeObject.labels.has(options.forbiddenLabel); });
13
+ }
14
+ function where(e) {
15
+ return !!e.sqlQuery;
16
+ }
17
+ return {
18
+ matcher: matcher,
19
+ where: where,
20
+ };
21
+ }
22
+ exports.default = {
23
+ id: 'query-from-view',
24
+ title: 'Queries from view',
25
+ Options: Options,
26
+ enumerateScope: true,
27
+ build: build,
28
+ };
29
+ //# sourceMappingURL=queryFromView.js.map