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
@@ -1,180 +1,115 @@
1
- 'use strict';
2
-
3
- var _https = require('https');
4
-
5
- var _https2 = _interopRequireDefault(_https);
6
-
7
- var _url = require('url');
8
-
9
- var _url2 = _interopRequireDefault(_url);
10
-
11
- var _querystring = require('querystring');
12
-
13
- var _querystring2 = _interopRequireDefault(_querystring);
14
-
15
- var _node = require('parse/node');
16
-
17
- var _node2 = _interopRequireDefault(_node);
18
-
19
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
-
21
- /*
22
- * This auth adapter is based on the OAuth 2.0 Token Introspection specification.
23
- * See RFC 7662 for details (https://tools.ietf.org/html/rfc7662).
24
- * It's purpose is to validate OAuth2 access tokens using the OAuth2 provider's
25
- * token introspection endpoint (if implemented by the provider).
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _AuthAdapter = _interopRequireDefault(require("./AuthAdapter"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ /**
10
+ * Parse Server authentication adapter for OAuth2 Token Introspection.
26
11
  *
27
- * The adapter accepts the following config parameters:
12
+ * @class OAuth2Adapter
13
+ * @param {Object} options - The adapter configuration options.
14
+ * @param {string} options.tokenIntrospectionEndpointUrl - The URL of the token introspection endpoint. Required.
15
+ * @param {boolean} options.oauth2 - Indicates that the request should be handled by the OAuth2 adapter. Required.
16
+ * @param {string} [options.useridField] - The field in the introspection response that contains the user ID. Optional.
17
+ * @param {string} [options.appidField] - The field in the introspection response that contains the app ID. Optional.
18
+ * @param {string[]} [options.appIds] - List of allowed app IDs. Required if `appidField` is defined.
19
+ * @param {string} [options.authorizationHeader] - The Authorization header value for the introspection request. Optional.
28
20
  *
29
- * 1. "endpoint" (string, required)
30
- * The URL of the token introspection endpoint of the OAuth2 provider that
31
- * issued the access token to the client that is to be validated.
32
- *
33
- * 2. "useridField" (string, optional)
34
- * The name of the field in the token introspection response that contains
35
- * the userid. If specified, it will be used to verify the value of the "id"
36
- * field in the "authData" JSON that is coming from the client.
37
- * This can be the "aud" (i.e. audience), the "sub" (i.e. subject) or the
38
- * "username" field in the introspection response, but since only the
39
- * "active" field is required and all other reponse fields are optional
40
- * in the RFC, it has to be optional in this adapter as well.
41
- * Default: - (undefined)
42
- *
43
- * 3. "appidField" (string, optional)
44
- * The name of the field in the token introspection response that contains
45
- * the appId of the client. If specified, it will be used to verify it's
46
- * value against the set of appIds in the adapter config. The concept of
47
- * appIds comes from the two major social login providers
48
- * (Google and Facebook). They have not yet implemented the token
49
- * introspection endpoint, but the concept can be valid for any OAuth2
50
- * provider.
51
- * Default: - (undefined)
52
- *
53
- * 4. "appIds" (array of strings, optional)
54
- * A set of appIds that are used to restrict accepted access tokens based
55
- * on a specific field's value in the token introspection response.
56
- * Default: - (undefined)
57
- *
58
- * 5. "authorizationHeader" (string, optional)
59
- * The value of the "Authorization" HTTP header in requests sent to the
60
- * introspection endpoint.
61
- * Eg. "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
62
- *
63
- * 6. "debug" (boolean, optional)
64
- * Enables extensive logging using the "verbose" level.
21
+ * @description
22
+ * ## Parse Server Configuration
23
+ * To configure Parse Server for OAuth2 Token Introspection, use the following structure:
24
+ * ```json
25
+ * {
26
+ * "auth": {
27
+ * "oauth2Provider": {
28
+ * "tokenIntrospectionEndpointUrl": "https://provider.com/introspect",
29
+ * "useridField": "sub",
30
+ * "appidField": "aud",
31
+ * "appIds": ["my-app-id"],
32
+ * "authorizationHeader": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
33
+ * "oauth2": true
34
+ * }
35
+ * }
36
+ * }
37
+ * ```
65
38
  *
66
- * The adapter expects requests with the following authData JSON:
39
+ * The adapter requires the following `authData` fields:
40
+ * - `id`: The user ID provided by the client.
41
+ * - `access_token`: The access token provided by the client.
67
42
  *
43
+ * ## Auth Payload
44
+ * ### Example Auth Payload
45
+ * ```json
68
46
  * {
69
47
  * "oauth2": {
70
- * "id": "user's OAuth2 provider-specific id as a string",
71
- * "access_token": "an authorized OAuth2 access token for the user",
48
+ * "id": "user-id",
49
+ * "access_token": "access-token"
72
50
  * }
73
51
  * }
52
+ * ```
53
+ *
54
+ * ## Notes
55
+ * - `tokenIntrospectionEndpointUrl` is mandatory and should point to a valid OAuth2 provider's introspection endpoint.
56
+ * - If `appidField` is defined, `appIds` must also be specified to validate the app ID in the introspection response.
57
+ * - `authorizationHeader` can be used to authenticate requests to the token introspection endpoint.
58
+ *
59
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc7662 OAuth 2.0 Token Introspection Specification}
74
60
  */
75
61
 
