parse-server 2.8.4 → 8.6.2

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 (240) hide show
  1. package/LICENSE +167 -25
  2. package/NOTICE +10 -0
  3. package/README.md +929 -278
  4. package/lib/AccountLockout.js +47 -30
  5. package/lib/Adapters/AdapterLoader.js +21 -6
  6. package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
  7. package/lib/Adapters/Auth/AuthAdapter.js +116 -13
  8. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
  9. package/lib/Adapters/Auth/OAuth1Client.js +27 -46
  10. package/lib/Adapters/Auth/apple.js +123 -0
  11. package/lib/Adapters/Auth/facebook.js +162 -35
  12. package/lib/Adapters/Auth/gcenter.js +217 -0
  13. package/lib/Adapters/Auth/github.js +118 -48
  14. package/lib/Adapters/Auth/google.js +160 -51
  15. package/lib/Adapters/Auth/gpgames.js +125 -0
  16. package/lib/Adapters/Auth/httpsRequest.js +6 -7
  17. package/lib/Adapters/Auth/index.js +170 -62
  18. package/lib/Adapters/Auth/instagram.js +114 -40
  19. package/lib/Adapters/Auth/janraincapture.js +52 -23
  20. package/lib/Adapters/Auth/janrainengage.js +19 -36
  21. package/lib/Adapters/Auth/keycloak.js +148 -0
  22. package/lib/Adapters/Auth/ldap.js +167 -0
  23. package/lib/Adapters/Auth/line.js +125 -0
  24. package/lib/Adapters/Auth/linkedin.js +111 -55
  25. package/lib/Adapters/Auth/meetup.js +24 -34
  26. package/lib/Adapters/Auth/mfa.js +324 -0
  27. package/lib/Adapters/Auth/microsoft.js +111 -0
  28. package/lib/Adapters/Auth/oauth2.js +97 -162
  29. package/lib/Adapters/Auth/phantauth.js +53 -0
  30. package/lib/Adapters/Auth/qq.js +108 -49
  31. package/lib/Adapters/Auth/spotify.js +107 -55
  32. package/lib/Adapters/Auth/twitter.js +188 -48
  33. package/lib/Adapters/Auth/utils.js +28 -0
  34. package/lib/Adapters/Auth/vkontakte.js +26 -39
  35. package/lib/Adapters/Auth/wechat.js +106 -44
  36. package/lib/Adapters/Auth/weibo.js +132 -58
  37. package/lib/Adapters/Cache/CacheAdapter.js +13 -8
  38. package/lib/Adapters/Cache/InMemoryCache.js +3 -13
  39. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
  40. package/lib/Adapters/Cache/LRUCache.js +13 -27
  41. package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
  42. package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
  43. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  44. package/lib/Adapters/Email/MailAdapter.js +10 -8
  45. package/lib/Adapters/Files/FilesAdapter.js +83 -25
  46. package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
  47. package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
  48. package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
  49. package/lib/Adapters/Logger/WinstonLogger.js +69 -88
  50. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
  51. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
  52. package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
  53. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  54. package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
  55. package/lib/Adapters/Push/PushAdapter.js +14 -7
  56. package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
  57. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
  58. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
  59. package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
  60. package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
  61. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
  62. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
  63. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
  64. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  65. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  66. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  67. package/lib/Auth.js +488 -125
  68. package/lib/ClientSDK.js +2 -6
  69. package/lib/Config.js +525 -94
  70. package/lib/Controllers/AdaptableController.js +5 -25
  71. package/lib/Controllers/AnalyticsController.js +22 -23
  72. package/lib/Controllers/CacheController.js +10 -31
  73. package/lib/Controllers/DatabaseController.js +767 -313
  74. package/lib/Controllers/FilesController.js +49 -54
  75. package/lib/Controllers/HooksController.js +80 -84
  76. package/lib/Controllers/LiveQueryController.js +35 -22
  77. package/lib/Controllers/LoggerController.js +22 -58
  78. package/lib/Controllers/ParseGraphQLController.js +293 -0
  79. package/lib/Controllers/PushController.js +58 -49
  80. package/lib/Controllers/SchemaController.js +916 -422
  81. package/lib/Controllers/UserController.js +265 -180
  82. package/lib/Controllers/index.js +90 -125
  83. package/lib/Controllers/types.js +1 -1
  84. package/lib/Deprecator/Deprecations.js +30 -0
  85. package/lib/Deprecator/Deprecator.js +127 -0
  86. package/lib/Error.js +48 -0
  87. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  88. package/lib/GraphQL/ParseGraphQLServer.js +214 -0
  89. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  90. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  91. package/lib/GraphQL/loaders/configMutations.js +87 -0
  92. package/lib/GraphQL/loaders/configQueries.js +79 -0
  93. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  94. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  95. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
  96. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  97. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  98. package/lib/GraphQL/loaders/functionsMutations.js +78 -0
  99. package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
  100. package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
  101. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  102. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  103. package/lib/GraphQL/loaders/schemaMutations.js +162 -0
  104. package/lib/GraphQL/loaders/schemaQueries.js +81 -0
  105. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  106. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  107. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  108. package/lib/GraphQL/parseGraphQLUtils.js +63 -0
  109. package/lib/GraphQL/transformers/className.js +14 -0
  110. package/lib/GraphQL/transformers/constraintType.js +53 -0
  111. package/lib/GraphQL/transformers/inputType.js +51 -0
  112. package/lib/GraphQL/transformers/mutation.js +274 -0
  113. package/lib/GraphQL/transformers/outputType.js +51 -0
  114. package/lib/GraphQL/transformers/query.js +237 -0
  115. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  116. package/lib/KeyPromiseQueue.js +48 -0
  117. package/lib/LiveQuery/Client.js +25 -33
  118. package/lib/LiveQuery/Id.js +2 -5
  119. package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
  120. package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
  121. package/lib/LiveQuery/ParsePubSub.js +7 -16
  122. package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
  123. package/lib/LiveQuery/QueryTools.js +76 -15
  124. package/lib/LiveQuery/RequestSchema.js +111 -97
  125. package/lib/LiveQuery/SessionTokenCache.js +23 -36
  126. package/lib/LiveQuery/Subscription.js +8 -17
  127. package/lib/LiveQuery/equalObjects.js +2 -3
  128. package/lib/Options/Definitions.js +1355 -382
  129. package/lib/Options/docs.js +301 -62
  130. package/lib/Options/index.js +11 -1
  131. package/lib/Options/parsers.js +14 -10
  132. package/lib/Page.js +44 -0
  133. package/lib/ParseMessageQueue.js +6 -13
  134. package/lib/ParseServer.js +474 -235
  135. package/lib/ParseServerRESTController.js +102 -40
  136. package/lib/PromiseRouter.js +39 -50
  137. package/lib/Push/PushQueue.js +24 -30
  138. package/lib/Push/PushWorker.js +32 -56
  139. package/lib/Push/utils.js +22 -35
  140. package/lib/RestQuery.js +361 -139
  141. package/lib/RestWrite.js +713 -344
  142. package/lib/Routers/AggregateRouter.js +97 -71
  143. package/lib/Routers/AnalyticsRouter.js +8 -14
  144. package/lib/Routers/AudiencesRouter.js +16 -35
  145. package/lib/Routers/ClassesRouter.js +86 -72
  146. package/lib/Routers/CloudCodeRouter.js +28 -37
  147. package/lib/Routers/FeaturesRouter.js +22 -25
  148. package/lib/Routers/FilesRouter.js +266 -171
  149. package/lib/Routers/FunctionsRouter.js +87 -103
  150. package/lib/Routers/GlobalConfigRouter.js +94 -33
  151. package/lib/Routers/GraphQLRouter.js +41 -0
  152. package/lib/Routers/HooksRouter.js +43 -47
  153. package/lib/Routers/IAPValidationRouter.js +57 -70
  154. package/lib/Routers/InstallationsRouter.js +17 -25
  155. package/lib/Routers/LogsRouter.js +10 -25
  156. package/lib/Routers/PagesRouter.js +647 -0
  157. package/lib/Routers/PublicAPIRouter.js +104 -112
  158. package/lib/Routers/PurgeRouter.js +19 -29
  159. package/lib/Routers/PushRouter.js +14 -28
  160. package/lib/Routers/RolesRouter.js +7 -14
  161. package/lib/Routers/SchemasRouter.js +63 -42
  162. package/lib/Routers/SecurityRouter.js +34 -0
  163. package/lib/Routers/SessionsRouter.js +25 -38
  164. package/lib/Routers/UsersRouter.js +463 -190
  165. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  166. package/lib/SchemaMigrations/Migrations.js +30 -0
  167. package/lib/Security/Check.js +109 -0
  168. package/lib/Security/CheckGroup.js +44 -0
  169. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  170. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
  171. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  172. package/lib/Security/CheckRunner.js +213 -0
  173. package/lib/SharedRest.js +29 -0
  174. package/lib/StatusHandler.js +96 -93
  175. package/lib/TestUtils.js +70 -14
  176. package/lib/Utils.js +468 -0
  177. package/lib/batch.js +74 -40
  178. package/lib/cache.js +8 -8
  179. package/lib/cli/definitions/parse-live-query-server.js +4 -3
  180. package/lib/cli/definitions/parse-server.js +4 -3
  181. package/lib/cli/parse-live-query-server.js +9 -17
  182. package/lib/cli/parse-server.js +49 -47
  183. package/lib/cli/utils/commander.js +20 -29
  184. package/lib/cli/utils/runner.js +31 -32
  185. package/lib/cloud-code/Parse.Cloud.js +711 -36
  186. package/lib/cloud-code/Parse.Server.js +21 -0
  187. package/lib/cryptoUtils.js +6 -11
  188. package/lib/defaults.js +21 -15
  189. package/lib/deprecated.js +1 -1
  190. package/lib/index.js +78 -67
  191. package/lib/logger.js +12 -20
  192. package/lib/middlewares.js +484 -160
  193. package/lib/password.js +10 -6
  194. package/lib/request.js +175 -0
  195. package/lib/requiredParameter.js +4 -3
  196. package/lib/rest.js +157 -82
  197. package/lib/triggers.js +627 -185
  198. package/lib/vendor/README.md +3 -3
  199. package/lib/vendor/mongodbUrl.js +224 -137
  200. package/package.json +135 -57
  201. package/postinstall.js +38 -50
  202. package/public_html/invalid_verification_link.html +3 -3
  203. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  204. package/types/@types/deepcopy/index.d.ts +5 -0
  205. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  206. package/types/Options/index.d.ts +301 -0
  207. package/types/ParseServer.d.ts +65 -0
  208. package/types/eslint.config.mjs +30 -0
  209. package/types/index.d.ts +21 -0
  210. package/types/logger.d.ts +2 -0
  211. package/types/tests.ts +44 -0
  212. package/types/tsconfig.json +24 -0
  213. package/CHANGELOG.md +0 -1246
  214. package/PATENTS +0 -37
  215. package/bin/dev +0 -37
  216. package/lib/.DS_Store +0 -0
  217. package/lib/Adapters/Auth/common.js +0 -2
  218. package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
  219. package/lib/Controllers/SchemaCache.js +0 -97
  220. package/lib/LiveQuery/.DS_Store +0 -0
  221. package/lib/cli/utils/parsers.js +0 -77
  222. package/lib/cloud-code/.DS_Store +0 -0
  223. package/lib/cloud-code/HTTPResponse.js +0 -57
  224. package/lib/cloud-code/Untitled-1 +0 -123
  225. package/lib/cloud-code/httpRequest.js +0 -102
  226. package/lib/cloud-code/team.html +0 -123
  227. package/lib/graphql/ParseClass.js +0 -234
  228. package/lib/graphql/Schema.js +0 -197
  229. package/lib/graphql/index.js +0 -1
  230. package/lib/graphql/types/ACL.js +0 -35
  231. package/lib/graphql/types/Date.js +0 -25
  232. package/lib/graphql/types/File.js +0 -24
  233. package/lib/graphql/types/GeoPoint.js +0 -35
  234. package/lib/graphql/types/JSONObject.js +0 -30
  235. package/lib/graphql/types/NumberInput.js +0 -43
  236. package/lib/graphql/types/NumberQuery.js +0 -42
  237. package/lib/graphql/types/Pointer.js +0 -35
  238. package/lib/graphql/types/QueryConstraint.js +0 -61
  239. package/lib/graphql/types/StringQuery.js +0 -39
  240. package/lib/graphql/types/index.js +0 -110
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * A group of security checks.
5
+ * @interface
6
+ * @memberof module:SecurityCheck
7
+ */
8
+ class CheckGroup {
9
+ constructor() {
10
+ this._name = this.setName();
11
+ this._checks = this.setChecks();
12
+ }
13
+
14
+ /**
15
+ * The security check group name; to be overridden by child class.
16
+ */
17
+ setName() {
18
+ throw `Check group has no name.`;
19
+ }
20
+ name() {
21
+ return this._name;
22
+ }
23
+
24
+ /**
25
+ * The security checks; to be overridden by child class.
26
+ */
27
+ setChecks() {
28
+ throw `Check group has no checks.`;
29
+ }
30
+ checks() {
31
+ return this._checks;
32
+ }
33
+
34
+ /**
35
+ * Runs all checks.
36
+ */
37
+ async run() {
38
+ for (const check of this._checks) {
39
+ check.run();
40
+ }
41
+ }
42
+ }
43
+ module.exports = CheckGroup;
44
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDaGVja0dyb3VwIiwiY29uc3RydWN0b3IiLCJfbmFtZSIsInNldE5hbWUiLCJfY2hlY2tzIiwic2V0Q2hlY2tzIiwibmFtZSIsImNoZWNrcyIsInJ1biIsImNoZWNrIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZWN1cml0eS9DaGVja0dyb3VwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBncm91cCBvZiBzZWN1cml0eSBjaGVja3MuXG4gKiBAaW50ZXJmYWNlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOlNlY3VyaXR5Q2hlY2tcbiAqL1xuY2xhc3MgQ2hlY2tHcm91cCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX25hbWUgPSB0aGlzLnNldE5hbWUoKTtcbiAgICB0aGlzLl9jaGVja3MgPSB0aGlzLnNldENoZWNrcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWN1cml0eSBjaGVjayBncm91cCBuYW1lOyB0byBiZSBvdmVycmlkZGVuIGJ5IGNoaWxkIGNsYXNzLlxuICAgKi9cbiAgc2V0TmFtZSgpIHtcbiAgICB0aHJvdyBgQ2hlY2sgZ3JvdXAgaGFzIG5vIG5hbWUuYDtcbiAgfVxuICBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWN1cml0eSBjaGVja3M7IHRvIGJlIG92ZXJyaWRkZW4gYnkgY2hpbGQgY2xhc3MuXG4gICAqL1xuICBzZXRDaGVja3MoKSB7XG4gICAgdGhyb3cgYENoZWNrIGdyb3VwIGhhcyBubyBjaGVja3MuYDtcbiAgfVxuICBjaGVja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFsbCBjaGVja3MuXG4gICAqL1xuICBhc3luYyBydW4oKSB7XG4gICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9jaGVja3MpIHtcbiAgICAgIGNoZWNrLnJ1bigpO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENoZWNrR3JvdXA7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLFVBQVUsQ0FBQztFQUNmQyxXQUFXQSxDQUFBLEVBQUc7SUFDWixJQUFJLENBQUNDLEtBQUssR0FBRyxJQUFJLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUksQ0FBQ0MsU0FBUyxDQUFDLENBQUM7RUFDakM7O0VBRUE7QUFDRjtBQUNBO0VBQ0VGLE9BQU9BLENBQUEsRUFBRztJQUNSLE1BQU0sMEJBQTBCO0VBQ2xDO0VBQ0FHLElBQUlBLENBQUEsRUFBRztJQUNMLE9BQU8sSUFBSSxDQUFDSixLQUFLO0VBQ25COztFQUVBO0FBQ0Y7QUFDQTtFQUNFRyxTQUFTQSxDQUFBLEVBQUc7SUFDVixNQUFNLDRCQUE0QjtFQUNwQztFQUNBRSxNQUFNQSxDQUFBLEVBQUc7SUFDUCxPQUFPLElBQUksQ0FBQ0gsT0FBTztFQUNyQjs7RUFFQTtBQUNGO0FBQ0E7RUFDRSxNQUFNSSxHQUFHQSxDQUFBLEVBQUc7SUFDVixLQUFLLE1BQU1DLEtBQUssSUFBSSxJQUFJLENBQUNMLE9BQU8sRUFBRTtNQUNoQ0ssS0FBSyxDQUFDRCxHQUFHLENBQUMsQ0FBQztJQUNiO0VBQ0Y7QUFDRjtBQUVBRSxNQUFNLENBQUNDLE9BQU8sR0FBR1gsVUFBVSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ var _Check = require("../Check");
4
+ var _CheckGroup = _interopRequireDefault(require("../CheckGroup"));
5
+ var _Config = _interopRequireDefault(require("../../Config"));
6
+ var _node = _interopRequireDefault(require("parse/node"));
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ /**
9
+ * The security checks group for Parse Server configuration.
10
+ * Checks common Parse Server parameters such as access keys
11
+ * @memberof module:SecurityCheck
12
+ */
13
+ class CheckGroupDatabase extends _CheckGroup.default {
14
+ setName() {
15
+ return 'Database';
16
+ }
17
+ setChecks() {
18
+ const config = _Config.default.get(_node.default.applicationId);
19
+ const databaseAdapter = config.database.adapter;
20
+ const databaseUrl = databaseAdapter._uri;
21
+ return [new _Check.Check({
22
+ title: 'Secure database password',
23
+ warning: 'The database password is insecure and vulnerable to brute force attacks.',
24
+ solution: 'Choose a longer and/or more complex password with a combination of upper- and lowercase characters, numbers and special characters.',
25
+ check: () => {
26
+ const password = databaseUrl.match(/\/\/\S+:(\S+)@/)[1];
27
+ const hasUpperCase = /[A-Z]/.test(password);
28
+ const hasLowerCase = /[a-z]/.test(password);
29
+ const hasNumbers = /\d/.test(password);
30
+ const hasNonAlphasNumerics = /\W/.test(password);
31
+ // Ensure length
32
+ if (password.length < 14) {
33
+ throw 1;
34
+ }
35
+ // Ensure at least 3 out of 4 requirements passed
36
+ if (hasUpperCase + hasLowerCase + hasNumbers + hasNonAlphasNumerics < 3) {
37
+ throw 1;
38
+ }
39
+ }
40
+ })];
41
+ }
42
+ }
43
+ module.exports = CheckGroupDatabase;
44
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQ2hlY2siLCJyZXF1aXJlIiwiX0NoZWNrR3JvdXAiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0NvbmZpZyIsIl9ub2RlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiQ2hlY2tHcm91cERhdGFiYXNlIiwiQ2hlY2tHcm91cCIsInNldE5hbWUiLCJzZXRDaGVja3MiLCJjb25maWciLCJDb25maWciLCJnZXQiLCJQYXJzZSIsImFwcGxpY2F0aW9uSWQiLCJkYXRhYmFzZUFkYXB0ZXIiLCJkYXRhYmFzZSIsImFkYXB0ZXIiLCJkYXRhYmFzZVVybCIsIl91cmkiLCJDaGVjayIsInRpdGxlIiwid2FybmluZyIsInNvbHV0aW9uIiwiY2hlY2siLCJwYXNzd29yZCIsIm1hdGNoIiwiaGFzVXBwZXJDYXNlIiwidGVzdCIsImhhc0xvd2VyQ2FzZSIsImhhc051bWJlcnMiLCJoYXNOb25BbHBoYXNOdW1lcmljcyIsImxlbmd0aCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvU2VjdXJpdHkvQ2hlY2tHcm91cHMvQ2hlY2tHcm91cERhdGFiYXNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoZWNrIH0gZnJvbSAnLi4vQ2hlY2snO1xuaW1wb3J0IENoZWNrR3JvdXAgZnJvbSAnLi4vQ2hlY2tHcm91cCc7XG5pbXBvcnQgQ29uZmlnIGZyb20gJy4uLy4uL0NvbmZpZyc7XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG5cbi8qKlxuICogVGhlIHNlY3VyaXR5IGNoZWNrcyBncm91cCBmb3IgUGFyc2UgU2VydmVyIGNvbmZpZ3VyYXRpb24uXG4gKiBDaGVja3MgY29tbW9uIFBhcnNlIFNlcnZlciBwYXJhbWV0ZXJzIHN1Y2ggYXMgYWNjZXNzIGtleXNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6U2VjdXJpdHlDaGVja1xuICovXG5jbGFzcyBDaGVja0dyb3VwRGF0YWJhc2UgZXh0ZW5kcyBDaGVja0dyb3VwIHtcbiAgc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gJ0RhdGFiYXNlJztcbiAgfVxuICBzZXRDaGVja3MoKSB7XG4gICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChQYXJzZS5hcHBsaWNhdGlvbklkKTtcbiAgICBjb25zdCBkYXRhYmFzZUFkYXB0ZXIgPSBjb25maWcuZGF0YWJhc2UuYWRhcHRlcjtcbiAgICBjb25zdCBkYXRhYmFzZVVybCA9IGRhdGFiYXNlQWRhcHRlci5fdXJpO1xuICAgIHJldHVybiBbXG4gICAgICBuZXcgQ2hlY2soe1xuICAgICAgICB0aXRsZTogJ1NlY3VyZSBkYXRhYmFzZSBwYXNzd29yZCcsXG4gICAgICAgIHdhcm5pbmc6ICdUaGUgZGF0YWJhc2UgcGFzc3dvcmQgaXMgaW5zZWN1cmUgYW5kIHZ1bG5lcmFibGUgdG8gYnJ1dGUgZm9yY2UgYXR0YWNrcy4nLFxuICAgICAgICBzb2x1dGlvbjpcbiAgICAgICAgICAnQ2hvb3NlIGEgbG9uZ2VyIGFuZC9vciBtb3JlIGNvbXBsZXggcGFzc3dvcmQgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIHVwcGVyLSBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMsIG51bWJlcnMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycy4nLFxuICAgICAgICBjaGVjazogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gZGF0YWJhc2VVcmwubWF0Y2goL1xcL1xcL1xcUys6KFxcUyspQC8pWzFdO1xuICAgICAgICAgIGNvbnN0IGhhc1VwcGVyQ2FzZSA9IC9bQS1aXS8udGVzdChwYXNzd29yZCk7XG4gICAgICAgICAgY29uc3QgaGFzTG93ZXJDYXNlID0gL1thLXpdLy50ZXN0KHBhc3N3b3JkKTtcbiAgICAgICAgICBjb25zdCBoYXNOdW1iZXJzID0gL1xcZC8udGVzdChwYXNzd29yZCk7XG4gICAgICAgICAgY29uc3QgaGFzTm9uQWxwaGFzTnVtZXJpY3MgPSAvXFxXLy50ZXN0KHBhc3N3b3JkKTtcbiAgICAgICAgICAvLyBFbnN1cmUgbGVuZ3RoXG4gICAgICAgICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDE0KSB7XG4gICAgICAgICAgICB0aHJvdyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFbnN1cmUgYXQgbGVhc3QgMyBvdXQgb2YgNCByZXF1aXJlbWVudHMgcGFzc2VkXG4gICAgICAgICAgaWYgKGhhc1VwcGVyQ2FzZSArIGhhc0xvd2VyQ2FzZSArIGhhc051bWJlcnMgKyBoYXNOb25BbHBoYXNOdW1lcmljcyA8IDMpIHtcbiAgICAgICAgICAgIHRocm93IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENoZWNrR3JvdXBEYXRhYmFzZTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxLQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFBK0IsU0FBQUUsdUJBQUFHLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1HLGtCQUFrQixTQUFTQyxtQkFBVSxDQUFDO0VBQzFDQyxPQUFPQSxDQUFBLEVBQUc7SUFDUixPQUFPLFVBQVU7RUFDbkI7RUFDQUMsU0FBU0EsQ0FBQSxFQUFHO0lBQ1YsTUFBTUMsTUFBTSxHQUFHQyxlQUFNLENBQUNDLEdBQUcsQ0FBQ0MsYUFBSyxDQUFDQyxhQUFhLENBQUM7SUFDOUMsTUFBTUMsZUFBZSxHQUFHTCxNQUFNLENBQUNNLFFBQVEsQ0FBQ0MsT0FBTztJQUMvQyxNQUFNQyxXQUFXLEdBQUdILGVBQWUsQ0FBQ0ksSUFBSTtJQUN4QyxPQUFPLENBQ0wsSUFBSUMsWUFBSyxDQUFDO01BQ1JDLEtBQUssRUFBRSwwQkFBMEI7TUFDakNDLE9BQU8sRUFBRSwwRUFBMEU7TUFDbkZDLFFBQVEsRUFDTixxSUFBcUk7TUFDdklDLEtBQUssRUFBRUEsQ0FBQSxLQUFNO1FBQ1gsTUFBTUMsUUFBUSxHQUFHUCxXQUFXLENBQUNRLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNQyxZQUFZLEdBQUcsT0FBTyxDQUFDQyxJQUFJLENBQUNILFFBQVEsQ0FBQztRQUMzQyxNQUFNSSxZQUFZLEdBQUcsT0FBTyxDQUFDRCxJQUFJLENBQUNILFFBQVEsQ0FBQztRQUMzQyxNQUFNSyxVQUFVLEdBQUcsSUFBSSxDQUFDRixJQUFJLENBQUNILFFBQVEsQ0FBQztRQUN0QyxNQUFNTSxvQkFBb0IsR0FBRyxJQUFJLENBQUNILElBQUksQ0FBQ0gsUUFBUSxDQUFDO1FBQ2hEO1FBQ0EsSUFBSUEsUUFBUSxDQUFDTyxNQUFNLEdBQUcsRUFBRSxFQUFFO1VBQ3hCLE1BQU0sQ0FBQztRQUNUO1FBQ0E7UUFDQSxJQUFJTCxZQUFZLEdBQUdFLFlBQVksR0FBR0MsVUFBVSxHQUFHQyxvQkFBb0IsR0FBRyxDQUFDLEVBQUU7VUFDdkUsTUFBTSxDQUFDO1FBQ1Q7TUFDRjtJQUNGLENBQUMsQ0FBQyxDQUNIO0VBQ0g7QUFDRjtBQUVBRSxNQUFNLENBQUNDLE9BQU8sR0FBRzVCLGtCQUFrQiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ var _Check = require("../Check");
4
+ var _CheckGroup = _interopRequireDefault(require("../CheckGroup"));
5
+ var _Config = _interopRequireDefault(require("../../Config"));
6
+ var _node = _interopRequireDefault(require("parse/node"));
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ /**
9
+ * The security checks group for Parse Server configuration.
10
+ * Checks common Parse Server parameters such as access keys.
11
+ * @memberof module:SecurityCheck
12
+ */
13
+ class CheckGroupServerConfig extends _CheckGroup.default {
14
+ setName() {
15
+ return 'Parse Server Configuration';
16
+ }
17
+ setChecks() {
18
+ const config = _Config.default.get(_node.default.applicationId);
19
+ return [new _Check.Check({
20
+ title: 'Secure master key',
21
+ warning: 'The Parse Server master key is insecure and vulnerable to brute force attacks.',
22
+ solution: 'Choose a longer and/or more complex master key with a combination of upper- and lowercase characters, numbers and special characters.',
23
+ check: () => {
24
+ const masterKey = config.masterKey;
25
+ const hasUpperCase = /[A-Z]/.test(masterKey);
26
+ const hasLowerCase = /[a-z]/.test(masterKey);
27
+ const hasNumbers = /\d/.test(masterKey);
28
+ const hasNonAlphasNumerics = /\W/.test(masterKey);
29
+ // Ensure length
30
+ if (masterKey.length < 14) {
31
+ throw 1;
32
+ }
33
+ // Ensure at least 3 out of 4 requirements passed
34
+ if (hasUpperCase + hasLowerCase + hasNumbers + hasNonAlphasNumerics < 3) {
35
+ throw 1;
36
+ }
37
+ }
38
+ }), new _Check.Check({
39
+ title: 'Security log disabled',
40
+ warning: 'Security checks in logs may expose vulnerabilities to anyone with access to logs.',
41
+ solution: "Change Parse Server configuration to 'security.enableCheckLog: false'.",
42
+ check: () => {
43
+ if (config.security && config.security.enableCheckLog) {
44
+ throw 1;
45
+ }
46
+ }
47
+ }), new _Check.Check({
48
+ title: 'Client class creation disabled',
49
+ warning: 'Attackers are allowed to create new classes without restriction and flood the database.',
50
+ solution: "Change Parse Server configuration to 'allowClientClassCreation: false'.",
51
+ check: () => {
52
+ if (config.allowClientClassCreation || config.allowClientClassCreation == null) {
53
+ throw 1;
54
+ }
55
+ }
56
+ }), new _Check.Check({
57
+ title: 'Users are created without public access',
58
+ warning: 'Users with public read access are exposed to anyone who knows their object IDs, or to anyone who can query the Parse.User class.',
59
+ solution: "Change Parse Server configuration to 'enforcePrivateUsers: true'.",
60
+ check: () => {
61
+ if (!config.enforcePrivateUsers) {
62
+ throw 1;
63
+ }
64
+ }
65
+ }), new _Check.Check({
66
+ title: 'Insecure auth adapters disabled',
67
+ warning: "Attackers may explore insecure auth adapters' vulnerabilities and log in on behalf of another user.",
68
+ solution: "Change Parse Server configuration to 'enableInsecureAuthAdapters: false'.",
69
+ check: () => {
70
+ if (config.enableInsecureAuthAdapters !== false) {
71
+ throw 1;
72
+ }
73
+ }
74
+ }), new _Check.Check({
75
+ title: 'GraphQL public introspection disabled',
76
+ warning: 'GraphQL public introspection is enabled, which allows anyone to access the GraphQL schema.',
77
+ solution: "Change Parse Server configuration to 'graphQLPublicIntrospection: false'. You will need to use master key or maintenance key to access the GraphQL schema.",
78
+ check: () => {
79
+ if (config.graphQLPublicIntrospection !== false) {
80
+ throw 1;
81
+ }
82
+ }
83
+ }), new _Check.Check({
84
+ title: 'Public database explain disabled',
85
+ warning: 'Database explain queries are publicly accessible, which may expose sensitive database performance information and schema details.',
86
+ solution: "Change Parse Server configuration to 'databaseOptions.allowPublicExplain: false'. You will need to use master key to run explain queries.",
87
+ check: () => {
88
+ if (config.databaseOptions?.allowPublicExplain === true || config.databaseOptions?.allowPublicExplain == null) {
89
+ throw 1;
90
+ }
91
+ }
92
+ })];
93
+ }
94
+ }
95
+ module.exports = CheckGroupServerConfig;
96
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQ2hlY2siLCJyZXF1aXJlIiwiX0NoZWNrR3JvdXAiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0NvbmZpZyIsIl9ub2RlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiQ2hlY2tHcm91cFNlcnZlckNvbmZpZyIsIkNoZWNrR3JvdXAiLCJzZXROYW1lIiwic2V0Q2hlY2tzIiwiY29uZmlnIiwiQ29uZmlnIiwiZ2V0IiwiUGFyc2UiLCJhcHBsaWNhdGlvbklkIiwiQ2hlY2siLCJ0aXRsZSIsIndhcm5pbmciLCJzb2x1dGlvbiIsImNoZWNrIiwibWFzdGVyS2V5IiwiaGFzVXBwZXJDYXNlIiwidGVzdCIsImhhc0xvd2VyQ2FzZSIsImhhc051bWJlcnMiLCJoYXNOb25BbHBoYXNOdW1lcmljcyIsImxlbmd0aCIsInNlY3VyaXR5IiwiZW5hYmxlQ2hlY2tMb2ciLCJhbGxvd0NsaWVudENsYXNzQ3JlYXRpb24iLCJlbmZvcmNlUHJpdmF0ZVVzZXJzIiwiZW5hYmxlSW5zZWN1cmVBdXRoQWRhcHRlcnMiLCJncmFwaFFMUHVibGljSW50cm9zcGVjdGlvbiIsImRhdGFiYXNlT3B0aW9ucyIsImFsbG93UHVibGljRXhwbGFpbiIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvU2VjdXJpdHkvQ2hlY2tHcm91cHMvQ2hlY2tHcm91cFNlcnZlckNvbmZpZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGVjayB9IGZyb20gJy4uL0NoZWNrJztcbmltcG9ydCBDaGVja0dyb3VwIGZyb20gJy4uL0NoZWNrR3JvdXAnO1xuaW1wb3J0IENvbmZpZyBmcm9tICcuLi8uLi9Db25maWcnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG4vKipcbiAqIFRoZSBzZWN1cml0eSBjaGVja3MgZ3JvdXAgZm9yIFBhcnNlIFNlcnZlciBjb25maWd1cmF0aW9uLlxuICogQ2hlY2tzIGNvbW1vbiBQYXJzZSBTZXJ2ZXIgcGFyYW1ldGVycyBzdWNoIGFzIGFjY2VzcyBrZXlzLlxuICogQG1lbWJlcm9mIG1vZHVsZTpTZWN1cml0eUNoZWNrXG4gKi9cbmNsYXNzIENoZWNrR3JvdXBTZXJ2ZXJDb25maWcgZXh0ZW5kcyBDaGVja0dyb3VwIHtcbiAgc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gJ1BhcnNlIFNlcnZlciBDb25maWd1cmF0aW9uJztcbiAgfVxuICBzZXRDaGVja3MoKSB7XG4gICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChQYXJzZS5hcHBsaWNhdGlvbklkKTtcbiAgICByZXR1cm4gW1xuICAgICAgbmV3IENoZWNrKHtcbiAgICAgICAgdGl0bGU6ICdTZWN1cmUgbWFzdGVyIGtleScsXG4gICAgICAgIHdhcm5pbmc6ICdUaGUgUGFyc2UgU2VydmVyIG1hc3RlciBrZXkgaXMgaW5zZWN1cmUgYW5kIHZ1bG5lcmFibGUgdG8gYnJ1dGUgZm9yY2UgYXR0YWNrcy4nLFxuICAgICAgICBzb2x1dGlvbjpcbiAgICAgICAgICAnQ2hvb3NlIGEgbG9uZ2VyIGFuZC9vciBtb3JlIGNvbXBsZXggbWFzdGVyIGtleSB3aXRoIGEgY29tYmluYXRpb24gb2YgdXBwZXItIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycywgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLicsXG4gICAgICAgIGNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWFzdGVyS2V5ID0gY29uZmlnLm1hc3RlcktleTtcbiAgICAgICAgICBjb25zdCBoYXNVcHBlckNhc2UgPSAvW0EtWl0vLnRlc3QobWFzdGVyS2V5KTtcbiAgICAgICAgICBjb25zdCBoYXNMb3dlckNhc2UgPSAvW2Etel0vLnRlc3QobWFzdGVyS2V5KTtcbiAgICAgICAgICBjb25zdCBoYXNOdW1iZXJzID0gL1xcZC8udGVzdChtYXN0ZXJLZXkpO1xuICAgICAgICAgIGNvbnN0IGhhc05vbkFscGhhc051bWVyaWNzID0gL1xcVy8udGVzdChtYXN0ZXJLZXkpO1xuICAgICAgICAgIC8vIEVuc3VyZSBsZW5ndGhcbiAgICAgICAgICBpZiAobWFzdGVyS2V5Lmxlbmd0aCA8IDE0KSB7XG4gICAgICAgICAgICB0aHJvdyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFbnN1cmUgYXQgbGVhc3QgMyBvdXQgb2YgNCByZXF1aXJlbWVudHMgcGFzc2VkXG4gICAgICAgICAgaWYgKGhhc1VwcGVyQ2FzZSArIGhhc0xvd2VyQ2FzZSArIGhhc051bWJlcnMgKyBoYXNOb25BbHBoYXNOdW1lcmljcyA8IDMpIHtcbiAgICAgICAgICAgIHRocm93IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBuZXcgQ2hlY2soe1xuICAgICAgICB0aXRsZTogJ1NlY3VyaXR5IGxvZyBkaXNhYmxlZCcsXG4gICAgICAgIHdhcm5pbmc6XG4gICAgICAgICAgJ1NlY3VyaXR5IGNoZWNrcyBpbiBsb2dzIG1heSBleHBvc2UgdnVsbmVyYWJpbGl0aWVzIHRvIGFueW9uZSB3aXRoIGFjY2VzcyB0byBsb2dzLicsXG4gICAgICAgIHNvbHV0aW9uOiBcIkNoYW5nZSBQYXJzZSBTZXJ2ZXIgY29uZmlndXJhdGlvbiB0byAnc2VjdXJpdHkuZW5hYmxlQ2hlY2tMb2c6IGZhbHNlJy5cIixcbiAgICAgICAgY2hlY2s6ICgpID0+IHtcbiAgICAgICAgICBpZiAoY29uZmlnLnNlY3VyaXR5ICYmIGNvbmZpZy5zZWN1cml0eS5lbmFibGVDaGVja0xvZykge1xuICAgICAgICAgICAgdGhyb3cgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIG5ldyBDaGVjayh7XG4gICAgICAgIHRpdGxlOiAnQ2xpZW50IGNsYXNzIGNyZWF0aW9uIGRpc2FibGVkJyxcbiAgICAgICAgd2FybmluZzpcbiAgICAgICAgICAnQXR0YWNrZXJzIGFyZSBhbGxvd2VkIHRvIGNyZWF0ZSBuZXcgY2xhc3NlcyB3aXRob3V0IHJlc3RyaWN0aW9uIGFuZCBmbG9vZCB0aGUgZGF0YWJhc2UuJyxcbiAgICAgICAgc29sdXRpb246IFwiQ2hhbmdlIFBhcnNlIFNlcnZlciBjb25maWd1cmF0aW9uIHRvICdhbGxvd0NsaWVudENsYXNzQ3JlYXRpb246IGZhbHNlJy5cIixcbiAgICAgICAgY2hlY2s6ICgpID0+IHtcbiAgICAgICAgICBpZiAoY29uZmlnLmFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiB8fCBjb25maWcuYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBuZXcgQ2hlY2soe1xuICAgICAgICB0aXRsZTogJ1VzZXJzIGFyZSBjcmVhdGVkIHdpdGhvdXQgcHVibGljIGFjY2VzcycsXG4gICAgICAgIHdhcm5pbmc6XG4gICAgICAgICAgJ1VzZXJzIHdpdGggcHVibGljIHJlYWQgYWNjZXNzIGFyZSBleHBvc2VkIHRvIGFueW9uZSB3aG8ga25vd3MgdGhlaXIgb2JqZWN0IElEcywgb3IgdG8gYW55b25lIHdobyBjYW4gcXVlcnkgdGhlIFBhcnNlLlVzZXIgY2xhc3MuJyxcbiAgICAgICAgc29sdXRpb246IFwiQ2hhbmdlIFBhcnNlIFNlcnZlciBjb25maWd1cmF0aW9uIHRvICdlbmZvcmNlUHJpdmF0ZVVzZXJzOiB0cnVlJy5cIixcbiAgICAgICAgY2hlY2s6ICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpZy5lbmZvcmNlUHJpdmF0ZVVzZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgbmV3IENoZWNrKHtcbiAgICAgICAgdGl0bGU6ICdJbnNlY3VyZSBhdXRoIGFkYXB0ZXJzIGRpc2FibGVkJyxcbiAgICAgICAgd2FybmluZzpcbiAgICAgICAgICBcIkF0dGFja2VycyBtYXkgZXhwbG9yZSBpbnNlY3VyZSBhdXRoIGFkYXB0ZXJzJyB2dWxuZXJhYmlsaXRpZXMgYW5kIGxvZyBpbiBvbiBiZWhhbGYgb2YgYW5vdGhlciB1c2VyLlwiLFxuICAgICAgICBzb2x1dGlvbjogXCJDaGFuZ2UgUGFyc2UgU2VydmVyIGNvbmZpZ3VyYXRpb24gdG8gJ2VuYWJsZUluc2VjdXJlQXV0aEFkYXB0ZXJzOiBmYWxzZScuXCIsXG4gICAgICAgIGNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVJbnNlY3VyZUF1dGhBZGFwdGVycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBuZXcgQ2hlY2soe1xuICAgICAgICB0aXRsZTogJ0dyYXBoUUwgcHVibGljIGludHJvc3BlY3Rpb24gZGlzYWJsZWQnLFxuICAgICAgICB3YXJuaW5nOiAnR3JhcGhRTCBwdWJsaWMgaW50cm9zcGVjdGlvbiBpcyBlbmFibGVkLCB3aGljaCBhbGxvd3MgYW55b25lIHRvIGFjY2VzcyB0aGUgR3JhcGhRTCBzY2hlbWEuJyxcbiAgICAgICAgc29sdXRpb246IFwiQ2hhbmdlIFBhcnNlIFNlcnZlciBjb25maWd1cmF0aW9uIHRvICdncmFwaFFMUHVibGljSW50cm9zcGVjdGlvbjogZmFsc2UnLiBZb3Ugd2lsbCBuZWVkIHRvIHVzZSBtYXN0ZXIga2V5IG9yIG1haW50ZW5hbmNlIGtleSB0byBhY2Nlc3MgdGhlIEdyYXBoUUwgc2NoZW1hLlwiLFxuICAgICAgICBjaGVjazogKCkgPT4ge1xuICAgICAgICAgIGlmIChjb25maWcuZ3JhcGhRTFB1YmxpY0ludHJvc3BlY3Rpb24gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgbmV3IENoZWNrKHtcbiAgICAgICAgdGl0bGU6ICdQdWJsaWMgZGF0YWJhc2UgZXhwbGFpbiBkaXNhYmxlZCcsXG4gICAgICAgIHdhcm5pbmc6XG4gICAgICAgICAgJ0RhdGFiYXNlIGV4cGxhaW4gcXVlcmllcyBhcmUgcHVibGljbHkgYWNjZXNzaWJsZSwgd2hpY2ggbWF5IGV4cG9zZSBzZW5zaXRpdmUgZGF0YWJhc2UgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gYW5kIHNjaGVtYSBkZXRhaWxzLicsXG4gICAgICAgIHNvbHV0aW9uOlxuICAgICAgICAgIFwiQ2hhbmdlIFBhcnNlIFNlcnZlciBjb25maWd1cmF0aW9uIHRvICdkYXRhYmFzZU9wdGlvbnMuYWxsb3dQdWJsaWNFeHBsYWluOiBmYWxzZScuIFlvdSB3aWxsIG5lZWQgdG8gdXNlIG1hc3RlciBrZXkgdG8gcnVuIGV4cGxhaW4gcXVlcmllcy5cIixcbiAgICAgICAgY2hlY2s6ICgpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuZGF0YWJhc2VPcHRpb25zPy5hbGxvd1B1YmxpY0V4cGxhaW4gPT09IHRydWUgfHxcbiAgICAgICAgICAgIGNvbmZpZy5kYXRhYmFzZU9wdGlvbnM/LmFsbG93UHVibGljRXhwbGFpbiA9PSBudWxsXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDaGVja0dyb3VwU2VydmVyQ29uZmlnO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUErQixTQUFBRSx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUcsc0JB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
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "CheckGroupDatabase", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _CheckGroupDatabase.default;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "CheckGroupServerConfig", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _CheckGroupServerConfig.default;
16
+ }
17
+ });
18
+ var _CheckGroupDatabase = _interopRequireDefault(require("./CheckGroupDatabase"));
19
+ var _CheckGroupServerConfig = _interopRequireDefault(require("./CheckGroupServerConfig"));
20
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
21
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQ2hlY2tHcm91cERhdGFiYXNlIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfQ2hlY2tHcm91cFNlcnZlckNvbmZpZyIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9TZWN1cml0eS9DaGVja0dyb3Vwcy9DaGVja0dyb3Vwcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtZW1iZXJvZiBtb2R1bGU6U2VjdXJpdHlDaGVja1xuICovXG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygc2VjdXJpdHkgY2hlY2sgZ3JvdXBzLlxuICovXG5leHBvcnQgeyBkZWZhdWx0IGFzIENoZWNrR3JvdXBEYXRhYmFzZSB9IGZyb20gJy4vQ2hlY2tHcm91cERhdGFiYXNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2hlY2tHcm91cFNlcnZlckNvbmZpZyB9IGZyb20gJy4vQ2hlY2tHcm91cFNlcnZlckNvbmZpZyc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT0EsSUFBQUEsbUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLHVCQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFBNkUsU0FBQUQsdUJBQUFHLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+
3
+ var _Utils = _interopRequireDefault(require("../Utils"));
4
+ var _Check = require("./Check");
5
+ var CheckGroups = _interopRequireWildcard(require("./CheckGroups/CheckGroups"));
6
+ var _logger = _interopRequireDefault(require("../logger"));
7
+ var _lodash = require("lodash");
8
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ /**
11
+ * The security check runner.
12
+ * @memberof module:SecurityCheck
13
+ */
14
+ class CheckRunner {
15
+ /**
16
+ * The security check runner.
17
+ * @param {Object} [config] The configuration options.
18
+ * @param {Boolean} [config.enableCheck=false] Is true if Parse Server should report weak security settings.
19
+ * @param {Boolean} [config.enableCheckLog=false] Is true if the security check report should be written to logs.
20
+ * @param {Object} [config.checkGroups] The check groups to run. Default are the groups defined in `./CheckGroups/CheckGroups.js`.
21
+ */
22
+ constructor(config = {}) {
23
+ this._validateParams(config);
24
+ const {
25
+ enableCheck = false,
26
+ enableCheckLog = false,
27
+ checkGroups = CheckGroups
28
+ } = config;
29
+ this.enableCheck = enableCheck;
30
+ this.enableCheckLog = enableCheckLog;
31
+ this.checkGroups = checkGroups;
32
+ }
33
+
34
+ /**
35
+ * Runs all security checks and returns the results.
36
+ * @params
37
+ * @returns {Object} The security check report.
38
+ */
39
+ async run({
40
+ version = '1.0.0'
41
+ } = {}) {
42
+ // Instantiate check groups
43
+ const groups = Object.values(this.checkGroups).filter(c => typeof c === 'function').map(CheckGroup => new CheckGroup());
44
+
45
+ // Run checks
46
+ groups.forEach(group => group.run());
47
+
48
+ // Generate JSON report
49
+ const report = this._generateReport({
50
+ groups,
51
+ version
52
+ });
53
+
54
+ // If report should be written to logs
55
+ if (this.enableCheckLog) {
56
+ this._logReport(report);
57
+ }
58
+ return report;
59
+ }
60
+
61
+ /**
62
+ * Generates a security check report in JSON format with schema:
63
+ * ```
64
+ * {
65
+ * report: {
66
+ * version: "1.0.0", // The report version, defines the schema
67
+ * state: "fail" // The disjunctive indicator of failed checks in all groups.
68
+ * groups: [ // The check groups
69
+ * {
70
+ * name: "House", // The group name
71
+ * state: "fail" // The disjunctive indicator of failed checks in this group.
72
+ * checks: [ // The checks
73
+ * title: "Door locked", // The check title
74
+ * state: "fail" // The check state
75
+ * warning: "Anyone can enter your house." // The warning.
76
+ * solution: "Lock your door." // The solution.
77
+ * ]
78
+ * },
79
+ * ...
80
+ * ]
81
+ * }
82
+ * }
83
+ * ```
84
+ * @param {Object} params The parameters.
85
+ * @param {Array<CheckGroup>} params.groups The check groups.
86
+ * @param {String} params.version: The report schema version.
87
+ * @returns {Object} The report.
88
+ */
89
+ _generateReport({
90
+ groups,
91
+ version
92
+ }) {
93
+ // Create report template
94
+ const report = {
95
+ report: {
96
+ version,
97
+ state: _Check.CheckState.success,
98
+ groups: []
99
+ }
100
+ };
101
+
102
+ // Identify report version
103
+ switch (version) {
104
+ case '1.0.0':
105
+ default:
106
+ // For each check group
107
+ for (const group of groups) {
108
+ // Create group report
109
+ const groupReport = {
110
+ name: group.name(),
111
+ state: _Check.CheckState.success,
112
+ checks: []
113
+ };
114
+
115
+ // Create check reports
116
+ groupReport.checks = group.checks().map(check => {
117
+ const checkReport = {
118
+ title: check.title,
119
+ state: check.checkState()
120
+ };
121
+ if (check.checkState() == _Check.CheckState.fail) {
122
+ checkReport.warning = check.warning;
123
+ checkReport.solution = check.solution;
124
+ report.report.state = _Check.CheckState.fail;
125
+ groupReport.state = _Check.CheckState.fail;
126
+ }
127
+ return checkReport;
128
+ });
129
+ report.report.groups.push(groupReport);
130
+ }
131
+ }
132
+ return report;
133
+ }
134
+
135
+ /**
136
+ * Logs the security check report.
137
+ * @param {Object} report The report to log.
138
+ */
139
+ _logReport(report) {
140
+ // Determine log level depending on whether any check failed
141
+ const log = report.report.state == _Check.CheckState.success ? s => _logger.default.info(s) : s => _logger.default.warn(s);
142
+
143
+ // Declare output
144
+ const indent = ' ';
145
+ let output = '';
146
+ let checksCount = 0;
147
+ let failedChecksCount = 0;
148
+ let skippedCheckCount = 0;
149
+
150
+ // Traverse all groups and checks for compose output
151
+ for (const group of report.report.groups) {
152
+ output += `\n- ${group.name}`;
153
+ for (const check of group.checks) {
154
+ checksCount++;
155
+ output += `\n${indent}${this._getLogIconForState(check.state)} ${check.title}`;
156
+ if (check.state == _Check.CheckState.fail) {
157
+ failedChecksCount++;
158
+ output += `\n${indent}${indent}Warning: ${check.warning}`;
159
+ output += ` ${check.solution}`;
160
+ } else if (check.state == _Check.CheckState.none) {
161
+ skippedCheckCount++;
162
+ output += `\n${indent}${indent}Test did not execute, this is likely an internal server issue, please report.`;
163
+ }
164
+ }
165
+ }
166
+ output = `\n###################################` + `\n# #` + `\n# Parse Server Security Check #` + `\n# #` + `\n###################################` + `\n` + `\n${failedChecksCount > 0 ? 'Warning: ' : ''}${failedChecksCount} weak security setting(s) found${failedChecksCount > 0 ? '!' : ''}` + `\n${checksCount} check(s) executed` + `\n${skippedCheckCount} check(s) skipped` + `\n` + `${output}`;
167
+
168
+ // Write log
169
+ log(output);
170
+ }
171
+
172
+ /**
173
+ * Returns an icon for use in the report log output.
174
+ * @param {CheckState} state The check state.
175
+ * @returns {String} The icon.
176
+ */
177
+ _getLogIconForState(state) {
178
+ switch (state) {
179
+ case _Check.CheckState.success:
180
+ return '✅';
181
+ case _Check.CheckState.fail:
182
+ return '❌';
183
+ default:
184
+ return 'ℹ️';
185
+ }
186
+ }
187
+
188
+ /**
189
+ * Validates the constructor parameters.
190
+ * @param {Object} params The parameters to validate.
191
+ */
192
+ _validateParams(params) {
193
+ _Utils.default.validateParams(params, {
194
+ enableCheck: {
195
+ t: 'boolean',
196
+ v: _lodash.isBoolean,
197
+ o: true
198
+ },
199
+ enableCheckLog: {
200
+ t: 'boolean',
201
+ v: _lodash.isBoolean,
202
+ o: true
203
+ },
204
+ checkGroups: {
205
+ t: 'array',
206
+ v: _lodash.isArray,
207
+ o: true
208
+ }
209
+ });
210
+ }
211
+ }
212
+ module.exports = CheckRunner;
213
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfVXRpbHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9DaGVjayIsIkNoZWNrR3JvdXBzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbG9nZ2VyIiwiX2xvZGFzaCIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIkNoZWNrUnVubmVyIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJfdmFsaWRhdGVQYXJhbXMiLCJlbmFibGVDaGVjayIsImVuYWJsZUNoZWNrTG9nIiwiY2hlY2tHcm91cHMiLCJydW4iLCJ2ZXJzaW9uIiwiZ3JvdXBzIiwidmFsdWVzIiwiZmlsdGVyIiwiYyIsIm1hcCIsIkNoZWNrR3JvdXAiLCJmb3JFYWNoIiwiZ3JvdXAiLCJyZXBvcnQiLCJfZ2VuZXJhdGVSZXBvcnQiLCJfbG9nUmVwb3J0Iiwic3RhdGUiLCJDaGVja1N0YXRlIiwic3VjY2VzcyIsImdyb3VwUmVwb3J0IiwibmFtZSIsImNoZWNrcyIsImNoZWNrIiwiY2hlY2tSZXBvcnQiLCJ0aXRsZSIsImNoZWNrU3RhdGUiLCJmYWlsIiwid2FybmluZyIsInNvbHV0aW9uIiwicHVzaCIsImxvZyIsInMiLCJsb2dnZXIiLCJpbmZvIiwid2FybiIsImluZGVudCIsIm91dHB1dCIsImNoZWNrc0NvdW50IiwiZmFpbGVkQ2hlY2tzQ291bnQiLCJza2lwcGVkQ2hlY2tDb3VudCIsIl9nZXRMb2dJY29uRm9yU3RhdGUiLCJub25lIiwicGFyYW1zIiwiVXRpbHMiLCJ2YWxpZGF0ZVBhcmFtcyIsInYiLCJpc0Jvb2xlYW4iLCJpc0FycmF5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZWN1cml0eS9DaGVja1J1bm5lci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVXRpbHMgZnJvbSAnLi4vVXRpbHMnO1xuaW1wb3J0IHsgQ2hlY2tTdGF0ZSB9IGZyb20gJy4vQ2hlY2snO1xuaW1wb3J0ICogYXMgQ2hlY2tHcm91cHMgZnJvbSAnLi9DaGVja0dyb3Vwcy9DaGVja0dyb3Vwcyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBpc0FycmF5LCBpc0Jvb2xlYW4gfSBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIFRoZSBzZWN1cml0eSBjaGVjayBydW5uZXIuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOlNlY3VyaXR5Q2hlY2tcbiAqL1xuY2xhc3MgQ2hlY2tSdW5uZXIge1xuICAvKipcbiAgICogVGhlIHNlY3VyaXR5IGNoZWNrIHJ1bm5lci5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbmZpZy5lbmFibGVDaGVjaz1mYWxzZV0gSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIHJlcG9ydCB3ZWFrIHNlY3VyaXR5IHNldHRpbmdzLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb25maWcuZW5hYmxlQ2hlY2tMb2c9ZmFsc2VdIElzIHRydWUgaWYgdGhlIHNlY3VyaXR5IGNoZWNrIHJlcG9ydCBzaG91bGQgYmUgd3JpdHRlbiB0byBsb2dzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZy5jaGVja0dyb3Vwc10gVGhlIGNoZWNrIGdyb3VwcyB0byBydW4uIERlZmF1bHQgYXJlIHRoZSBncm91cHMgZGVmaW5lZCBpbiBgLi9DaGVja0dyb3Vwcy9DaGVja0dyb3Vwcy5qc2AuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcgPSB7fSkge1xuICAgIHRoaXMuX3ZhbGlkYXRlUGFyYW1zKGNvbmZpZyk7XG4gICAgY29uc3QgeyBlbmFibGVDaGVjayA9IGZhbHNlLCBlbmFibGVDaGVja0xvZyA9IGZhbHNlLCBjaGVja0dyb3VwcyA9IENoZWNrR3JvdXBzIH0gPSBjb25maWc7XG4gICAgdGhpcy5lbmFibGVDaGVjayA9IGVuYWJsZUNoZWNrO1xuICAgIHRoaXMuZW5hYmxlQ2hlY2tMb2cgPSBlbmFibGVDaGVja0xvZztcbiAgICB0aGlzLmNoZWNrR3JvdXBzID0gY2hlY2tHcm91cHM7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhbGwgc2VjdXJpdHkgY2hlY2tzIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLlxuICAgKiBAcGFyYW1zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzZWN1cml0eSBjaGVjayByZXBvcnQuXG4gICAqL1xuICBhc3luYyBydW4oeyB2ZXJzaW9uID0gJzEuMC4wJyB9ID0ge30pIHtcbiAgICAvLyBJbnN0YW50aWF0ZSBjaGVjayBncm91cHNcbiAgICBjb25zdCBncm91cHMgPSBPYmplY3QudmFsdWVzKHRoaXMuY2hlY2tHcm91cHMpXG4gICAgICAuZmlsdGVyKGMgPT4gdHlwZW9mIGMgPT09ICdmdW5jdGlvbicpXG4gICAgICAubWFwKENoZWNrR3JvdXAgPT4gbmV3IENoZWNrR3JvdXAoKSk7XG5cbiAgICAvLyBSdW4gY2hlY2tzXG4gICAgZ3JvdXBzLmZvckVhY2goZ3JvdXAgPT4gZ3JvdXAucnVuKCkpO1xuXG4gICAgLy8gR2VuZXJhdGUgSlNPTiByZXBvcnRcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9nZW5lcmF0ZVJlcG9ydCh7IGdyb3VwcywgdmVyc2lvbiB9KTtcblxuICAgIC8vIElmIHJlcG9ydCBzaG91bGQgYmUgd3JpdHRlbiB0byBsb2dzXG4gICAgaWYgKHRoaXMuZW5hYmxlQ2hlY2tMb2cpIHtcbiAgICAgIHRoaXMuX2xvZ1JlcG9ydChyZXBvcnQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHNlY3VyaXR5IGNoZWNrIHJlcG9ydCBpbiBKU09OIGZvcm1hdCB3aXRoIHNjaGVtYTpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICAgcmVwb3J0OiB7XG4gICAqICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLCAvLyBUaGUgcmVwb3J0IHZlcnNpb24sIGRlZmluZXMgdGhlIHNjaGVtYVxuICAgKiAgICAgIHN0YXRlOiBcImZhaWxcIiAgICAgLy8gVGhlIGRpc2p1bmN0aXZlIGluZGljYXRvciBvZiBmYWlsZWQgY2hlY2tzIGluIGFsbCBncm91cHMuXG4gICAqICAgICAgZ3JvdXBzOiBbICAgICAgICAgLy8gVGhlIGNoZWNrIGdyb3Vwc1xuICAgKiAgICAgICAge1xuICAgKiAgICAgICAgICBuYW1lOiBcIkhvdXNlXCIsICAgICAgICAgICAgLy8gVGhlIGdyb3VwIG5hbWVcbiAgICogICAgICAgICAgc3RhdGU6IFwiZmFpbFwiICAgICAgICAgICAgIC8vIFRoZSBkaXNqdW5jdGl2ZSBpbmRpY2F0b3Igb2YgZmFpbGVkIGNoZWNrcyBpbiB0aGlzIGdyb3VwLlxuICAgKiAgICAgICAgICBjaGVja3M6IFsgICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVja3NcbiAgICogICAgICAgICAgICB0aXRsZTogXCJEb29yIGxvY2tlZFwiLCAgIC8vIFRoZSBjaGVjayB0aXRsZVxuICAgKiAgICAgICAgICAgIHN0YXRlOiBcImZhaWxcIiAgICAgICAgICAgLy8gVGhlIGNoZWNrIHN0YXRlXG4gICAqICAgICAgICAgICAgd2FybmluZzogXCJBbnlvbmUgY2FuIGVudGVyIHlvdXIgaG91c2UuXCIgICAvLyBUaGUgd2FybmluZy5cbiAgICogICAgICAgICAgICBzb2x1dGlvbjogXCJMb2NrIHlvdXIgZG9vci5cIiAgICAgICAgICAgICAgIC8vIFRoZSBzb2x1dGlvbi5cbiAgICogICAgICAgICAgXVxuICAgKiAgICAgICAgfSxcbiAgICogICAgICAgIC4uLlxuICAgKiAgICAgIF1cbiAgICogICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge0FycmF5PENoZWNrR3JvdXA+fSBwYXJhbXMuZ3JvdXBzIFRoZSBjaGVjayBncm91cHMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudmVyc2lvbjogVGhlIHJlcG9ydCBzY2hlbWEgdmVyc2lvbi5cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlcG9ydC5cbiAgICovXG4gIF9nZW5lcmF0ZVJlcG9ydCh7IGdyb3VwcywgdmVyc2lvbiB9KSB7XG4gICAgLy8gQ3JlYXRlIHJlcG9ydCB0ZW1wbGF0ZVxuICAgIGNvbnN0IHJlcG9ydCA9IHtcbiAgICAgIHJlcG9ydDoge1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBzdGF0ZTogQ2hlY2tTdGF0ZS5zdWNjZXNzLFxuICAgICAgICBncm91cHM6IFtdLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gSWRlbnRpZnkgcmVwb3J0IHZlcnNpb25cbiAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgIGNhc2UgJzEuMC4wJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZvciBlYWNoIGNoZWNrIGdyb3VwXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGdyb3VwIHJlcG9ydFxuICAgICAgICAgIGNvbnN0IGdyb3VwUmVwb3J0ID0ge1xuICAgICAgICAgICAgbmFtZTogZ3JvdXAubmFtZSgpLFxuICAgICAgICAgICAgc3RhdGU6IENoZWNrU3RhdGUuc3VjY2VzcyxcbiAgICAgICAgICAgIGNoZWNrczogW10sXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBjaGVjayByZXBvcnRzXG4gICAgICAgICAgZ3JvdXBSZXBvcnQuY2hlY2tzID0gZ3JvdXAuY2hlY2tzKCkubWFwKGNoZWNrID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrUmVwb3J0ID0ge1xuICAgICAgICAgICAgICB0aXRsZTogY2hlY2sudGl0bGUsXG4gICAgICAgICAgICAgIHN0YXRlOiBjaGVjay5jaGVja1N0YXRlKCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGNoZWNrLmNoZWNrU3RhdGUoKSA9PSBDaGVja1N0YXRlLmZhaWwpIHtcbiAgICAgICAgICAgICAgY2hlY2tSZXBvcnQud2FybmluZyA9IGNoZWNrLndhcm5pbmc7XG4gICAgICAgICAgICAgIGNoZWNrUmVwb3J0LnNvbHV0aW9uID0gY2hlY2suc29sdXRpb247XG4gICAgICAgICAgICAgIHJlcG9ydC5yZXBvcnQuc3RhdGUgPSBDaGVja1N0YXRlLmZhaWw7XG4gICAgICAgICAgICAgIGdyb3VwUmVwb3J0LnN0YXRlID0gQ2hlY2tTdGF0ZS5mYWlsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrUmVwb3J0O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVwb3J0LnJlcG9ydC5ncm91cHMucHVzaChncm91cFJlcG9ydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBzZWN1cml0eSBjaGVjayByZXBvcnQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXBvcnQgVGhlIHJlcG9ydCB0byBsb2cuXG4gICAqL1xuICBfbG9nUmVwb3J0KHJlcG9ydCkge1xuICAgIC8vIERldGVybWluZSBsb2cgbGV2ZWwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYW55IGNoZWNrIGZhaWxlZFxuICAgIGNvbnN0IGxvZyA9XG4gICAgICByZXBvcnQucmVwb3J0LnN0YXRlID09IENoZWNrU3RhdGUuc3VjY2VzcyA/IHMgPT4gbG9nZ2VyLmluZm8ocykgOiBzID0+IGxvZ2dlci53YXJuKHMpO1xuXG4gICAgLy8gRGVjbGFyZSBvdXRwdXRcbiAgICBjb25zdCBpbmRlbnQgPSAnICAgJztcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgbGV0IGNoZWNrc0NvdW50ID0gMDtcbiAgICBsZXQgZmFpbGVkQ2hlY2tzQ291bnQgPSAwO1xuICAgIGxldCBza2lwcGVkQ2hlY2tDb3VudCA9IDA7XG5cbiAgICAvLyBUcmF2ZXJzZSBhbGwgZ3JvdXBzIGFuZCBjaGVja3MgZm9yIGNvbXBvc2Ugb3V0cHV0XG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQucmVwb3J0Lmdyb3Vwcykge1xuICAgICAgb3V0cHV0ICs9IGBcXG4tICR7Z3JvdXAubmFtZX1gO1xuXG4gICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIGdyb3VwLmNoZWNrcykge1xuICAgICAgICBjaGVja3NDb3VudCsrO1xuICAgICAgICBvdXRwdXQgKz0gYFxcbiR7aW5kZW50fSR7dGhpcy5fZ2V0TG9nSWNvbkZvclN0YXRlKGNoZWNrLnN0YXRlKX0gJHtjaGVjay50aXRsZX1gO1xuXG4gICAgICAgIGlmIChjaGVjay5zdGF0ZSA9PSBDaGVja1N0YXRlLmZhaWwpIHtcbiAgICAgICAgICBmYWlsZWRDaGVja3NDb3VudCsrO1xuICAgICAgICAgIG91dHB1dCArPSBgXFxuJHtpbmRlbnR9JHtpbmRlbnR9V2FybmluZzogJHtjaGVjay53YXJuaW5nfWA7XG4gICAgICAgICAgb3V0cHV0ICs9IGAgJHtjaGVjay5zb2x1dGlvbn1gO1xuICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLnN0YXRlID09IENoZWNrU3RhdGUubm9uZSkge1xuICAgICAgICAgIHNraXBwZWRDaGVja0NvdW50Kys7XG4gICAgICAgICAgb3V0cHV0ICs9IGBcXG4ke2luZGVudH0ke2luZGVudH1UZXN0IGRpZCBub3QgZXhlY3V0ZSwgdGhpcyBpcyBsaWtlbHkgYW4gaW50ZXJuYWwgc2VydmVyIGlzc3VlLCBwbGVhc2UgcmVwb3J0LmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXQgPVxuICAgICAgYFxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjYCArXG4gICAgICBgXFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNgICtcbiAgICAgIGBcXG4jICAgUGFyc2UgU2VydmVyIFNlY3VyaXR5IENoZWNrICAgI2AgK1xuICAgICAgYFxcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYCArXG4gICAgICBgXFxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNgICtcbiAgICAgIGBcXG5gICtcbiAgICAgIGBcXG4ke1xuICAgICAgICBmYWlsZWRDaGVja3NDb3VudCA+IDAgPyAnV2FybmluZzogJyA6ICcnXG4gICAgICB9JHtmYWlsZWRDaGVja3NDb3VudH0gd2VhayBzZWN1cml0eSBzZXR0aW5nKHMpIGZvdW5kJHtmYWlsZWRDaGVja3NDb3VudCA+IDAgPyAnIScgOiAnJ31gICtcbiAgICAgIGBcXG4ke2NoZWNrc0NvdW50fSBjaGVjayhzKSBleGVjdXRlZGAgK1xuICAgICAgYFxcbiR7c2tpcHBlZENoZWNrQ291bnR9IGNoZWNrKHMpIHNraXBwZWRgICtcbiAgICAgIGBcXG5gICtcbiAgICAgIGAke291dHB1dH1gO1xuXG4gICAgLy8gV3JpdGUgbG9nXG4gICAgbG9nKG91dHB1dCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBpY29uIGZvciB1c2UgaW4gdGhlIHJlcG9ydCBsb2cgb3V0cHV0LlxuICAgKiBAcGFyYW0ge0NoZWNrU3RhdGV9IHN0YXRlIFRoZSBjaGVjayBzdGF0ZS5cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIGljb24uXG4gICAqL1xuICBfZ2V0TG9nSWNvbkZvclN0YXRlKHN0YXRlKSB7XG4gICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgY2FzZSBDaGVja1N0YXRlLnN1Y2Nlc3M6XG4gICAgICAgIHJldHVybiAn4pyFJztcbiAgICAgIGNhc2UgQ2hlY2tTdGF0ZS5mYWlsOlxuICAgICAgICByZXR1cm4gJ+KdjCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ+KEue+4jyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1ldGVycyB0byB2YWxpZGF0ZS5cbiAgICovXG4gIF92YWxpZGF0ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICBVdGlscy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgIGVuYWJsZUNoZWNrOiB7IHQ6ICdib29sZWFuJywgdjogaXNCb29sZWFuLCBvOiB0cnVlIH0sXG4gICAgICBlbmFibGVDaGVja0xvZzogeyB0OiAnYm9vbGVhbicsIHY6IGlzQm9vbGVhbiwgbzogdHJ1ZSB9LFxuICAgICAgY2hlY2tHcm91cHM6IHsgdDogJ2FycmF5JywgdjogaXNBcnJheSwgbzogdHJ1ZSB9LFxuICAgIH0pO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2hlY2tSdW5uZXI7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBQTRDLFNBQUFHLHdCQUFBRyxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBTCx1QkFBQSxZQUFBQSxDQUFBRyxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxD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
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ const classesWithMasterOnlyAccess = ['_JobStatus', '_PushStatus', '_Hooks', '_GlobalConfig', '_JobSchedule', '_Idempotency'];
4
+ const {
5
+ createSanitizedError
6
+ } = require('./Error');
7
+
8
+ // Disallowing access to the _Role collection except by master key
9
+ function enforceRoleSecurity(method, className, auth, config) {
10
+ if (className === '_Installation' && !auth.isMaster && !auth.isMaintenance) {
11
+ if (method === 'delete' || method === 'find') {
12
+ throw createSanitizedError(Parse.Error.OPERATION_FORBIDDEN, `Clients aren't allowed to perform the ${method} operation on the installation collection.`, config);
13
+ }
14
+ }
15
+
16
+ //all volatileClasses are masterKey only
17
+ if (classesWithMasterOnlyAccess.indexOf(className) >= 0 && !auth.isMaster && !auth.isMaintenance) {
18
+ throw createSanitizedError(Parse.Error.OPERATION_FORBIDDEN, `Clients aren't allowed to perform the ${method} operation on the ${className} collection.`, config);
19
+ }
20
+
21
+ // readOnly masterKey is not allowed
22
+ if (auth.isReadOnly && (method === 'delete' || method === 'create' || method === 'update')) {
23
+ throw createSanitizedError(Parse.Error.OPERATION_FORBIDDEN, `read-only masterKey isn't allowed to perform the ${method} operation.`, config);
24
+ }
25
+ }
26
+ module.exports = {
27
+ enforceRoleSecurity
28
+ };
29
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjbGFzc2VzV2l0aE1hc3Rlck9ubHlBY2Nlc3MiLCJjcmVhdGVTYW5pdGl6ZWRFcnJvciIsInJlcXVpcmUiLCJlbmZvcmNlUm9sZVNlY3VyaXR5IiwibWV0aG9kIiwiY2xhc3NOYW1lIiwiYXV0aCIsImNvbmZpZyIsImlzTWFzdGVyIiwiaXNNYWludGVuYW5jZSIsIlBhcnNlIiwiRXJyb3IiLCJPUEVSQVRJT05fRk9SQklEREVOIiwiaW5kZXhPZiIsImlzUmVhZE9ubHkiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL1NoYXJlZFJlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY2xhc3Nlc1dpdGhNYXN0ZXJPbmx5QWNjZXNzID0gW1xuICAnX0pvYlN0YXR1cycsXG4gICdfUHVzaFN0YXR1cycsXG4gICdfSG9va3MnLFxuICAnX0dsb2JhbENvbmZpZycsXG4gICdfSm9iU2NoZWR1bGUnLFxuICAnX0lkZW1wb3RlbmN5Jyxcbl07XG5jb25zdCB7IGNyZWF0ZVNhbml0aXplZEVycm9yIH0gPSByZXF1aXJlKCcuL0Vycm9yJyk7XG5cbi8vIERpc2FsbG93aW5nIGFjY2VzcyB0byB0aGUgX1JvbGUgY29sbGVjdGlvbiBleGNlcHQgYnkgbWFzdGVyIGtleVxuZnVuY3Rpb24gZW5mb3JjZVJvbGVTZWN1cml0eShtZXRob2QsIGNsYXNzTmFtZSwgYXV0aCwgY29uZmlnKSB7XG4gIGlmIChjbGFzc05hbWUgPT09ICdfSW5zdGFsbGF0aW9uJyAmJiAhYXV0aC5pc01hc3RlciAmJiAhYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgaWYgKG1ldGhvZCA9PT0gJ2RlbGV0ZScgfHwgbWV0aG9kID09PSAnZmluZCcpIHtcbiAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICBgQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSAke21ldGhvZH0gb3BlcmF0aW9uIG9uIHRoZSBpbnN0YWxsYXRpb24gY29sbGVjdGlvbi5gLFxuICAgICAgICBjb25maWdcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy9hbGwgdm9sYXRpbGVDbGFzc2VzIGFyZSBtYXN0ZXJLZXkgb25seVxuICBpZiAoXG4gICAgY2xhc3Nlc1dpdGhNYXN0ZXJPbmx5QWNjZXNzLmluZGV4T2YoY2xhc3NOYW1lKSA+PSAwICYmXG4gICAgIWF1dGguaXNNYXN0ZXIgJiZcbiAgICAhYXV0aC5pc01haW50ZW5hbmNlXG4gICkge1xuICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgIGBDbGllbnRzIGFyZW4ndCBhbGxvd2VkIHRvIHBlcmZvcm0gdGhlICR7bWV0aG9kfSBvcGVyYXRpb24gb24gdGhlICR7Y2xhc3NOYW1lfSBjb2xsZWN0aW9uLmAsXG4gICAgICBjb25maWdcbiAgICApO1xuICB9XG5cbiAgLy8gcmVhZE9ubHkgbWFzdGVyS2V5IGlzIG5vdCBhbGxvd2VkXG4gIGlmIChhdXRoLmlzUmVhZE9ubHkgJiYgKG1ldGhvZCA9PT0gJ2RlbGV0ZScgfHwgbWV0aG9kID09PSAnY3JlYXRlJyB8fCBtZXRob2QgPT09ICd1cGRhdGUnKSkge1xuICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgIGByZWFkLW9ubHkgbWFzdGVyS2V5IGlzbid0IGFsbG93ZWQgdG8gcGVyZm9ybSB0aGUgJHttZXRob2R9IG9wZXJhdGlvbi5gLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZW5mb3JjZVJvbGVTZWN1cml0eSxcbn07XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTUEsMkJBQTJCLEdBQUcsQ0FDbEMsWUFBWSxFQUNaLGFBQWEsRUFDYixRQUFRLEVBQ1IsZUFBZSxFQUNmLGNBQWMsRUFDZCxjQUFjLENBQ2Y7QUFDRCxNQUFNO0VBQUVDO0FBQXFCLENBQUMsR0FBR0MsT0FBTyxDQUFDLFNBQVMsQ0FBQzs7QUFFbkQ7QUFDQSxTQUFTQyxtQkFBbUJBLENBQUNDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxJQUFJLEVBQUVDLE1BQU0sRUFBRTtFQUM1RCxJQUFJRixTQUFTLEtBQUssZUFBZSxJQUFJLENBQUNDLElBQUksQ0FBQ0UsUUFBUSxJQUFJLENBQUNGLElBQUksQ0FBQ0csYUFBYSxFQUFFO0lBQzFFLElBQUlMLE1BQU0sS0FBSyxRQUFRLElBQUlBLE1BQU0sS0FBSyxNQUFNLEVBQUU7TUFDNUMsTUFBTUgsb0JBQW9CLENBQ3hCUyxLQUFLLENBQUNDLEtBQUssQ0FBQ0MsbUJBQW1CLEVBQy9CLHlDQUF5Q1IsTUFBTSw0Q0FBNEMsRUFDM0ZHLE1BQ0YsQ0FBQztJQUNIO0VBQ0Y7O0VBRUE7RUFDQSxJQUNFUCwyQkFBMkIsQ0FBQ2EsT0FBTyxDQUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLElBQ25ELENBQUNDLElBQUksQ0FBQ0UsUUFBUSxJQUNkLENBQUNGLElBQUksQ0FBQ0csYUFBYSxFQUNuQjtJQUNBLE1BQU1SLG9CQUFvQixDQUN4QlMsS0FBSyxDQUFDQyxLQUFLLENBQUNDLG1CQUFtQixFQUMvQix5Q0FBeUNSLE1BQU0scUJBQXFCQyxTQUFTLGNBQWMsRUFDM0ZFLE1BQ0YsQ0FBQztFQUNIOztFQUVBO0VBQ0EsSUFBSUQsSUFBSSxDQUFDUSxVQUFVLEtBQUtWLE1BQU0sS0FBSyxRQUFRLElBQUlBLE1BQU0sS0FBSyxRQUFRLElBQUlBLE1BQU0sS0FBSyxRQUFRLENBQUMsRUFBRTtJQUMxRixNQUFNSCxvQkFBb0IsQ0FDeEJTLEtBQUssQ0FBQ0MsS0FBSyxDQUFDQyxtQkFBbUIsRUFDL0Isb0RBQW9EUixNQUFNLGFBQWEsRUFDdkVHLE1BQ0YsQ0FBQztFQUNIO0FBQ0Y7QUFFQVEsTUFBTSxDQUFDQyxPQUFPLEdBQUc7RUFDZmI7QUFDRixDQUFDIiwiaWdub3JlTGlzdCI6W119