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.
- package/LICENSE +167 -25
- package/NOTICE +10 -0
- package/README.md +929 -278
- package/lib/AccountLockout.js +47 -30
- package/lib/Adapters/AdapterLoader.js +21 -6
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
- package/lib/Adapters/Auth/AuthAdapter.js +116 -13
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
- package/lib/Adapters/Auth/OAuth1Client.js +27 -46
- package/lib/Adapters/Auth/apple.js +123 -0
- package/lib/Adapters/Auth/facebook.js +162 -35
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +118 -48
- package/lib/Adapters/Auth/google.js +160 -51
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +6 -7
- package/lib/Adapters/Auth/index.js +170 -62
- package/lib/Adapters/Auth/instagram.js +114 -40
- package/lib/Adapters/Auth/janraincapture.js +52 -23
- package/lib/Adapters/Auth/janrainengage.js +19 -36
- package/lib/Adapters/Auth/keycloak.js +148 -0
- package/lib/Adapters/Auth/ldap.js +167 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +111 -55
- package/lib/Adapters/Auth/meetup.js +24 -34
- package/lib/Adapters/Auth/mfa.js +324 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +97 -162
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +108 -49
- package/lib/Adapters/Auth/spotify.js +107 -55
- package/lib/Adapters/Auth/twitter.js +188 -48
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +26 -39
- package/lib/Adapters/Auth/wechat.js +106 -44
- package/lib/Adapters/Auth/weibo.js +132 -58
- package/lib/Adapters/Cache/CacheAdapter.js +13 -8
- package/lib/Adapters/Cache/InMemoryCache.js +3 -13
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
- package/lib/Adapters/Cache/LRUCache.js +13 -27
- package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +10 -8
- package/lib/Adapters/Files/FilesAdapter.js +83 -25
- package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
- package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
- package/lib/Adapters/Logger/WinstonLogger.js +69 -88
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
- package/lib/Adapters/Push/PushAdapter.js +14 -7
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +488 -125
- package/lib/ClientSDK.js +2 -6
- package/lib/Config.js +525 -94
- package/lib/Controllers/AdaptableController.js +5 -25
- package/lib/Controllers/AnalyticsController.js +22 -23
- package/lib/Controllers/CacheController.js +10 -31
- package/lib/Controllers/DatabaseController.js +767 -313
- package/lib/Controllers/FilesController.js +49 -54
- package/lib/Controllers/HooksController.js +80 -84
- package/lib/Controllers/LiveQueryController.js +35 -22
- package/lib/Controllers/LoggerController.js +22 -58
- package/lib/Controllers/ParseGraphQLController.js +293 -0
- package/lib/Controllers/PushController.js +58 -49
- package/lib/Controllers/SchemaController.js +916 -422
- package/lib/Controllers/UserController.js +265 -180
- package/lib/Controllers/index.js +90 -125
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +30 -0
- package/lib/Deprecator/Deprecator.js +127 -0
- package/lib/Error.js +48 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +214 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +78 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +162 -0
- package/lib/GraphQL/loaders/schemaQueries.js +81 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +63 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +274 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +25 -33
- package/lib/LiveQuery/Id.js +2 -5
- package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
- package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
- package/lib/LiveQuery/ParsePubSub.js +7 -16
- package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
- package/lib/LiveQuery/QueryTools.js +76 -15
- package/lib/LiveQuery/RequestSchema.js +111 -97
- package/lib/LiveQuery/SessionTokenCache.js +23 -36
- package/lib/LiveQuery/Subscription.js +8 -17
- package/lib/LiveQuery/equalObjects.js +2 -3
- package/lib/Options/Definitions.js +1355 -382
- package/lib/Options/docs.js +301 -62
- package/lib/Options/index.js +11 -1
- package/lib/Options/parsers.js +14 -10
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +6 -13
- package/lib/ParseServer.js +474 -235
- package/lib/ParseServerRESTController.js +102 -40
- package/lib/PromiseRouter.js +39 -50
- package/lib/Push/PushQueue.js +24 -30
- package/lib/Push/PushWorker.js +32 -56
- package/lib/Push/utils.js +22 -35
- package/lib/RestQuery.js +361 -139
- package/lib/RestWrite.js +713 -344
- package/lib/Routers/AggregateRouter.js +97 -71
- package/lib/Routers/AnalyticsRouter.js +8 -14
- package/lib/Routers/AudiencesRouter.js +16 -35
- package/lib/Routers/ClassesRouter.js +86 -72
- package/lib/Routers/CloudCodeRouter.js +28 -37
- package/lib/Routers/FeaturesRouter.js +22 -25
- package/lib/Routers/FilesRouter.js +266 -171
- package/lib/Routers/FunctionsRouter.js +87 -103
- package/lib/Routers/GlobalConfigRouter.js +94 -33
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +43 -47
- package/lib/Routers/IAPValidationRouter.js +57 -70
- package/lib/Routers/InstallationsRouter.js +17 -25
- package/lib/Routers/LogsRouter.js +10 -25
- package/lib/Routers/PagesRouter.js +647 -0
- package/lib/Routers/PublicAPIRouter.js +104 -112
- package/lib/Routers/PurgeRouter.js +19 -29
- package/lib/Routers/PushRouter.js +14 -28
- package/lib/Routers/RolesRouter.js +7 -14
- package/lib/Routers/SchemasRouter.js +63 -42
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +25 -38
- package/lib/Routers/UsersRouter.js +463 -190
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +29 -0
- package/lib/StatusHandler.js +96 -93
- package/lib/TestUtils.js +70 -14
- package/lib/Utils.js +468 -0
- package/lib/batch.js +74 -40
- package/lib/cache.js +8 -8
- package/lib/cli/definitions/parse-live-query-server.js +4 -3
- package/lib/cli/definitions/parse-server.js +4 -3
- package/lib/cli/parse-live-query-server.js +9 -17
- package/lib/cli/parse-server.js +49 -47
- package/lib/cli/utils/commander.js +20 -29
- package/lib/cli/utils/runner.js +31 -32
- package/lib/cloud-code/Parse.Cloud.js +711 -36
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +6 -11
- package/lib/defaults.js +21 -15
- package/lib/deprecated.js +1 -1
- package/lib/index.js +78 -67
- package/lib/logger.js +12 -20
- package/lib/middlewares.js +484 -160
- package/lib/password.js +10 -6
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +4 -3
- package/lib/rest.js +157 -82
- package/lib/triggers.js +627 -185
- package/lib/vendor/README.md +3 -3
- package/lib/vendor/mongodbUrl.js +224 -137
- package/package.json +135 -57
- package/postinstall.js +38 -50
- package/public_html/invalid_verification_link.html +3 -3
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +301 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/CHANGELOG.md +0 -1246
- package/PATENTS +0 -37
- package/bin/dev +0 -37
- package/lib/.DS_Store +0 -0
- package/lib/Adapters/Auth/common.js +0 -2
- package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
- package/lib/Controllers/SchemaCache.js +0 -97
- package/lib/LiveQuery/.DS_Store +0 -0
- package/lib/cli/utils/parsers.js +0 -77
- package/lib/cloud-code/.DS_Store +0 -0
- package/lib/cloud-code/HTTPResponse.js +0 -57
- package/lib/cloud-code/Untitled-1 +0 -123
- package/lib/cloud-code/httpRequest.js +0 -102
- package/lib/cloud-code/team.html +0 -123
- package/lib/graphql/ParseClass.js +0 -234
- package/lib/graphql/Schema.js +0 -197
- package/lib/graphql/index.js +0 -1
- package/lib/graphql/types/ACL.js +0 -35
- package/lib/graphql/types/Date.js +0 -25
- package/lib/graphql/types/File.js +0 -24
- package/lib/graphql/types/GeoPoint.js +0 -35
- package/lib/graphql/types/JSONObject.js +0 -30
- package/lib/graphql/types/NumberInput.js +0 -43
- package/lib/graphql/types/NumberQuery.js +0 -42
- package/lib/graphql/types/Pointer.js +0 -35
- package/lib/graphql/types/QueryConstraint.js +0 -61
- package/lib/graphql/types/StringQuery.js +0 -39
- package/lib/graphql/types/index.js +0 -110
|
@@ -1,180 +1,115 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
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
|
|
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
|
|
71
|
-
* "access_token": "
|
|
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
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
125
|
-
|
|
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:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQXV0aEFkYXB0ZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIk9BdXRoMkFkYXB0ZXIiLCJBdXRoQWRhcHRlciIsInZhbGlkYXRlT3B0aW9ucyIsIm9wdGlvbnMiLCJ0b2tlbkludHJvc3BlY3Rpb25FbmRwb2ludFVybCIsIlBhcnNlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiYXBwaWRGaWVsZCIsImFwcElkcyIsImxlbmd0aCIsInVzZXJpZEZpZWxkIiwiYXV0aG9yaXphdGlvbkhlYWRlciIsInZhbGlkYXRlQXBwSWQiLCJhdXRoRGF0YSIsInJlc3BvbnNlIiwicmVxdWVzdFRva2VuSW5mbyIsImFjY2Vzc190b2tlbiIsImFwcElkRmllbGRWYWx1ZSIsImlzVmFsaWRBcHBJZCIsIkFycmF5IiwiaXNBcnJheSIsInNvbWUiLCJhcHBJZCIsImluY2x1ZGVzIiwidmFsaWRhdGVBdXRoRGF0YSIsImFjdGl2ZSIsImlkIiwiYWNjZXNzVG9rZW4iLCJmZXRjaCIsIm1ldGhvZCIsImhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwiYm9keSIsIlVSTFNlYXJjaFBhcmFtcyIsInRva2VuIiwib2siLCJqc29uIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvb2F1dGgyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyc2UgU2VydmVyIGF1dGhlbnRpY2F0aW9uIGFkYXB0ZXIgZm9yIE9BdXRoMiBUb2tlbiBJbnRyb3NwZWN0aW9uLlxuICpcbiAqIEBjbGFzcyBPQXV0aDJBZGFwdGVyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsIC0gVGhlIFVSTCBvZiB0aGUgdG9rZW4gaW50cm9zcGVjdGlvbiBlbmRwb2ludC4gUmVxdWlyZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMub2F1dGgyIC0gSW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIE9BdXRoMiBhZGFwdGVyLiBSZXF1aXJlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy51c2VyaWRGaWVsZF0gLSBUaGUgZmllbGQgaW4gdGhlIGludHJvc3BlY3Rpb24gcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgdXNlciBJRC4gT3B0aW9uYWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXBwaWRGaWVsZF0gLSBUaGUgZmllbGQgaW4gdGhlIGludHJvc3BlY3Rpb24gcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgYXBwIElELiBPcHRpb25hbC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zLmFwcElkc10gLSBMaXN0IG9mIGFsbG93ZWQgYXBwIElEcy4gUmVxdWlyZWQgaWYgYGFwcGlkRmllbGRgIGlzIGRlZmluZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXV0aG9yaXphdGlvbkhlYWRlcl0gLSBUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgdmFsdWUgZm9yIHRoZSBpbnRyb3NwZWN0aW9uIHJlcXVlc3QuIE9wdGlvbmFsLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogIyMgUGFyc2UgU2VydmVyIENvbmZpZ3VyYXRpb25cbiAqIFRvIGNvbmZpZ3VyZSBQYXJzZSBTZXJ2ZXIgZm9yIE9BdXRoMiBUb2tlbiBJbnRyb3NwZWN0aW9uLCB1c2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYXV0aFwiOiB7XG4gKiAgICAgXCJvYXV0aDJQcm92aWRlclwiOiB7XG4gKiAgICAgICBcInRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsXCI6IFwiaHR0cHM6Ly9wcm92aWRlci5jb20vaW50cm9zcGVjdFwiLFxuICogICAgICAgXCJ1c2VyaWRGaWVsZFwiOiBcInN1YlwiLFxuICogICAgICAgXCJhcHBpZEZpZWxkXCI6IFwiYXVkXCIsXG4gKiAgICAgICBcImFwcElkc1wiOiBbXCJteS1hcHAtaWRcIl0sXG4gKiAgICAgICBcImF1dGhvcml6YXRpb25IZWFkZXJcIjogXCJCYXNpYyBkWE5sY201aGJXVTZjR0Z6YzNkdmNtUT1cIixcbiAqICAgICAgIFwib2F1dGgyXCI6IHRydWVcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoZSBhZGFwdGVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgYGF1dGhEYXRhYCBmaWVsZHM6XG4gKiAtIGBpZGA6IFRoZSB1c2VyIElEIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQuXG4gKiAtIGBhY2Nlc3NfdG9rZW5gOiBUaGUgYWNjZXNzIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQuXG4gKlxuICogIyMgQXV0aCBQYXlsb2FkXG4gKiAjIyMgRXhhbXBsZSBBdXRoIFBheWxvYWRcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJvYXV0aDJcIjoge1xuICogICAgIFwiaWRcIjogXCJ1c2VyLWlkXCIsXG4gKiAgICAgXCJhY2Nlc3NfdG9rZW5cIjogXCJhY2Nlc3MtdG9rZW5cIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBOb3Rlc1xuICogLSBgdG9rZW5JbnRyb3NwZWN0aW9uRW5kcG9pbnRVcmxgIGlzIG1hbmRhdG9yeSBhbmQgc2hvdWxkIHBvaW50IHRvIGEgdmFsaWQgT0F1dGgyIHByb3ZpZGVyJ3MgaW50cm9zcGVjdGlvbiBlbmRwb2ludC5cbiAqIC0gSWYgYGFwcGlkRmllbGRgIGlzIGRlZmluZWQsIGBhcHBJZHNgIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQgdG8gdmFsaWRhdGUgdGhlIGFwcCBJRCBpbiB0aGUgaW50cm9zcGVjdGlvbiByZXNwb25zZS5cbiAqIC0gYGF1dGhvcml6YXRpb25IZWFkZXJgIGNhbiBiZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgdG9rZW4gaW50cm9zcGVjdGlvbiBlbmRwb2ludC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzc2NjIgT0F1dGggMi4wIFRva2VuIEludHJvc3BlY3Rpb24gU3BlY2lmaWNhdGlvbn1cbiAqL1xuXG5cbmltcG9ydCBBdXRoQWRhcHRlciBmcm9tICcuL0F1dGhBZGFwdGVyJztcblxuY2xhc3MgT0F1dGgyQWRhcHRlciBleHRlbmRzIEF1dGhBZGFwdGVyIHtcbiAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBzdXBlci52YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBpZiAoIW9wdGlvbnMudG9rZW5JbnRyb3NwZWN0aW9uRW5kcG9pbnRVcmwpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT0F1dGgyIHRva2VuIGludHJvc3BlY3Rpb24gZW5kcG9pbnQgVVJMIGlzIG1pc3NpbmcuJyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmFwcGlkRmllbGQgJiYgIW9wdGlvbnMuYXBwSWRzPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT0F1dGgyIGNvbmZpZ3VyYXRpb24gaXMgbWlzc2luZyBhcHAgSURzLicpO1xuICAgIH1cblxuICAgIHRoaXMudG9rZW5JbnRyb3NwZWN0aW9uRW5kcG9pbnRVcmwgPSBvcHRpb25zLnRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsO1xuICAgIHRoaXMudXNlcmlkRmllbGQgPSBvcHRpb25zLnVzZXJpZEZpZWxkO1xuICAgIHRoaXMuYXBwaWRGaWVsZCA9IG9wdGlvbnMuYXBwaWRGaWVsZDtcbiAgICB0aGlzLmFwcElkcyA9IG9wdGlvbnMuYXBwSWRzO1xuICAgIHRoaXMuYXV0aG9yaXphdGlvbkhlYWRlciA9IG9wdGlvbnMuYXV0aG9yaXphdGlvbkhlYWRlcjtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQXBwSWQoYXV0aERhdGEpIHtcbiAgICBpZiAoIXRoaXMuYXBwaWRGaWVsZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0VG9rZW5JbmZvKGF1dGhEYXRhLmFjY2Vzc190b2tlbik7XG5cbiAgICBjb25zdCBhcHBJZEZpZWxkVmFsdWUgPSByZXNwb25zZVt0aGlzLmFwcGlkRmllbGRdO1xuICAgIGNvbnN0IGlzVmFsaWRBcHBJZCA9IEFycmF5LmlzQXJyYXkoYXBwSWRGaWVsZFZhbHVlKVxuICAgICAgPyBhcHBJZEZpZWxkVmFsdWUuc29tZShhcHBJZCA9PiB0aGlzLmFwcElkcy5pbmNsdWRlcyhhcHBJZCkpXG4gICAgICA6IHRoaXMuYXBwSWRzLmluY2x1ZGVzKGFwcElkRmllbGRWYWx1ZSk7XG5cbiAgICBpZiAoIWlzVmFsaWRBcHBJZCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPQXV0aDI6IEludmFsaWQgYXBwIElELicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdFRva2VuSW5mbyhhdXRoRGF0YS5hY2Nlc3NfdG9rZW4pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5hY3RpdmUgfHwgKHRoaXMudXNlcmlkRmllbGQgJiYgYXV0aERhdGEuaWQgIT09IHJlc3BvbnNlW3RoaXMudXNlcmlkRmllbGRdKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPQXV0aDIgYWNjZXNzIHRva2VuIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyByZXF1ZXN0VG9rZW5JbmZvKGFjY2Vzc1Rva2VuKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLnRva2VuSW50cm9zcGVjdGlvbkVuZHBvaW50VXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAuLi4odGhpcy5hdXRob3JpemF0aW9uSGVhZGVyICYmIHsgQXV0aG9yaXphdGlvbjogdGhpcy5hdXRob3JpemF0aW9uSGVhZGVyIH0pXG4gICAgICB9LFxuICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHRva2VuOiBhY2Nlc3NUb2tlbiB9KVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPQXV0aDIgdG9rZW4gaW50cm9zcGVjdGlvbiByZXF1ZXN0IGZhaWxlZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBPQXV0aDJBZGFwdGVyKCk7XG5cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBc0RBLElBQUFBLFlBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUF3QyxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQXREeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBS0EsTUFBTUcsYUFBYSxTQUFTQyxvQkFBVyxDQUFDO0VBQ3RDQyxlQUFlQSxDQUFDQyxPQUFPLEVBQUU7SUFDdkIsS0FBSyxDQUFDRCxlQUFlLENBQUNDLE9BQU8sQ0FBQztJQUU5QixJQUFJLENBQUNBLE9BQU8sQ0FBQ0MsNkJBQTZCLEVBQUU7TUFDMUMsTUFBTSxJQUFJQyxLQUFLLENBQUNDLEtBQUssQ0FBQ0QsS0FBSyxDQUFDQyxLQUFLLENBQUNDLGdCQUFnQixFQUFFLHFEQUFxRCxDQUFDO0lBQzVHO0lBQ0EsSUFBSUosT0FBTyxDQUFDSyxVQUFVLElBQUksQ0FBQ0wsT0FBTyxDQUFDTSxNQUFNLEVBQUVDLE1BQU0sRUFBRTtNQUNqRCxNQUFNLElBQUlMLEtBQUssQ0FBQ0MsS0FBSyxDQUFDRCxLQUFLLENBQUNDLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQUUsMENBQTBDLENBQUM7SUFDakc7SUFFQSxJQUFJLENBQUNILDZCQUE2QixHQUFHRCxPQUFPLENBQUNDLDZCQUE2QjtJQUMxRSxJQUFJLENBQUNPLFdBQVcsR0FBR1IsT0FBTyxDQUFDUSxXQUFXO0lBQ3RDLElBQUksQ0FBQ0gsVUFBVSxHQUFHTCxPQUFPLENBQUNLLFVBQVU7SUFDcEMsSUFBSSxDQUFDQyxNQUFNLEdBQUdOLE9BQU8sQ0FBQ00sTUFBTTtJQUM1QixJQUFJLENBQUNHLG1CQUFtQixHQUFHVCxPQUFPLENBQUNTLG1CQUFtQjtFQUN4RDtFQUVBLE1BQU1DLGFBQWFBLENBQUNDLFFBQVEsRUFBRTtJQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDTixVQUFVLEVBQUU7TUFDcEI7SUFDRjtJQUVBLE1BQU1PLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUNGLFFBQVEsQ0FBQ0csWUFBWSxDQUFDO0lBRW5FLE1BQU1DLGVBQWUsR0FBR0gsUUFBUSxDQUFDLElBQUksQ0FBQ1AsVUFBVSxDQUFDO0lBQ2pELE1BQU1XLFlBQVksR0FBR0MsS0FBSyxDQUFDQyxPQUFPLENBQUNILGVBQWUsQ0FBQyxHQUMvQ0EsZUFBZSxDQUFDSSxJQUFJLENBQUNDLEtBQUssSUFBSSxJQUFJLENBQUNkLE1BQU0sQ0FBQ2UsUUFBUSxDQUFDRCxLQUFLLENBQUMsQ0FBQyxHQUMxRCxJQUFJLENBQUNkLE1BQU0sQ0FBQ2UsUUFBUSxDQUFDTixlQUFlLENBQUM7SUFFekMsSUFBSSxDQUFDQyxZQUFZLEVBQUU7TUFDakIsTUFBTSxJQUFJZCxLQUFLLENBQUNDLEtBQUssQ0FBQ0QsS0FBSyxDQUFDQyxLQUFLLENBQUNDLGdCQUFnQixFQUFFLHlCQUF5QixDQUFDO0lBQ2hGO0VBQ0Y7RUFFQSxNQUFNa0IsZ0JBQWdCQSxDQUFDWCxRQUFRLEVBQUU7SUFDL0IsTUFBTUMsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ0YsUUFBUSxDQUFDRyxZQUFZLENBQUM7SUFFbkUsSUFBSSxDQUFDRixRQUFRLENBQUNXLE1BQU0sSUFBSyxJQUFJLENBQUNmLFdBQVcsSUFBSUcsUUFBUSxDQUFDYSxFQUFFLEtBQUtaLFFBQVEsQ0FBQyxJQUFJLENBQUNKLFdBQVcsQ0FBRSxFQUFFO01BQ3hGLE1BQU0sSUFBSU4sS0FBSyxDQUFDQyxLQUFLLENBQUNELEtBQUssQ0FBQ0MsS0FBSyxDQUFDQyxnQkFBZ0IsRUFBRSwrQ0FBK0MsQ0FBQztJQUN0RztJQUVBLE9BQU8sQ0FBQyxDQUFDO0VBQ1g7RUFFQSxNQUFNUyxnQkFBZ0JBLENBQUNZLFdBQVcsRUFBRTtJQUNsQyxNQUFNYixRQUFRLEdBQUcsTUFBTWMsS0FBSyxDQUFDLElBQUksQ0FBQ3pCLDZCQUE2QixFQUFFO01BQy9EMEIsTUFBTSxFQUFFLE1BQU07TUFDZEMsT0FBTyxFQUFFO1FBQ1AsY0FBYyxFQUFFLG1DQUFtQztRQUNuRCxJQUFJLElBQUksQ0FBQ25CLG1CQUFtQixJQUFJO1VBQUVvQixhQUFhLEVBQUUsSUFBSSxDQUFDcEI7UUFBb0IsQ0FBQztNQUM3RSxDQUFDO01BQ0RxQixJQUFJLEVBQUUsSUFBSUMsZUFBZSxDQUFDO1FBQUVDLEtBQUssRUFBRVA7TUFBWSxDQUFDO0lBQ2xELENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQ2IsUUFBUSxDQUFDcUIsRUFBRSxFQUFFO01BQ2hCLE1BQU0sSUFBSS9CLEtBQUssQ0FBQ0MsS0FBSyxDQUFDRCxLQUFLLENBQUNDLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQUUsNENBQTRDLENBQUM7SUFDbkc7SUFFQSxPQUFPUSxRQUFRLENBQUNzQixJQUFJLENBQUMsQ0FBQztFQUN4QjtBQUNGO0FBQUMsSUFBQUMsUUFBQSxHQUFBQyxPQUFBLENBQUF4QyxPQUFBLEdBRWMsSUFBSUMsYUFBYSxDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -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==
|
package/lib/Adapters/Auth/qq.js
CHANGED
|
@@ -1,54 +1,113 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|