76
- class OAuth2AuthAdapter {
77
- constructor(name) {
78
- this.name = name;
79
- }
80
-
81
- // Returns a promise that fulfills if this user id is valid.
82
- validateAuthData(authData, options) {
83
- return requestJson(options, authData.access_token).then(response => {
84
- if (response && response.active && (!options || !options.hasOwnProperty('useridField') || !options.useridField || authData.id == response[options.useridField])) {
85
- return Promise.resolve();
86
- }
87
- return Promise.reject(new _node2.default.Error(_node2.default.Error.OBJECT_NOT_FOUND, 'OAuth2 access token is invalid for this user.'));
88
- });
89
- }
90
-
91
- validateAppId(appIds, authData, options) {
92
- if (options && options.hasOwnProperty('appidField') && options.appidField) {
93
- if (!appIds.length) {
94
- return Promise.reject(new _node2.default.Error(_node2.default.Error.OBJECT_NOT_FOUND, 'OAuth2 configuration is missing the client app IDs ("appIds" config parameter).'));
95
- }
96
- return requestJson(options, authData.access_token).then(response => {
97
- const appidField = options.appidField;
98
- return validateAppIdResponse(response, appidField, appIds);
99
- });
100
- } else {
101
- return Promise.resolve();
62
+ class OAuth2Adapter extends _AuthAdapter.default {
63
+ validateOptions(options) {
64
+ super.validateOptions(options);
65
+ if (!options.tokenIntrospectionEndpointUrl) {
66
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'OAuth2 token introspection endpoint URL is missing.');
102
67
  }
68
+ if (options.appidField && !options.appIds?.length) {
69
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'OAuth2 configuration is missing app IDs.');
70
+ }
71
+ this.tokenIntrospectionEndpointUrl = options.tokenIntrospectionEndpointUrl;
72
+ this.useridField = options.useridField;
73
+ this.appidField = options.appidField;
74
+ this.appIds = options.appIds;
75
+ this.authorizationHeader = options.authorizationHeader;
103
76
  }
104
- }
105
-
106
- function getRequestOptions(config, access_token) {
107
- if (!config || !config.endpoint) {
108
- throw new _node2.default.Error(_node2.default.Error.OBJECT_NOT_FOUND, 'OAuth2 token introspection endpoint URL is missing from configuration!');
77
+ async validateAppId(authData) {
78
+ if (!this.appidField) {
79
+ return;
80
+ }
81
+ const response = await this.requestTokenInfo(authData.access_token);
82
+ const appIdFieldValue = response[this.appidField];
83
+ const isValidAppId = Array.isArray(appIdFieldValue) ? appIdFieldValue.some(appId => this.appIds.includes(appId)) : this.appIds.includes(appIdFieldValue);
84
+ if (!isValidAppId) {
85
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'OAuth2: Invalid app ID.');
86
+ }
109
87
  }
110
- const { endpoint } = config;
111
- const parsedUrl = _url2.default.config(endpoint);
112
- const postData = _querystring2.default.stringify({
113
- 'token': access_token
114
- });
115
- const headers = {
116
- 'Content-Type': 'application/x-www-form-urlencoded',
117
- 'Content-Length': Buffer.byteLength(postData)
118
- // Note: the "authorizationHeader" adapter config must contain the raw value.
119
- // Thus if HTTP Basic authorization is to be used, it must contain the
120
- // base64 encoded version of the concatenated <username> + ":" + <password> string.
121
- };if (config.authorizationHeader) {
122
- headers['Authorization'] = config.authorizationHeader;
88
+ async validateAuthData(authData) {
89
+ const response = await this.requestTokenInfo(authData.access_token);
90
+ if (!response.active || this.useridField && authData.id !== response[this.useridField]) {
91
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'OAuth2 access token is invalid for this user.');
92
+ }
93
+ return {};
123
94
  }
124
- return {
125
- data: postData,
126
- options: {
127
- hostname: parsedUrl.hostname,
128
- path: parsedUrl.pathname,
95
+ async requestTokenInfo(accessToken) {
96
+ const response = await fetch(this.tokenIntrospectionEndpointUrl, {
129
97
  method: 'POST',
130
- headers: headers
131
- }
132
- };
133
- }
134
-
135
- function validateAppIdResponse(response, appidField, appIds) {
136
- if (response && response[appidField]) {
137
- const responseValue = response[appidField];
138
- if (Array.isArray(responseValue)) {
139
- if (responseValue.find((value, index) => {
140
- return appIds.includes(index);
141
- })) {
142
- return Promise.resolve();
143
- }
144
- } else {
145
- if (appIds.includes(responseValue)) {
146
- return Promise.resolve();
147
- }
98
+ headers: {
99
+ 'Content-Type': 'application/x-www-form-urlencoded',
100
+ ...(this.authorizationHeader && {
101
+ Authorization: this.authorizationHeader
102
+ })
103
+ },
104
+ body: new URLSearchParams({
105
+ token: accessToken
106
+ })
107
+ });
108
+ if (!response.ok) {
109
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'OAuth2 token introspection request failed.');
148
110
  }
111
+ return response.json();
149
112
  }
150
- return Promise.reject(new _node2.default.Error(_node2.default.Error.OBJECT_NOT_FOUND, 'OAuth2: the access_token\'s appID is empty or is not in the list of permitted appIDs in the auth configuration.'));
151
113
  }
152
-
153
- // A promise wrapper for api requests
154
- function requestJson(config, access_token) {
155
- return new Promise(function (resolve, reject) {
156
- const { data, options } = getRequestOptions(config, access_token);
157
- const postRequest = _https2.default.request(options, function (res) {
158
- let data = '';
159
- res.setEncoding('utf8');
160
- res.on('data', function (chunk) {
161
- data += chunk;
162
- });
163
- res.on('end', function () {
164
- try {
165
- return resolve(JSON.parse(data));
166
- } catch (e) {
167
- return reject(e);
168
- }
169
- });
170
- }).on('error', function () {
171
- return reject('Failed to validate access token %s with OAuth2 provider (url = %s, headers = %s)', access_token, options.tokenIntrospectionEndpointUrl, JSON.stringify(options.headers));
172
- });
173
-
174
- postRequest.write(data);
175
- postRequest.end();
176
- });
177
- }
178
-
179
- module.exports = { OAuth2AuthAdapter, requestJson, getRequestOptions };
180
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL29hdXRoMi5qcyJdLCJuYW1lcyI6WyJPQXV0aDJBdXRoQWRhcHRlciIsImNvbnN0cnVjdG9yIiwibmFtZSIsInZhbGlkYXRlQXV0aERhdGEiLCJhdXRoRGF0YSIsIm9wdGlvbnMiLCJyZXF1ZXN0SnNvbiIsImFjY2Vzc190b2tlbiIsInRoZW4iLCJyZXNwb25zZSIsImFjdGl2ZSIsImhhc093blByb3BlcnR5IiwidXNlcmlkRmllbGQiLCJpZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiUGFyc2UiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ2YWxpZGF0ZUFwcElkIiwiYXBwSWRzIiwiYXBwaWRGaWVsZCIsImxlbmd0aCIsInZhbGlkYXRlQXBwSWRSZXNwb25zZSIsImdldFJlcXVlc3RPcHRpb25zIiwiY29uZmlnIiwiZW5kcG9pbnQiLCJwYXJzZWRVcmwiLCJ1cmwiLCJwb3N0RGF0YSIsInF1ZXJ5c3RyaW5nIiwic3RyaW5naWZ5IiwiaGVhZGVycyIsIkJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJhdXRob3JpemF0aW9uSGVhZGVyIiwiZGF0YSIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwicmVzcG9uc2VWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbmQiLCJ2YWx1ZSIsImluZGV4IiwiaW5jbHVkZXMiLCJwb3N0UmVxdWVzdCIsImh0dHBzIiwicmVxdWVzdCIsInJlcyIsInNldEVuY29kaW5nIiwib24iLCJjaHVuayIsIkpTT04iLCJwYXJzZSIsImUiLCJ0b2tlbkludHJvc3BlY3Rpb25FbmRwb2ludFVybCIsIndyaXRlIiwiZW5kIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUF1REE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQTFEQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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T0FBT3FCLENBQVAsRUFBVTtBQUNWLGlCQUFPMUMsT0FBTzBDLENBQVAsQ0FBUDtBQUNEO0FBQ0YsT0FORDtBQU9ELEtBYm1CLEVBYWpCSixFQWJpQixDQWFkLE9BYmMsRUFhTCxZQUFXO0FBQ3hCLGFBQU90QyxPQUFPLGtGQUFQLEVBQTJGVCxZQUEzRixFQUF5R0YsUUFBUXNELDZCQUFqSCxFQUFnSkgsS0FBS3hCLFNBQUwsQ0FBZTNCLFFBQVE0QixPQUF2QixDQUFoSixDQUFQO0FBQ0QsS0FmbUIsQ0FBcEI7O0FBaUJBZ0IsZ0JBQVlXLEtBQVosQ0FBa0J2QixJQUFsQjtBQUNBWSxnQkFBWVksR0FBWjtBQUNELEdBckJNLENBQVA7QUFzQkQ7O0FBRURDLE9BQU9DLE9BQVAsR0FBaUIsRUFBRS9ELGlCQUFGLEVBQXFCTSxXQUFyQixFQUFrQ21CLGlCQUFsQyxFQUFqQiIsImZpbGUiOiJvYXV0aDIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogVGhpcyBhdXRoIGFkYXB0ZXIgaXMgYmFzZWQgb24gdGhlIE9BdXRoIDIuMCBUb2tlbiBJbnRyb3NwZWN0aW9uIHNwZWNpZmljYXRpb24uXG4gKiBTZWUgUkZDIDc2NjIgZm9yIGRldGFpbHMgKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NjYyKS5cbiAqIEl0J3MgcHVycG9zZSBpcyB0byB2YWxpZGF0ZSBPQXV0aDIgYWNjZXNzIHRva2VucyB1c2luZyB0aGUgT0F1dGgyIHByb3ZpZGVyJ3NcbiAqIHRva2VuIGludHJvc3BlY3Rpb24gZW5kcG9pbnQgKGlmIGltcGxlbWVudGVkIGJ5IHRoZSBwcm92aWRlcikuXG4gKlxuICogVGhlIGFkYXB0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNvbmZpZyBwYXJhbWV0ZXJzOlxuICpcbiAqIDEuIFwiZW5kcG9pbnRcIiAoc3RyaW5nLCByZXF1aXJlZClcbiAqICAgICAgVGhlIFVSTCBvZiB0aGUgdG9rZW4gaW50cm9zcGVjdGlvbiBlbmRwb2ludCBvZiB0aGUgT0F1dGgyIHByb3ZpZGVyIHRoYXRcbiAqICAgICAgaXNzdWVkIHRoZSBhY2Nlc3MgdG9rZW4gdG8gdGhlIGNsaWVudCB0aGF0IGlzIHRvIGJlIHZhbGlkYXRlZC5cbiAqXG4gKiAyLiBcInVzZXJpZEZpZWxkXCIgKHN0cmluZywgb3B0aW9uYWwpXG4gKiAgICAgIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgdG9rZW4gaW50cm9zcGVjdGlvbiByZXNwb25zZSB0aGF0IGNvbnRhaW5zXG4gKiAgICAgIHRoZSB1c2VyaWQuIElmIHNwZWNpZmllZCwgaXQgd2lsbCBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgdmFsdWUgb2YgdGhlIFwiaWRcIlxuICogICAgICBmaWVsZCBpbiB0aGUgXCJhdXRoRGF0YVwiIEpTT04gdGhhdCBpcyBjb21pbmcgZnJvbSB0aGUgY2xpZW50LlxuICogICAgICBUaGlzIGNhbiBiZSB0aGUgXCJhdWRcIiAoaS5lLiBhdWRpZW5jZSksIHRoZSBcInN1YlwiIChpLmUuIHN1YmplY3QpIG9yIHRoZVxuICogICAgICBcInVzZXJuYW1lXCIgZmllbGQgaW4gdGhlIGludHJvc3BlY3Rpb24gcmVzcG9uc2UsIGJ1dCBzaW5jZSBvbmx5IHRoZVxuICogICAgICBcImFjdGl2ZVwiIGZpZWxkIGlzIHJlcXVpcmVkIGFuZCBhbGwgb3RoZXIgcmVwb25zZSBmaWVsZHMgYXJlIG9wdGlvbmFsXG4gKiAgICAgIGluIHRoZSBSRkMsIGl0IGhhcyB0byBiZSBvcHRpb25hbCBpbiB0aGlzIGFkYXB0ZXIgYXMgd2VsbC5cbiAqICAgICAgRGVmYXVsdDogLSAodW5kZWZpbmVkKVxuICpcbiAqIDMuIFwiYXBwaWRGaWVsZFwiIChzdHJpbmcsIG9wdGlvbmFsKVxuICogICAgICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgaW4gdGhlIHRva2VuIGludHJvc3BlY3Rpb24gcmVzcG9uc2UgdGhhdCBjb250YWluc1xuICogICAgICB0aGUgYXBwSWQgb2YgdGhlIGNsaWVudC4gSWYgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gdmVyaWZ5IGl0J3NcbiAqICAgICAgdmFsdWUgYWdhaW5zdCB0aGUgc2V0IG9mIGFwcElkcyBpbiB0aGUgYWRhcHRlciBjb25maWcuIFRoZSBjb25jZXB0IG9mXG4gKiAgICAgIGFwcElkcyBjb21lcyBmcm9tIHRoZSB0d28gbWFqb3Igc29jaWFsIGxvZ2luIHByb3ZpZGVyc1xuICogICAgICAoR29vZ2xlIGFuZCBGYWNlYm9vaykuIFRoZXkgaGF2ZSBub3QgeWV0IGltcGxlbWVudGVkIHRoZSB0b2tlblxuICogICAgICBpbnRyb3NwZWN0aW9uIGVuZHBvaW50LCBidXQgdGhlIGNvbmNlcHQgY2FuIGJlIHZhbGlkIGZvciBhbnkgT0F1dGgyXG4gKiAgICAgIHByb3ZpZGVyLlxuICogICAgICBEZWZhdWx0OiAtICh1bmRlZmluZWQpXG4gKlxuICogNC4gXCJhcHBJZHNcIiAoYXJyYXkgb2Ygc3RyaW5ncywgb3B0aW9uYWwpXG4gKiAgICAgIEEgc2V0IG9mIGFwcElkcyB0aGF0IGFyZSB1c2VkIHRvIHJlc3RyaWN0IGFjY2VwdGVkIGFjY2VzcyB0b2tlbnMgYmFzZWRcbiAqICAgICAgb24gYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlIGluIHRoZSB0b2tlbiBpbnRyb3NwZWN0aW9uIHJlc3BvbnNlLlxuICogICAgICBEZWZhdWx0OiAtICh1bmRlZmluZWQpXG4gKlxuICogNS4gXCJhdXRob3JpemF0aW9uSGVhZGVyXCIgKHN0cmluZywgb3B0aW9uYWwpXG4gKiAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgXCJBdXRob3JpemF0aW9uXCIgSFRUUCBoZWFkZXIgaW4gcmVxdWVzdHMgc2VudCB0byB0aGVcbiAqICAgICAgaW50cm9zcGVjdGlvbiBlbmRwb2ludC5cbiAqICAgICAgRWcuIFwiQmFzaWMgZFhObGNtNWhiV1U2Y0dGemMzZHZjbVE9XCJcbiAqXG4gKiA2LiBcImRlYnVnXCIgKGJvb2xlYW4sIG9wdGlvbmFsKVxuICogICAgICBFbmFibGVzIGV4dGVuc2l2ZSBsb2dnaW5nIHVzaW5nIHRoZSBcInZlcmJvc2VcIiBsZXZlbC5cbiAqXG4gKiBUaGUgYWRhcHRlciBleHBlY3RzIHJlcXVlc3RzIHdpdGggdGhlIGZvbGxvd2luZyBhdXRoRGF0YSBKU09OOlxuICpcbiAqIHtcbiAqICAgXCJvYXV0aDJcIjoge1xuICogICAgIFwiaWRcIjogXCJ1c2VyJ3MgT0F1dGgyIHByb3ZpZGVyLXNwZWNpZmljIGlkIGFzIGEgc3RyaW5nXCIsXG4gKiAgICAgXCJhY2Nlc3NfdG9rZW5cIjogXCJhbiBhdXRob3JpemVkIE9BdXRoMiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSB1c2VyXCIsXG4gKiAgIH1cbiAqIH1cbiAqL1xuXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5c3RyaW5nJ1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG5cbmNsYXNzIE9BdXRoMkF1dGhBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbiAgdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiByZXF1ZXN0SnNvbihvcHRpb25zLCBhdXRoRGF0YS5hY2Nlc3NfdG9rZW4pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UgJiZcbiAgICAgICAgcmVzcG9uc2UuYWN0aXZlICYmXG4gICAgICAgICghb3B0aW9ucyB8fCAhb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlcmlkRmllbGQnKSB8fCAhb3B0aW9ucy51c2VyaWRGaWVsZCB8fCBhdXRoRGF0YS5pZCA9PSByZXNwb25zZVtvcHRpb25zLnVzZXJpZEZpZWxkXSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgJ09BdXRoMiBhY2Nlc3MgdG9rZW4gaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlQXBwSWQoYXBwSWRzLCBhdXRoRGF0YSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2FwcGlkRmllbGQnKSAmJiBvcHRpb25zLmFwcGlkRmllbGQpIHtcbiAgICAgIGlmICghYXBwSWRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPQXV0aDIgY29uZmlndXJhdGlvbiBpcyBtaXNzaW5nIHRoZSBjbGllbnQgYXBwIElEcyAoXCJhcHBJZHNcIiBjb25maWcgcGFyYW1ldGVyKS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxdWVzdEpzb24ob3B0aW9ucywgYXV0aERhdGEuYWNjZXNzX3Rva2VuKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBhcHBpZEZpZWxkID0gb3B0aW9ucy5hcHBpZEZpZWxkO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVBcHBJZFJlc3BvbnNlKHJlc3BvbnNlLCBhcHBpZEZpZWxkLCBhcHBJZHMpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVxdWVzdE9wdGlvbnMoY29uZmlnLCBhY2Nlc3NfdG9rZW4pIHtcbiAgaWYgKCFjb25maWcgfHwgIWNvbmZpZy5lbmRwb2ludCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT0F1dGgyIHRva2VuIGludHJvc3BlY3Rpb24gZW5kcG9pbnQgVVJMIGlzIG1pc3NpbmcgZnJvbSBjb25maWd1cmF0aW9uIScpO1xuICB9XG4gIGNvbnN0IHsgZW5kcG9pbnQgfSA9IGNvbmZpZztcbiAgY29uc3QgcGFyc2VkVXJsID0gdXJsLmNvbmZpZyhlbmRwb2ludCk7XG4gIGNvbnN0IHBvc3REYXRhID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHtcbiAgICAndG9rZW4nOiBhY2Nlc3NfdG9rZW5cbiAgfSk7XG4gIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICdDb250ZW50LUxlbmd0aCc6IEJ1ZmZlci5ieXRlTGVuZ3RoKHBvc3REYXRhKVxuICB9XG4gIC8vIE5vdGU6IHRoZSBcImF1dGhvcml6YXRpb25IZWFkZXJcIiBhZGFwdGVyIGNvbmZpZyBtdXN0IGNvbnRhaW4gdGhlIHJhdyB2YWx1ZS5cbiAgLy8gICBUaHVzIGlmIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbiBpcyB0byBiZSB1c2VkLCBpdCBtdXN0IGNvbnRhaW4gdGhlXG4gIC8vICAgYmFzZTY0IGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgY29uY2F0ZW5hdGVkIDx1c2VybmFtZT4gKyBcIjpcIiArIDxwYXNzd29yZD4gc3RyaW5nLlxuICBpZiAoY29uZmlnLmF1dGhvcml6YXRpb25IZWFkZXIpIHtcbiAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBjb25maWcuYXV0aG9yaXphdGlvbkhlYWRlcjtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRhdGE6IHBvc3REYXRhLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGhvc3RuYW1lOiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgICBwYXRoOiBwYXJzZWRVcmwucGF0aG5hbWUsXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZFJlc3BvbnNlKHJlc3BvbnNlLCBhcHBpZEZpZWxkLCBhcHBJZHMpIHtcbiAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlW2FwcGlkRmllbGRdKSB7XG4gICAgY29uc3QgcmVzcG9uc2VWYWx1ZSA9IHJlc3BvbnNlW2FwcGlkRmllbGRdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlVmFsdWUpKSB7XG4gICAgICBpZiAocmVzcG9uc2VWYWx1ZS5maW5kKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIGFwcElkcy5pbmNsdWRlcyhpbmRleCk7XG4gICAgICB9KSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcHBJZHMuaW5jbHVkZXMocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFBhcnNlLkVycm9yKFxuICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgJ09BdXRoMjogdGhlIGFjY2Vzc190b2tlblxcJ3MgYXBwSUQgaXMgZW1wdHkgb3IgaXMgbm90IGluIHRoZSBsaXN0IG9mIHBlcm1pdHRlZCBhcHBJRHMgaW4gdGhlIGF1dGggY29uZmlndXJhdGlvbi4nKSk7XG59XG5cbi8vIEEgcHJvbWlzZSB3cmFwcGVyIGZvciBhcGkgcmVxdWVzdHNcbmZ1bmN0aW9uIHJlcXVlc3RKc29uKGNvbmZpZywgYWNjZXNzX3Rva2VuKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBjb25zdCB7IGRhdGEsIG9wdGlvbnMgfSA9IGdldFJlcXVlc3RPcHRpb25zKGNvbmZpZywgYWNjZXNzX3Rva2VuKTtcbiAgICBjb25zdCBwb3N0UmVxdWVzdCA9IGh0dHBzLnJlcXVlc3Qob3B0aW9ucywgZnVuY3Rpb24ocmVzKSB7XG4gICAgICBsZXQgZGF0YSA9ICcnO1xuICAgICAgcmVzLnNldEVuY29kaW5nKCd1dGY4Jyk7XG4gICAgICByZXMub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgfSk7XG4gICAgICByZXMub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKEpTT04ucGFyc2UoZGF0YSkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByZWplY3QoJ0ZhaWxlZCB0byB2YWxpZGF0ZSBhY2Nlc3MgdG9rZW4gJXMgd2l0aCBPQXV0aDIgcHJvdmlkZXIgKHVybCA9ICVzLCBoZWFkZXJzID0gJXMpJywgYWNjZXNzX3Rva2VuLCBvcHRpb25zLnRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsLCBKU09OLnN0cmluZ2lmeShvcHRpb25zLmhlYWRlcnMpKTtcbiAgICB9KTtcblxuICAgIHBvc3RSZXF1ZXN0LndyaXRlKGRhdGEpO1xuICAgIHBvc3RSZXF1ZXN0LmVuZCgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IE9BdXRoMkF1dGhBZGFwdGVyLCByZXF1ZXN0SnNvbiwgZ2V0UmVxdWVzdE9wdGlvbnMgfTtcbiJdfQ==
114
+ var _default = exports.default = new OAuth2Adapter();
115
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQXV0aEFkYXB0ZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIk9BdXRoMkFkYXB0ZXIiLCJBdXRoQWRhcHRlciIsInZhbGlkYXRlT3B0aW9ucyIsIm9wdGlvbnMiLCJ0b2tlbkludHJvc3BlY3Rpb25FbmRwb2ludFVybCIsIlBhcnNlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiYXBwaWRGaWVsZCIsImFwcElkcyIsImxlbmd0aCIsInVzZXJpZEZpZWxkIiwiYXV0aG9yaXphdGlvbkhlYWRlciIsInZhbGlkYXRlQXBwSWQiLCJhdXRoRGF0YSIsInJlc3BvbnNlIiwicmVxdWVzdFRva2VuSW5mbyIsImFjY2Vzc190b2tlbiIsImFwcElkRmllbGRWYWx1ZSIsImlzVmFsaWRBcHBJZCIsIkFycmF5IiwiaXNBcnJheSIsInNvbWUiLCJhcHBJZCIsImluY2x1ZGVzIiwidmFsaWRhdGVBdXRoRGF0YSIsImFjdGl2ZSIsImlkIiwiYWNjZXNzVG9rZW4iLCJmZXRjaCIsIm1ldGhvZCIsImhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwiYm9keSIsIlVSTFNlYXJjaFBhcmFtcyIsInRva2VuIiwib2siLCJqc29uIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvb2F1dGgyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyc2UgU2VydmVyIGF1dGhlbnRpY2F0aW9uIGFkYXB0ZXIgZm9yIE9BdXRoMiBUb2tlbiBJbnRyb3NwZWN0aW9uLlxuICpcbiAqIEBjbGFzcyBPQXV0aDJBZGFwdGVyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsIC0gVGhlIFVSTCBvZiB0aGUgdG9rZW4gaW50cm9zcGVjdGlvbiBlbmRwb2ludC4gUmVxdWlyZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMub2F1dGgyIC0gSW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIE9BdXRoMiBhZGFwdGVyLiBSZXF1aXJlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy51c2VyaWRGaWVsZF0gLSBUaGUgZmllbGQgaW4gdGhlIGludHJvc3BlY3Rpb24gcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgdXNlciBJRC4gT3B0aW9uYWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXBwaWRGaWVsZF0gLSBUaGUgZmllbGQgaW4gdGhlIGludHJvc3BlY3Rpb24gcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgYXBwIElELiBPcHRpb25hbC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zLmFwcElkc10gLSBMaXN0IG9mIGFsbG93ZWQgYXBwIElEcy4gUmVxdWlyZWQgaWYgYGFwcGlkRmllbGRgIGlzIGRlZmluZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXV0aG9yaXphdGlvbkhlYWRlcl0gLSBUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgdmFsdWUgZm9yIHRoZSBpbnRyb3NwZWN0aW9uIHJlcXVlc3QuIE9wdGlvbmFsLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogIyMgUGFyc2UgU2VydmVyIENvbmZpZ3VyYXRpb25cbiAqIFRvIGNvbmZpZ3VyZSBQYXJzZSBTZXJ2ZXIgZm9yIE9BdXRoMiBUb2tlbiBJbnRyb3NwZWN0aW9uLCB1c2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYXV0aFwiOiB7XG4gKiAgICAgXCJvYXV0aDJQcm92aWRlclwiOiB7XG4gKiAgICAgICBcInRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsXCI6IFwiaHR0cHM6Ly9wcm92aWRlci5jb20vaW50cm9zcGVjdFwiLFxuICogICAgICAgXCJ1c2VyaWRGaWVsZFwiOiBcInN1YlwiLFxuICogICAgICAgXCJhcHBpZEZpZWxkXCI6IFwiYXVkXCIsXG4gKiAgICAgICBcImFwcElkc1wiOiBbXCJteS1hcHAtaWRcIl0sXG4gKiAgICAgICBcImF1dGhvcml6YXRpb25IZWFkZXJcIjogXCJCYXNpYyBkWE5sY201aGJXVTZjR0Z6YzNkdmNtUT1cIixcbiAqICAgICAgIFwib2F1dGgyXCI6IHRydWVcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoZSBhZGFwdGVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgYGF1dGhEYXRhYCBmaWVsZHM6XG4gKiAtIGBpZGA6IFRoZSB1c2VyIElEIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQuXG4gKiAtIGBhY2Nlc3NfdG9rZW5gOiBUaGUgYWNjZXNzIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQuXG4gKlxuICogIyMgQXV0aCBQYXlsb2FkXG4gKiAjIyMgRXhhbXBsZSBBdXRoIFBheWxvYWRcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJvYXV0aDJcIjoge1xuICogICAgIFwiaWRcIjogXCJ1c2VyLWlkXCIsXG4gKiAgICAgXCJhY2Nlc3NfdG9rZW5cIjogXCJhY2Nlc3MtdG9rZW5cIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBOb3Rlc1xuICogLSBgdG9rZW5JbnRyb3NwZWN0aW9uRW5kcG9pbnRVcmxgIGlzIG1hbmRhdG9yeSBhbmQgc2hvdWxkIHBvaW50IHRvIGEgdmFsaWQgT0F1dGgyIHByb3ZpZGVyJ3MgaW50cm9zcGVjdGlvbiBlbmRwb2ludC5cbiAqIC0gSWYgYGFwcGlkRmllbGRgIGlzIGRlZmluZWQsIGBhcHBJZHNgIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQgdG8gdmFsaWRhdGUgdGhlIGFwcCBJRCBpbiB0aGUgaW50cm9zcGVjdGlvbiByZXNwb25zZS5cbiAqIC0gYGF1dGhvcml6YXRpb25IZWFkZXJgIGNhbiBiZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgdG9rZW4gaW50cm9zcGVjdGlvbiBlbmRwb2ludC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzc2NjIgT0F1dGggMi4wIFRva2VuIEludHJvc3BlY3Rpb24gU3BlY2lmaWNhdGlvbn1cbiAqL1xuXG5cbmltcG9ydCBBdXRoQWRhcHRlciBmcm9tICcuL0F1dGhBZGFwdGVyJztcblxuY2xhc3MgT0F1dGgyQWRhcHRlciBleHRlbmRzIEF1dGhBZGFwdGVyIHtcbiAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBzdXBlci52YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBpZiAoIW9wdGlvbnMudG9rZW5JbnRyb3NwZWN0aW9uRW5kcG9pbnRVcmwpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT0F1dGgyIHRva2VuIGludHJvc3BlY3Rpb24gZW5kcG9pbnQgVVJMIGlzIG1pc3NpbmcuJyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmFwcGlkRmllbGQgJiYgIW9wdGlvbnMuYXBwSWRzPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT0F1dGgyIGNvbmZpZ3VyYXRpb24gaXMgbWlzc2luZyBhcHAgSURzLicpO1xuICAgIH1cblxuICAgIHRoaXMudG9rZW5JbnRyb3NwZWN0aW9uRW5kcG9pbnRVcmwgPSBvcHRpb25zLnRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsO1xuICAgIHRoaXMudXNlcmlkRmllbGQgPSBvcHRpb25zLnVzZXJpZEZpZWxkO1xuICAgIHRoaXMuYXBwaWRGaWVsZCA9IG9wdGlvbnMuYXBwaWRGaWVsZDtcbiAgICB0aGlzLmFwcElkcyA9IG9wdGlvbnMuYXBwSWRzO1xuICAgIHRoaXMuYXV0aG9yaXphdGlvbkhlYWRlciA9IG9wdGlvbnMuYXV0aG9yaXphdGlvbkhlYWRlcjtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQXBwSWQoYXV0aERhdGEpIHtcbiAgICBpZiAoIXRoaXMuYXBwaWRGaWVsZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0VG9rZW5JbmZvKGF1dGhEYXRhLmFjY2Vzc190b2tlbik7XG5cbiAgICBjb25zdCBhcHBJZEZpZWxkVmFsdWUgPSByZXNwb25zZVt0aGlzLmFwcGlkRmllbGRdO1xuICAgIGNvbnN0IGlzVmFsaWRBcHBJZCA9IEFycmF5LmlzQXJyYXkoYXBwSWRGaWVsZFZhbHVlKVxuICAgICAgPyBhcHBJZEZpZWxkVmFsdWUuc29tZShhcHBJZCA9PiB0aGlzLmFwcElkcy5pbmNsdWRlcyhhcHBJZCkpXG4gICAgICA6IHRoaXMuYXBwSWRzLmluY2x1ZGVzKGFwcElkRmllbGRWYWx1ZSk7XG5cbiAgICBpZiAoIWlzVmFsaWRBcHBJZCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPQXV0aDI6IEludmFsaWQgYXBwIElELicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdFRva2VuSW5mbyhhdXRoRGF0YS5hY2Nlc3NfdG9rZW4pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5hY3RpdmUgfHwgKHRoaXMudXNlcmlkRmllbGQgJiYgYXV0aERhdGEuaWQgIT09IHJlc3BvbnNlW3RoaXMudXNlcmlkRmllbGRdKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPQXV0aDIgYWNjZXNzIHRva2VuIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyByZXF1ZXN0VG9rZW5JbmZvKGFjY2Vzc1Rva2VuKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLnRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAuLi4odGhpcy5hdXRob3JpemF0aW9uSGVhZGVyICYmIHsgQXV0aG9yaXphdGlvbjogdGhpcy5hdXRob3JpemF0aW9uSGVhZGVyIH0pXG4gICAgICB9LFxuICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHRva2VuOiBhY2Nlc3NUb2tlbiB9KVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPQXV0aDIgdG9rZW4gaW50cm9zcGVjdGlvbiByZXF1ZXN0IGZhaWxlZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBPQXV0aDJBZGFwdGVyKCk7XG5cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBc0RBLElBQUFBLFlBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUF3QyxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQXREeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var _Config = _interopRequireDefault(require("../../Config"));
4
+ var _Deprecator = _interopRequireDefault(require("../../Deprecator/Deprecator"));
5
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
6
+ /*
7
+ * PhantAuth was designed to simplify testing for applications using OpenID Connect
8
+ * authentication by making use of random generated users.
9
+ *
10
+ * To learn more, please go to: https://www.phantauth.net
11
+ */
12
+
13
+ const {
14
+ Parse
15
+ } = require('parse/node');
16
+ const httpsRequest = require('./httpsRequest');
17
+ // Returns a promise that fulfills if this user id is valid.
18
+ async function validateAuthData(authData) {
19
+ const config = _Config.default.get(Parse.applicationId);
20
+ _Deprecator.default.logRuntimeDeprecation({
21
+ usage: 'phantauth adapter'
22
+ });
23
+ const phantauthConfig = config.auth.phantauth;
24
+ if (!phantauthConfig?.enableInsecureAuth) {
25
+ throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'PhantAuth only works with enableInsecureAuth: true');
26
+ }
27
+ const data = await request('auth/userinfo', authData.access_token);
28
+ if (data?.sub !== authData.id) {
29
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'PhantAuth auth is invalid for this user.');
30
+ }
31
+ }
32
+
33
+ // Returns a promise that fulfills if this app id is valid.
34
+ function validateAppId() {
35
+ return Promise.resolve();
36
+ }
37
+
38
+ // A promisey wrapper for api requests
39
+ function request(path, access_token) {
40
+ return httpsRequest.get({
41
+ host: 'phantauth.net',
42
+ path: '/' + path,
43
+ headers: {
44
+ Authorization: 'bearer ' + access_token,
45
+ 'User-Agent': 'parse-server'
46
+ }
47
+ });
48
+ }
49
+ module.exports = {
50
+ validateAppId: validateAppId,
51
+ validateAuthData: validateAuthData
52
+ };
53
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQ29uZmlnIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfRGVwcmVjYXRvciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIlBhcnNlIiwiaHR0cHNSZXF1ZXN0IiwidmFsaWRhdGVBdXRoRGF0YSIsImF1dGhEYXRhIiwiY29uZmlnIiwiQ29uZmlnIiwiZ2V0IiwiYXBwbGljYXRpb25JZCIsIkRlcHJlY2F0b3IiLCJsb2dSdW50aW1lRGVwcmVjYXRpb24iLCJ1c2FnZSIsInBoYW50YXV0aENvbmZpZyIsImF1dGgiLCJwaGFudGF1dGgiLCJlbmFibGVJbnNlY3VyZUF1dGgiLCJFcnJvciIsIklOVEVSTkFMX1NFUlZFUl9FUlJPUiIsImRhdGEiLCJyZXF1ZXN0IiwiYWNjZXNzX3Rva2VuIiwic3ViIiwiaWQiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwidmFsaWRhdGVBcHBJZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicGF0aCIsImhvc3QiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9waGFudGF1dGguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFBoYW50QXV0aCB3YXMgZGVzaWduZWQgdG8gc2ltcGxpZnkgdGVzdGluZyBmb3IgYXBwbGljYXRpb25zIHVzaW5nIE9wZW5JRCBDb25uZWN0XG4gKiBhdXRoZW50aWNhdGlvbiBieSBtYWtpbmcgdXNlIG9mIHJhbmRvbSBnZW5lcmF0ZWQgdXNlcnMuXG4gKlxuICogVG8gbGVhcm4gbW9yZSwgcGxlYXNlIGdvIHRvOiBodHRwczovL3d3dy5waGFudGF1dGgubmV0XG4gKi9cblxuY29uc3QgeyBQYXJzZSB9ID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xuY29uc3QgaHR0cHNSZXF1ZXN0ID0gcmVxdWlyZSgnLi9odHRwc1JlcXVlc3QnKTtcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vLi4vQ29uZmlnJztcbmltcG9ydCBEZXByZWNhdG9yIGZyb20gJy4uLy4uL0RlcHJlY2F0b3IvRGVwcmVjYXRvcic7XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyB1c2VyIGlkIGlzIHZhbGlkLlxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSkge1xuICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KFBhcnNlLmFwcGxpY2F0aW9uSWQpO1xuXG4gIERlcHJlY2F0b3IubG9nUnVudGltZURlcHJlY2F0aW9uKHsgdXNhZ2U6ICdwaGFudGF1dGggYWRhcHRlcicgfSk7XG5cbiAgY29uc3QgcGhhbnRhdXRoQ29uZmlnID0gY29uZmlnLmF1dGgucGhhbnRhdXRoO1xuICBpZiAoIXBoYW50YXV0aENvbmZpZz8uZW5hYmxlSW5zZWN1cmVBdXRoKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgJ1BoYW50QXV0aCBvbmx5IHdvcmtzIHdpdGggZW5hYmxlSW5zZWN1cmVBdXRoOiB0cnVlJyk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdCgnYXV0aC91c2VyaW5mbycsIGF1dGhEYXRhLmFjY2Vzc190b2tlbik7XG4gIGlmIChkYXRhPy5zdWIgIT09IGF1dGhEYXRhLmlkKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdQaGFudEF1dGggYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gIH1cbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIGFwcCBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXBwSWQoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxuLy8gQSBwcm9taXNleSB3cmFwcGVyIGZvciBhcGkgcmVxdWVzdHNcbmZ1bmN0aW9uIHJlcXVlc3QocGF0aCwgYWNjZXNzX3Rva2VuKSB7XG4gIHJldHVybiBodHRwc1JlcXVlc3QuZ2V0KHtcbiAgICBob3N0OiAncGhhbnRhdXRoLm5ldCcsXG4gICAgcGF0aDogJy8nICsgcGF0aCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiAnYmVhcmVyICcgKyBhY2Nlc3NfdG9rZW4sXG4gICAgICAnVXNlci1BZ2VudCc6ICdwYXJzZS1zZXJ2ZXInLFxuICAgIH0sXG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZDogdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YTogdmFsaWRhdGVBdXRoRGF0YSxcbn07XG4iXSwibWFwcGluZ3MiOiI7O0FBU0EsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQXFELFNBQUFELHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBVnJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0VBQUVHO0FBQU0sQ0FBQyxHQUFHTCxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ3ZDLE1BQU1NLFlBQVksR0FBR04sT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBSTlDO0FBQ0EsZUFBZU8sZ0JBQWdCQSxDQUFDQyxRQUFRLEVBQUU7RUFDeEMsTUFBTUMsTUFBTSxHQUFHQyxlQUFNLENBQUNDLEdBQUcsQ0FBQ04sS0FBSyxDQUFDTyxhQUFhLENBQUM7RUFFOUNDLG1CQUFVLENBQUNDLHFCQUFxQixDQUFDO0lBQUVDLEtBQUssRUFBRTtFQUFvQixDQUFDLENBQUM7RUFFaEUsTUFBTUMsZUFBZSxHQUFHUCxNQUFNLENBQUNRLElBQUksQ0FBQ0MsU0FBUztFQUM3QyxJQUFJLENBQUNGLGVBQWUsRUFBRUcsa0JBQWtCLEVBQUU7SUFDeEMsTUFBTSxJQUFJZCxLQUFLLENBQUNlLEtBQUssQ0FBQ2YsS0FBSyxDQUFDZSxLQUFLLENBQUNDLHFCQUFxQixFQUFFLG9EQUFvRCxDQUFDO0VBQ2hIO0VBRUEsTUFBTUMsSUFBSSxHQUFHLE1BQU1DLE9BQU8sQ0FBQyxlQUFlLEVBQUVmLFFBQVEsQ0FBQ2dCLFlBQVksQ0FBQztFQUNsRSxJQUFJRixJQUFJLEVBQUVHLEdBQUcsS0FBS2pCLFFBQVEsQ0FBQ2tCLEVBQUUsRUFBRTtJQUM3QixNQUFNLElBQUlyQixLQUFLLENBQUNlLEtBQUssQ0FBQ2YsS0FBSyxDQUFDZSxLQUFLLENBQUNPLGdCQUFnQixFQUFFLDBDQUEwQyxDQUFDO0VBQ2pHO0FBQ0Y7O0FBRUE7QUFDQSxTQUFTQyxhQUFhQSxDQUFBLEVBQUc7RUFDdkIsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQztBQUMxQjs7QUFFQTtBQUNBLFNBQVNQLE9BQU9BLENBQUNRLElBQUksRUFBRVAsWUFBWSxFQUFFO0VBQ25DLE9BQU9sQixZQUFZLENBQUNLLEdBQUcsQ0FBQztJQUN0QnFCLElBQUksRUFBRSxlQUFlO0lBQ3JCRCxJQUFJLEVBQUUsR0FBRyxHQUFHQSxJQUFJO0lBQ2hCRSxPQUFPLEVBQUU7TUFDUEMsYUFBYSxFQUFFLFNBQVMsR0FBR1YsWUFBWTtNQUN2QyxZQUFZLEVBQUU7SUFDaEI7RUFDRixDQUFDLENBQUM7QUFDSjtBQUVBVyxNQUFNLENBQUNDLE9BQU8sR0FBRztFQUNmUixhQUFhLEVBQUVBLGFBQWE7RUFDNUJyQixnQkFBZ0IsRUFBRUE7QUFDcEIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,54 +1,113 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
- // Helper functions for accessing the qq Graph API.
4
- var https = require('https');
5
- var Parse = require('parse/node').Parse;
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _BaseCodeAuthAdapter = _interopRequireDefault(require("./BaseCodeAuthAdapter"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ /**
10
+ * Parse Server authentication adapter for QQ.
11
+ *
12
+ * @class QqAdapter
13
+ * @param {Object} options - The adapter configuration options.
14
+ * @param {string} options.clientId - Your QQ App ID. Required for secure authentication.
15
+ * @param {string} options.clientSecret - Your QQ App Secret. Required for secure authentication.
16
+ * @param {boolean} [options.enableInsecureAuth=false] - **[DEPRECATED]** Enable insecure authentication (not recommended).
17
+ *
18
+ * @description
19
+ * ## Parse Server Configuration
20
+ * To configure Parse Server for QQ authentication, use the following structure:
21
+ * ### Secure Configuration
22
+ * ```json
23
+ * {
24
+ * "auth": {
25
+ * "qq": {
26
+ * "clientId": "your-app-id",
27
+ * "clientSecret": "your-app-secret"
28
+ * }
29
+ * }
30
+ * }
31
+ * ```
32
+ * ### Insecure Configuration (Not Recommended)
33
+ * ```json
34
+ * {
35
+ * "auth": {
36
+ * "qq": {
37
+ * "enableInsecureAuth": true
38
+ * }
39
+ * }
40
+ * }
41
+ * ```
42
+ *
43
+ * The adapter requires the following `authData` fields:
44
+ * - **Secure Authentication**: `code`, `redirect_uri`.
45
+ * - **Insecure Authentication (Not Recommended)**: `id`, `access_token`.
46
+ *
47
+ * ## Auth Payloads
48
+ * ### Secure Authentication Payload
49
+ * ```json
50
+ * {
51
+ * "qq": {
52
+ * "code": "abcd1234",
53
+ * "redirect_uri": "https://your-redirect-uri.com/callback"
54
+ * }
55
+ * }
56
+ * ```
57
+ * ### Insecure Authentication Payload (Not Recommended)
58
+ * ```json
59
+ * {
60
+ * "qq": {
61
+ * "id": "1234567",
62
+ * "access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
63
+ * }
64
+ * }
65
+ * ```
66
+ *
67
+ * ## Notes
68
+ * - Secure authentication exchanges the `code` and `redirect_uri` provided by the client for an access token using QQ's OAuth API.
69
+ * - **Insecure authentication** validates the `id` and `access_token` directly, bypassing OAuth flows. This approach is not recommended and may be deprecated in future versions.
70
+ *
71
+ * @see {@link https://wiki.connect.qq.com/ QQ Authentication Documentation}
72
+ */
6
73
 
7
- // Returns a promise that fulfills iff this user id is valid.
8
- function validateAuthData(authData) {
9
- return graphRequest('me?access_token=' + authData.access_token).then(function (data) {
10
- if (data && data.openid == authData.id) {
11
- return;
74
+ class QqAdapter extends _BaseCodeAuthAdapter.default {
75
+ constructor() {
76
+ super('qq');
77
+ }
78
+ async getUserFromAccessToken(access_token) {
79
+ const response = await fetch('https://graph.qq.com/oauth2.0/me', {
80
+ headers: {
81
+ Authorization: `Bearer ${access_token}`
82
+ }
83
+ });
84
+ if (!response.ok) {
85
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq API request failed.');
12
86
  }
13
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq auth is invalid for this user.');
14
- });
15
- }
16
-
17
- // Returns a promise that fulfills if this app id is valid.
18
- function validateAppId() {
19
- return Promise.resolve();
20
- }
21
-
22
- // A promisey wrapper for qq graph requests.
23
- function graphRequest(path) {
24
- return new Promise(function (resolve, reject) {
25
- https.get('https://graph.qq.com/oauth2.0/' + path, function (res) {
26
- var data = '';
27
- res.on('data', function (chunk) {
28
- data += chunk;
29
- });
30
- res.on('end', function () {
31
- var starPos = data.indexOf("(");
32
- var endPos = data.indexOf(")");
33
- if (starPos == -1 || endPos == -1) {
34
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq auth is invalid for this user.');
35
- }
36
- data = data.substring(starPos + 1, endPos - 1);
37
- try {
38
- data = JSON.parse(data);
39
- } catch (e) {
40
- return reject(e);
41
- }
42
- resolve(data);
43
- });
44
- }).on('error', function () {
45
- reject('Failed to validate this access token with qq.');
87
+ const data = await response.text();
88
+ return this.parseResponseData(data);
89
+ }
90
+ async getAccessTokenFromCode(authData) {
91
+ const response = await fetch('https://graph.qq.com/oauth2.0/token', {
92
+ method: 'GET',
93
+ headers: {
94
+ 'Content-Type': 'application/x-www-form-urlencoded'
95
+ },
96
+ body: new URLSearchParams({
97
+ grant_type: 'authorization_code',
98
+ client_id: this.clientId,
99
+ client_secret: this.clientSecret,
100
+ redirect_uri: authData.redirect_uri,
101
+ code: authData.code
102
+ }).toString()
46
103
  });
47
- });
104
+ if (!response.ok) {
105
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq API request failed.');
106
+ }
107
+ const text = await response.text();
108
+ const data = this.parseResponseData(text);
109
+ return data.access_token;
110
+ }
48
111
  }
49
-
50
- module.exports = {
51
- validateAppId,
52
- validateAuthData
53
- };
54
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL3FxLmpzIl0sIm5hbWVzIjpbImh0dHBzIiwicmVxdWlyZSIsIlBhcnNlIiwidmFsaWRhdGVBdXRoRGF0YSIsImF1dGhEYXRhIiwiZ3JhcGhSZXF1ZXN0IiwiYWNjZXNzX3Rva2VuIiwidGhlbiIsImRhdGEiLCJvcGVuaWQiLCJpZCIsIkVycm9yIiwiT0JKRUNUX05PVF9GT1VORCIsInZhbGlkYXRlQXBwSWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInBhdGgiLCJyZWplY3QiLCJnZXQiLCJyZXMiLCJvbiIsImNodW5rIiwic3RhclBvcyIsImluZGV4T2YiLCJlbmRQb3MiLCJzdWJzdHJpbmciLCJKU09OIiwicGFyc2UiLCJlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLElBQUlBLFFBQVFDLFFBQVEsT0FBUixDQUFaO0FBQ0EsSUFBSUMsUUFBUUQsUUFBUSxZQUFSLEVBQXNCQyxLQUFsQzs7QUFFQTtBQUNBLFNBQVNDLGdCQUFULENBQTBCQyxRQUExQixFQUFvQztBQUNsQyxTQUFPQyxhQUFhLHFCQUFxQkQsU0FBU0UsWUFBM0MsRUFBeURDLElBQXpELENBQThELFVBQVVDLElBQVYsRUFBZ0I7QUFDbkYsUUFBSUEsUUFBUUEsS0FBS0MsTUFBTCxJQUFlTCxTQUFTTSxFQUFwQyxFQUF3QztBQUN0QztBQUNEO0FBQ0QsVUFBTSxJQUFJUixNQUFNUyxLQUFWLENBQWdCVCxNQUFNUyxLQUFOLENBQVlDLGdCQUE1QixFQUE4QyxtQ0FBOUMsQ0FBTjtBQUNELEdBTE0sQ0FBUDtBQU1EOztBQUVEO0FBQ0EsU0FBU0MsYUFBVCxHQUF5QjtBQUN2QixTQUFPQyxRQUFRQyxPQUFSLEVBQVA7QUFDRDs7QUFFRDtBQUNBLFNBQVNWLFlBQVQsQ0FBc0JXLElBQXRCLEVBQTRCO0FBQzFCLFNBQU8sSUFBSUYsT0FBSixDQUFZLFVBQVVDLE9BQVYsRUFBbUJFLE1BQW5CLEVBQTJCO0FBQzVDakIsVUFBTWtCLEdBQU4sQ0FBVSxtQ0FBbUNGLElBQTdDLEVBQW1ELFVBQVVHLEdBQVYsRUFBZTtBQUNoRSxVQUFJWCxPQUFPLEVBQVg7QUFDQVcsVUFBSUMsRUFBSixDQUFPLE1BQVAsRUFBZSxVQUFVQyxLQUFWLEVBQWlCO0FBQzlCYixnQkFBUWEsS0FBUjtBQUNELE9BRkQ7QUFHQUYsVUFBSUMsRUFBSixDQUFPLEtBQVAsRUFBYyxZQUFZO0FBQ3hCLFlBQUlFLFVBQVVkLEtBQUtlLE9BQUwsQ0FBYSxHQUFiLENBQWQ7QUFDQSxZQUFJQyxTQUFTaEIsS0FBS2UsT0FBTCxDQUFhLEdBQWIsQ0FBYjtBQUNBLFlBQUdELFdBQVcsQ0FBQyxDQUFaLElBQWlCRSxVQUFVLENBQUMsQ0FBL0IsRUFBaUM7QUFDL0IsZ0JBQU0sSUFBSXRCLE1BQU1TLEtBQVYsQ0FBZ0JULE1BQU1TLEtBQU4sQ0FBWUMsZ0JBQTVCLEVBQThDLG1DQUE5QyxDQUFOO0FBQ0Q7QUFDREosZUFBT0EsS0FBS2lCLFNBQUwsQ0FBZUgsVUFBVSxDQUF6QixFQUEyQkUsU0FBUyxDQUFwQyxDQUFQO0FBQ0EsWUFBSTtBQUNGaEIsaUJBQU9rQixLQUFLQyxLQUFMLENBQVduQixJQUFYLENBQVA7QUFDRCxTQUZELENBRUUsT0FBTW9CLENBQU4sRUFBUztBQUNULGlCQUFPWCxPQUFPVyxDQUFQLENBQVA7QUFDRDtBQUNEYixnQkFBUVAsSUFBUjtBQUNELE9BYkQ7QUFjRCxLQW5CRCxFQW1CR1ksRUFuQkgsQ0FtQk0sT0FuQk4sRUFtQmUsWUFBWTtBQUN6QkgsYUFBTywrQ0FBUDtBQUNELEtBckJEO0FBc0JELEdBdkJNLENBQVA7QUF3QkQ7O0FBRURZLE9BQU9DLE9BQVAsR0FBaUI7QUFDZmpCLGVBRGU7QUFFZlY7QUFGZSxDQUFqQiIsImZpbGUiOiJxcS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgcXEgR3JhcGggQVBJLlxudmFyIGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZmYgdGhpcyB1c2VyIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSkge1xuICByZXR1cm4gZ3JhcGhSZXF1ZXN0KCdtZT9hY2Nlc3NfdG9rZW49JyArIGF1dGhEYXRhLmFjY2Vzc190b2tlbikudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmIChkYXRhICYmIGRhdGEub3BlbmlkID09IGF1dGhEYXRhLmlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAncXEgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gIH0pO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZCgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG4vLyBBIHByb21pc2V5IHdyYXBwZXIgZm9yIHFxIGdyYXBoIHJlcXVlc3RzLlxuZnVuY3Rpb24gZ3JhcGhSZXF1ZXN0KHBhdGgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBodHRwcy5nZXQoJ2h0dHBzOi8vZ3JhcGgucXEuY29tL29hdXRoMi4wLycgKyBwYXRoLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICB2YXIgZGF0YSA9ICcnO1xuICAgICAgcmVzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICB9KTtcbiAgICAgIHJlcy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhclBvcyA9IGRhdGEuaW5kZXhPZihcIihcIik7XG4gICAgICAgIHZhciBlbmRQb3MgPSBkYXRhLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICBpZihzdGFyUG9zID09IC0xIHx8IGVuZFBvcyA9PSAtMSl7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdxcSBhdXRoIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gZGF0YS5zdWJzdHJpbmcoc3RhclBvcyArIDEsZW5kUG9zIC0gMSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlamVjdCgnRmFpbGVkIHRvIHZhbGlkYXRlIHRoaXMgYWNjZXNzIHRva2VuIHdpdGggcXEuJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YVxufTtcbiJdfQ==
112
+ var _default = exports.default = new QqAdapter();
113
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmFzZUNvZGVBdXRoQWRhcHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiUXFBZGFwdGVyIiwiQmFzZUF1dGhDb2RlQWRhcHRlciIsImNvbnN0cnVjdG9yIiwiZ2V0VXNlckZyb21BY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsInJlc3BvbnNlIiwiZmV0Y2giLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIm9rIiwiUGFyc2UiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJkYXRhIiwidGV4dCIsInBhcnNlUmVzcG9uc2VEYXRhIiwiZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZSIsImF1dGhEYXRhIiwibWV0aG9kIiwiYm9keSIsIlVSTFNlYXJjaFBhcmFtcyIsImdyYW50X3R5cGUiLCJjbGllbnRfaWQiLCJjbGllbnRJZCIsImNsaWVudF9zZWNyZXQiLCJjbGllbnRTZWNyZXQiLCJyZWRpcmVjdF91cmkiLCJjb2RlIiwidG9TdHJpbmciLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9xcS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnNlIFNlcnZlciBhdXRoZW50aWNhdGlvbiBhZGFwdGVyIGZvciBRUS5cbiAqXG4gKiBAY2xhc3MgUXFBZGFwdGVyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmNsaWVudElkIC0gWW91ciBRUSBBcHAgSUQuIFJlcXVpcmVkIGZvciBzZWN1cmUgYXV0aGVudGljYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5jbGllbnRTZWNyZXQgLSBZb3VyIFFRIEFwcCBTZWNyZXQuIFJlcXVpcmVkIGZvciBzZWN1cmUgYXV0aGVudGljYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmVuYWJsZUluc2VjdXJlQXV0aD1mYWxzZV0gLSAqKltERVBSRUNBVEVEXSoqIEVuYWJsZSBpbnNlY3VyZSBhdXRoZW50aWNhdGlvbiAobm90IHJlY29tbWVuZGVkKS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICMjIFBhcnNlIFNlcnZlciBDb25maWd1cmF0aW9uXG4gKiBUbyBjb25maWd1cmUgUGFyc2UgU2VydmVyIGZvciBRUSBhdXRoZW50aWNhdGlvbiwgdXNlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICogIyMjIFNlY3VyZSBDb25maWd1cmF0aW9uXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYXV0aFwiOiB7XG4gKiAgICAgXCJxcVwiOiB7XG4gKiAgICAgICBcImNsaWVudElkXCI6IFwieW91ci1hcHAtaWRcIixcbiAqICAgICAgIFwiY2xpZW50U2VjcmV0XCI6IFwieW91ci1hcHAtc2VjcmV0XCJcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogIyMjIEluc2VjdXJlIENvbmZpZ3VyYXRpb24gKE5vdCBSZWNvbW1lbmRlZClcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJhdXRoXCI6IHtcbiAqICAgICBcInFxXCI6IHtcbiAqICAgICAgIFwiZW5hYmxlSW5zZWN1cmVBdXRoXCI6IHRydWVcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoZSBhZGFwdGVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgYGF1dGhEYXRhYCBmaWVsZHM6XG4gKiAtICoqU2VjdXJlIEF1dGhlbnRpY2F0aW9uKio6IGBjb2RlYCwgYHJlZGlyZWN0X3VyaWAuXG4gKiAtICoqSW5zZWN1cmUgQXV0aGVudGljYXRpb24gKE5vdCBSZWNvbW1lbmRlZCkqKjogYGlkYCwgYGFjY2Vzc190b2tlbmAuXG4gKlxuICogIyMgQXV0aCBQYXlsb2Fkc1xuICogIyMjIFNlY3VyZSBBdXRoZW50aWNhdGlvbiBQYXlsb2FkXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwicXFcIjoge1xuICogICAgIFwiY29kZVwiOiBcImFiY2QxMjM0XCIsXG4gKiAgICAgXCJyZWRpcmVjdF91cmlcIjogXCJodHRwczovL3lvdXItcmVkaXJlY3QtdXJpLmNvbS9jYWxsYmFja1wiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogIyMjIEluc2VjdXJlIEF1dGhlbnRpY2F0aW9uIFBheWxvYWQgKE5vdCBSZWNvbW1lbmRlZClcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJxcVwiOiB7XG4gKiAgICAgXCJpZFwiOiBcIjEyMzQ1NjdcIixcbiAqICAgICBcImFjY2Vzc190b2tlblwiOiBcInh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4XCJcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogIyMgTm90ZXNcbiAqIC0gU2VjdXJlIGF1dGhlbnRpY2F0aW9uIGV4Y2hhbmdlcyB0aGUgYGNvZGVgIGFuZCBgcmVkaXJlY3RfdXJpYCBwcm92aWRlZCBieSB0aGUgY2xpZW50IGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgUVEncyBPQXV0aCBBUEkuXG4gKiAtICoqSW5zZWN1cmUgYXV0aGVudGljYXRpb24qKiB2YWxpZGF0ZXMgdGhlIGBpZGAgYW5kIGBhY2Nlc3NfdG9rZW5gIGRpcmVjdGx5LCBieXBhc3NpbmcgT0F1dGggZmxvd3MuIFRoaXMgYXBwcm9hY2ggaXMgbm90IHJlY29tbWVuZGVkIGFuZCBtYXkgYmUgZGVwcmVjYXRlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93aWtpLmNvbm5lY3QucXEuY29tLyBRUSBBdXRoZW50aWNhdGlvbiBEb2N1bWVudGF0aW9ufVxuICovXG5cbmltcG9ydCBCYXNlQXV0aENvZGVBZGFwdGVyIGZyb20gJy4vQmFzZUNvZGVBdXRoQWRhcHRlcic7XG5jbGFzcyBRcUFkYXB0ZXIgZXh0ZW5kcyBCYXNlQXV0aENvZGVBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ3FxJyk7XG4gIH1cblxuICBhc3luYyBnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuKGFjY2Vzc190b2tlbikge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vZ3JhcGgucXEuY29tL29hdXRoMi4wL21lJywge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzX3Rva2VufWAsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdxcSBBUEkgcmVxdWVzdCBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlRGF0YShkYXRhKTtcbiAgfVxuXG4gIGFzeW5jIGdldEFjY2Vzc1Rva2VuRnJvbUNvZGUoYXV0aERhdGEpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2dyYXBoLnFxLmNvbS9vYXV0aDIuMC90b2tlbicsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgZ3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRTZWNyZXQsXG4gICAgICAgIHJlZGlyZWN0X3VyaTogYXV0aERhdGEucmVkaXJlY3RfdXJpLFxuICAgICAgICBjb2RlOiBhdXRoRGF0YS5jb2RlLFxuICAgICAgfSkudG9TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAncXEgQVBJIHJlcXVlc3QgZmFpbGVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucGFyc2VSZXNwb25zZURhdGEodGV4dCk7XG4gICAgcmV0dXJuIGRhdGEuYWNjZXNzX3Rva2VuO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBRcUFkYXB0ZXIoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBaUVBLElBQUFBLG9CQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFBd0QsU0FBQUQsdUJBQUFFLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFqRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBLE1BQU1HLFNBQVMsU0FBU0MsNEJBQW1CLENBQUM7RUFDMUNDLFdBQVdBLENBQUEsRUFBRztJQUNaLEtBQUssQ0FBQyxJQUFJLENBQUM7RUFDYjtFQUVBLE1BQU1DLHNCQUFzQkEsQ0FBQ0MsWUFBWSxFQUFFO0lBQ3pDLE1BQU1DLFFBQVEsR0FBRyxNQUFNQyxLQUFLLENBQUMsa0NBQWtDLEVBQUU7TUFDL0RDLE9BQU8sRUFBRTtRQUNQQyxhQUFhLEVBQUUsVUFBVUosWUFBWTtNQUN2QztJQUNGLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQ0MsUUFBUSxDQUFDSSxFQUFFLEVBQUU7TUFDaEIsTUFBTSxJQUFJQyxLQUFLLENBQUNDLEtBQUssQ0FBQ0QsS0FBSyxDQUFDQyxLQUFLLENBQUNDLGdCQUFnQixFQUFFLHdCQUF3QixDQUFDO0lBQy9FO0lBRUEsTUFBTUMsSUFBSSxHQUFHLE1BQU1SLFFBQVEsQ0FBQ1MsSUFBSSxDQUFDLENBQUM7SUFDbEMsT0FBTyxJQUFJLENBQUNDLGlCQUFpQixDQUFDRixJQUFJLENBQUM7RUFDckM7RUFFQSxNQUFNRyxzQkFBc0JBLENBQUNDLFFBQVEsRUFBRTtJQUNyQyxNQUFNWixRQUFRLEdBQUcsTUFBTUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFO01BQ2xFWSxNQUFNLEVBQUUsS0FBSztNQUNiWCxPQUFPLEVBQUU7UUFDUCxjQUFjLEVBQUU7TUFDbEIsQ0FBQztNQUNEWSxJQUFJLEVBQUUsSUFBSUMsZUFBZSxDQUFDO1FBQ3hCQyxVQUFVLEVBQUUsb0JBQW9CO1FBQ2hDQyxTQUFTLEVBQUUsSUFBSSxDQUFDQyxRQUFRO1FBQ3hCQyxhQUFhLEVBQUUsSUFBSSxDQUFDQyxZQUFZO1FBQ2hDQyxZQUFZLEVBQUVULFFBQVEsQ0FBQ1MsWUFBWTtRQUNuQ0MsSUFBSSxFQUFFVixRQUFRLENBQUNVO01BQ2pCLENBQUMsQ0FBQyxDQUFDQyxRQUFRLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUN2QixRQUFRLENBQUNJLEVBQUUsRUFBRTtNQUNoQixNQUFNLElBQUlDLEtBQUssQ0FBQ0MsS0FBSyxDQUFDRCxLQUFLLENBQUNDLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQUUsd0JBQXdCLENBQUM7SUFDL0U7SUFFQSxNQUFNRSxJQUFJLEdBQUcsTUFBTVQsUUFBUSxDQUFDUyxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNRCxJQUFJLEdBQUcsSUFBSSxDQUFDRSxpQkFBaUIsQ0FBQ0QsSUFBSSxDQUFDO0lBQ3pDLE9BQU9ELElBQUksQ0FBQ1QsWUFBWTtFQUMxQjtBQUNGO0FBQUMsSUFBQXlCLFFBQUEsR0FBQUMsT0FBQSxDQUFBL0IsT0FBQSxHQUVjLElBQUlDLFNBQVMsQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119