parse-server 8.0.1-alpha.2 → 8.0.2-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/lib/Adapters/Auth/AuthAdapter.js +16 -9
  2. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
  3. package/lib/Adapters/Auth/apple.js +45 -1
  4. package/lib/Adapters/Auth/facebook.js +61 -1
  5. package/lib/Adapters/Auth/gcenter.js +201 -157
  6. package/lib/Adapters/Auth/github.js +119 -31
  7. package/lib/Adapters/Auth/google.js +45 -1
  8. package/lib/Adapters/Auth/gpgames.js +120 -27
  9. package/lib/Adapters/Auth/index.js +33 -33
  10. package/lib/Adapters/Auth/instagram.js +114 -24
  11. package/lib/Adapters/Auth/janraincapture.js +45 -1
  12. package/lib/Adapters/Auth/janrainengage.js +11 -2
  13. package/lib/Adapters/Auth/keycloak.js +68 -35
  14. package/lib/Adapters/Auth/ldap.js +75 -1
  15. package/lib/Adapters/Auth/line.js +119 -32
  16. package/lib/Adapters/Auth/linkedin.js +111 -35
  17. package/lib/Adapters/Auth/meetup.js +16 -8
  18. package/lib/Adapters/Auth/mfa.js +80 -2
  19. package/lib/Adapters/Auth/microsoft.js +105 -30
  20. package/lib/Adapters/Auth/oauth2.js +96 -109
  21. package/lib/Adapters/Auth/phantauth.js +16 -8
  22. package/lib/Adapters/Auth/qq.js +107 -36
  23. package/lib/Adapters/Auth/spotify.js +108 -39
  24. package/lib/Adapters/Auth/twitter.js +187 -40
  25. package/lib/Adapters/Auth/vkontakte.js +20 -13
  26. package/lib/Adapters/Auth/wechat.js +105 -25
  27. package/lib/Adapters/Auth/weibo.js +135 -37
  28. package/lib/Auth.js +26 -17
  29. package/lib/Config.js +14 -1
  30. package/lib/Deprecator/Deprecations.js +5 -2
  31. package/lib/Options/Definitions.js +7 -1
  32. package/lib/Options/docs.js +2 -1
  33. package/lib/Options/index.js +1 -1
  34. package/lib/RestWrite.js +4 -5
  35. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +10 -1
  36. package/lib/cli/parse-server.js +1 -1
  37. package/package.json +7 -7
@@ -1,38 +1,125 @@
1
1
  "use strict";
2
2
 
3
- // Helper functions for accessing the line API.
4
- var Parse = require('parse/node').Parse;
5
- const httpsRequest = require('./httpsRequest');
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 Line.
11
+ *
12
+ * @class LineAdapter
13
+ * @param {Object} options - The adapter configuration options.
14
+ * @param {string} options.clientId - Your Line App Client ID. Required for secure authentication.
15
+ * @param {string} options.clientSecret - Your Line App Client 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 Line authentication, use the following structure:
21
+ * ### Secure Configuration
22
+ * ```json
23
+ * {
24
+ * "auth": {
25
+ * "line": {
26
+ * "clientId": "your-client-id",
27
+ * "clientSecret": "your-client-secret"
28
+ * }
29
+ * }
30
+ * }
31
+ * ```
32
+ * ### Insecure Configuration (Not Recommended)
33
+ * ```json
34
+ * {
35
+ * "auth": {
36
+ * "line": {
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
+ * "line": {
52
+ * "code": "xxxxxxxxx",
53
+ * "redirect_uri": "https://example.com/callback"
54
+ * }
55
+ * }
56
+ * ```
57
+ *
58
+ * ### Insecure Authentication Payload (Not Recommended)
59
+ * ```json
60
+ * {
61
+ * "line": {
62
+ * "id": "1234567",
63
+ * "access_token": "xxxxxxxxx"
64
+ * }
65
+ * }
66
+ * ```
67
+ *
68
+ * ## Notes
69
+ * - `enableInsecureAuth` is **not recommended** and will be removed in future versions. Use secure authentication with `clientId` and `clientSecret`.
70
+ * - Secure authentication exchanges the `code` and `redirect_uri` provided by the client for an access token using Line's OAuth flow.
71
+ *
72
+ * @see {@link https://developers.line.biz/en/docs/line-login/integrate-line-login/ Line Login Documentation}
73
+ */
6
74
 
7
- // Returns a promise that fulfills if this user id is valid.
8
- function validateAuthData(authData) {
9
- return request('profile', authData.access_token).then(response => {
10
- if (response && response.userId && response.userId === authData.id) {
11
- return;
75
+ class LineAdapter extends _BaseCodeAuthAdapter.default {
76
+ constructor() {
77
+ super('Line');
78
+ }
79
+ async getAccessTokenFromCode(authData) {
80
+ if (!authData.code) {
81
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Line auth is invalid for this user.');
12
82
  }
13
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Line auth is invalid for this user.');
14
- });
15
- }
16
-
17
- // Returns a promise that fulfills iff this app id is valid.
18
- function validateAppId() {
19
- return Promise.resolve();
20
- }
21
-
22
- // A promisey wrapper for api requests
23
- function request(path, access_token) {
24
- var options = {
25
- host: 'api.line.me',
26
- path: '/v2/' + path,
27
- method: 'GET',
28
- headers: {
29
- Authorization: 'Bearer ' + access_token
83
+ const tokenUrl = 'https://api.line.me/oauth2/v2.1/token';
84
+ const response = await fetch(tokenUrl, {
85
+ method: 'POST',
86
+ headers: {
87
+ 'Content-Type': 'application/x-www-form-urlencoded'
88
+ },
89
+ body: new URLSearchParams({
90
+ client_id: this.clientId,
91
+ client_secret: this.clientSecret,
92
+ grant_type: 'authorization_code',
93
+ redirect_uri: authData.redirect_uri,
94
+ code: authData.code
95
+ })
96
+ });
97
+ if (!response.ok) {
98
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Failed to exchange code for token: ${response.statusText}`);
99
+ }
100
+ const data = await response.json();
101
+ if (data.error) {
102
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, data.error_description || data.error);
103
+ }
104
+ return data.access_token;
105
+ }
106
+ async getUserFromAccessToken(accessToken) {
107
+ const userApiUrl = 'https://api.line.me/v2/profile';
108
+ const response = await fetch(userApiUrl, {
109
+ method: 'GET',
110
+ headers: {
111
+ Authorization: `Bearer ${accessToken}`
112
+ }
113
+ });
114
+ if (!response.ok) {
115
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Failed to fetch Line user: ${response.statusText}`);
116
+ }
117
+ const userData = await response.json();
118
+ if (!userData?.userId) {
119
+ throw new Parse.Error(Parse.Error.VALIDATION_ERROR, 'Invalid Line user data received.');
30
120
  }
31
- };
32
- return httpsRequest.get(options);
121
+ return userData;
122
+ }
33
123
  }
34
- module.exports = {
35
- validateAppId: validateAppId,
36
- validateAuthData: validateAuthData
37
- };
38
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwc1JlcXVlc3QiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJyZXF1ZXN0IiwiYWNjZXNzX3Rva2VuIiwidGhlbiIsInJlc3BvbnNlIiwidXNlcklkIiwiaWQiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ2YWxpZGF0ZUFwcElkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJwYXRoIiwib3B0aW9ucyIsImhvc3QiLCJtZXRob2QiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImdldCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9saW5lLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgbGluZSBBUEkuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5jb25zdCBodHRwc1JlcXVlc3QgPSByZXF1aXJlKCcuL2h0dHBzUmVxdWVzdCcpO1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgcmV0dXJuIHJlcXVlc3QoJ3Byb2ZpbGUnLCBhdXRoRGF0YS5hY2Nlc3NfdG9rZW4pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS51c2VySWQgJiYgcmVzcG9uc2UudXNlcklkID09PSBhdXRoRGF0YS5pZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0xpbmUgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gIH0pO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmZiB0aGlzIGFwcCBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXBwSWQoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxuLy8gQSBwcm9taXNleSB3cmFwcGVyIGZvciBhcGkgcmVxdWVzdHNcbmZ1bmN0aW9uIHJlcXVlc3QocGF0aCwgYWNjZXNzX3Rva2VuKSB7XG4gIHZhciBvcHRpb25zID0ge1xuICAgIGhvc3Q6ICdhcGkubGluZS5tZScsXG4gICAgcGF0aDogJy92Mi8nICsgcGF0aCxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIEF1dGhvcml6YXRpb246ICdCZWFyZXIgJyArIGFjY2Vzc190b2tlbixcbiAgICB9LFxuICB9O1xuICByZXR1cm4gaHR0cHNSZXF1ZXN0LmdldChvcHRpb25zKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHZhbGlkYXRlQXBwSWQ6IHZhbGlkYXRlQXBwSWQsXG4gIHZhbGlkYXRlQXV0aERhdGE6IHZhbGlkYXRlQXV0aERhdGEsXG59O1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0EsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUNELEtBQUs7QUFDdkMsTUFBTUUsWUFBWSxHQUFHRCxPQUFPLENBQUMsZ0JBQWdCLENBQUM7O0FBRTlDO0FBQ0EsU0FBU0UsZ0JBQWdCQSxDQUFDQyxRQUFRLEVBQUU7RUFDbEMsT0FBT0MsT0FBTyxDQUFDLFNBQVMsRUFBRUQsUUFBUSxDQUFDRSxZQUFZLENBQUMsQ0FBQ0MsSUFBSSxDQUFDQyxRQUFRLElBQUk7SUFDaEUsSUFBSUEsUUFBUSxJQUFJQSxRQUFRLENBQUNDLE1BQU0sSUFBSUQsUUFBUSxDQUFDQyxNQUFNLEtBQUtMLFFBQVEsQ0FBQ00sRUFBRSxFQUFFO01BQ2xFO0lBQ0Y7SUFDQSxNQUFNLElBQUlWLEtBQUssQ0FBQ1csS0FBSyxDQUFDWCxLQUFLLENBQUNXLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQUUscUNBQXFDLENBQUM7RUFDNUYsQ0FBQyxDQUFDO0FBQ0o7O0FBRUE7QUFDQSxTQUFTQyxhQUFhQSxDQUFBLEVBQUc7RUFDdkIsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQztBQUMxQjs7QUFFQTtBQUNBLFNBQVNWLE9BQU9BLENBQUNXLElBQUksRUFBRVYsWUFBWSxFQUFFO0VBQ25DLElBQUlXLE9BQU8sR0FBRztJQUNaQyxJQUFJLEVBQUUsYUFBYTtJQUNuQkYsSUFBSSxFQUFFLE1BQU0sR0FBR0EsSUFBSTtJQUNuQkcsTUFBTSxFQUFFLEtBQUs7SUFDYkMsT0FBTyxFQUFFO01BQ1BDLGFBQWEsRUFBRSxTQUFTLEdBQUdmO0lBQzdCO0VBQ0YsQ0FBQztFQUNELE9BQU9KLFlBQVksQ0FBQ29CLEdBQUcsQ0FBQ0wsT0FBTyxDQUFDO0FBQ2xDO0FBRUFNLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHO0VBQ2ZYLGFBQWEsRUFBRUEsYUFBYTtFQUM1QlYsZ0JBQWdCLEVBQUVBO0FBQ3BCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
124
+ var _default = exports.default = new LineAdapter();
125
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmFzZUNvZGVBdXRoQWRhcHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTGluZUFkYXB0ZXIiLCJCYXNlQ29kZUF1dGhBZGFwdGVyIiwiY29uc3RydWN0b3IiLCJnZXRBY2Nlc3NUb2tlbkZyb21Db2RlIiwiYXV0aERhdGEiLCJjb2RlIiwiUGFyc2UiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ0b2tlblVybCIsInJlc3BvbnNlIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIlVSTFNlYXJjaFBhcmFtcyIsImNsaWVudF9pZCIsImNsaWVudElkIiwiY2xpZW50X3NlY3JldCIsImNsaWVudFNlY3JldCIsImdyYW50X3R5cGUiLCJyZWRpcmVjdF91cmkiLCJvayIsInN0YXR1c1RleHQiLCJkYXRhIiwianNvbiIsImVycm9yIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJhY2Nlc3NfdG9rZW4iLCJnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuIiwiYWNjZXNzVG9rZW4iLCJ1c2VyQXBpVXJsIiwiQXV0aG9yaXphdGlvbiIsInVzZXJEYXRhIiwidXNlcklkIiwiVkFMSURBVElPTl9FUlJPUiIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2xpbmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXJzZSBTZXJ2ZXIgYXV0aGVudGljYXRpb24gYWRhcHRlciBmb3IgTGluZS5cbiAqXG4gKiBAY2xhc3MgTGluZUFkYXB0ZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIGFkYXB0ZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuY2xpZW50SWQgLSBZb3VyIExpbmUgQXBwIENsaWVudCBJRC4gUmVxdWlyZWQgZm9yIHNlY3VyZSBhdXRoZW50aWNhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmNsaWVudFNlY3JldCAtIFlvdXIgTGluZSBBcHAgQ2xpZW50IFNlY3JldC4gUmVxdWlyZWQgZm9yIHNlY3VyZSBhdXRoZW50aWNhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZW5hYmxlSW5zZWN1cmVBdXRoPWZhbHNlXSAtICoqW0RFUFJFQ0FURURdKiogRW5hYmxlIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uIChub3QgcmVjb21tZW5kZWQpLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogIyMgUGFyc2UgU2VydmVyIENvbmZpZ3VyYXRpb25cbiAqIFRvIGNvbmZpZ3VyZSBQYXJzZSBTZXJ2ZXIgZm9yIExpbmUgYXV0aGVudGljYXRpb24sIHVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqICMjIyBTZWN1cmUgQ29uZmlndXJhdGlvblxuICogYGBganNvblxuICoge1xuICogICBcImF1dGhcIjoge1xuICogICAgIFwibGluZVwiOiB7XG4gKiAgICAgICBcImNsaWVudElkXCI6IFwieW91ci1jbGllbnQtaWRcIixcbiAqICAgICAgIFwiY2xpZW50U2VjcmV0XCI6IFwieW91ci1jbGllbnQtc2VjcmV0XCJcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogIyMjIEluc2VjdXJlIENvbmZpZ3VyYXRpb24gKE5vdCBSZWNvbW1lbmRlZClcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJhdXRoXCI6IHtcbiAqICAgICBcImxpbmVcIjoge1xuICogICAgICAgXCJlbmFibGVJbnNlY3VyZUF1dGhcIjogdHJ1ZVxuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhlIGFkYXB0ZXIgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBgYXV0aERhdGFgIGZpZWxkczpcbiAqIC0gKipTZWN1cmUgQXV0aGVudGljYXRpb24qKjogYGNvZGVgLCBgcmVkaXJlY3RfdXJpYC5cbiAqIC0gKipJbnNlY3VyZSBBdXRoZW50aWNhdGlvbiAoTm90IFJlY29tbWVuZGVkKSoqOiBgaWRgLCBgYWNjZXNzX3Rva2VuYC5cbiAqXG4gKiAjIyBBdXRoIFBheWxvYWRzXG4gKiAjIyMgU2VjdXJlIEF1dGhlbnRpY2F0aW9uIFBheWxvYWRcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJsaW5lXCI6IHtcbiAqICAgICBcImNvZGVcIjogXCJ4eHh4eHh4eHhcIixcbiAqICAgICBcInJlZGlyZWN0X3VyaVwiOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2FsbGJhY2tcIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgSW5zZWN1cmUgQXV0aGVudGljYXRpb24gUGF5bG9hZCAoTm90IFJlY29tbWVuZGVkKVxuICogYGBganNvblxuICoge1xuICogICBcImxpbmVcIjoge1xuICogICAgIFwiaWRcIjogXCIxMjM0NTY3XCIsXG4gKiAgICAgXCJhY2Nlc3NfdG9rZW5cIjogXCJ4eHh4eHh4eHhcIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBOb3Rlc1xuICogLSBgZW5hYmxlSW5zZWN1cmVBdXRoYCBpcyAqKm5vdCByZWNvbW1lbmRlZCoqIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiBVc2Ugc2VjdXJlIGF1dGhlbnRpY2F0aW9uIHdpdGggYGNsaWVudElkYCBhbmQgYGNsaWVudFNlY3JldGAuXG4gKiAtIFNlY3VyZSBhdXRoZW50aWNhdGlvbiBleGNoYW5nZXMgdGhlIGBjb2RlYCBhbmQgYHJlZGlyZWN0X3VyaWAgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3IgYW4gYWNjZXNzIHRva2VuIHVzaW5nIExpbmUncyBPQXV0aCBmbG93LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVycy5saW5lLmJpei9lbi9kb2NzL2xpbmUtbG9naW4vaW50ZWdyYXRlLWxpbmUtbG9naW4vIExpbmUgTG9naW4gRG9jdW1lbnRhdGlvbn1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvZGVBdXRoQWRhcHRlciBmcm9tICcuL0Jhc2VDb2RlQXV0aEFkYXB0ZXInO1xuXG5jbGFzcyBMaW5lQWRhcHRlciBleHRlbmRzIEJhc2VDb2RlQXV0aEFkYXB0ZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignTGluZScpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZShhdXRoRGF0YSkge1xuICAgIGlmICghYXV0aERhdGEuY29kZSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICAnTGluZSBhdXRoIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuVXJsID0gJ2h0dHBzOi8vYXBpLmxpbmUubWUvb2F1dGgyL3YyLjEvdG9rZW4nO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godG9rZW5VcmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICB9LFxuICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnLFxuICAgICAgICByZWRpcmVjdF91cmk6IGF1dGhEYXRhLnJlZGlyZWN0X3VyaSxcbiAgICAgICAgY29kZTogYXV0aERhdGEuY29kZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICBgRmFpbGVkIHRvIGV4Y2hhbmdlIGNvZGUgZm9yIHRva2VuOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAgIGRhdGEuZXJyb3JfZGVzY3JpcHRpb24gfHwgZGF0YS5lcnJvclxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YS5hY2Nlc3NfdG9rZW47XG4gIH1cblxuICBhc3luYyBnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSB7XG4gICAgY29uc3QgdXNlckFwaVVybCA9ICdodHRwczovL2FwaS5saW5lLm1lL3YyL3Byb2ZpbGUnO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXNlckFwaVVybCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIExpbmUgdXNlcjogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKCF1c2VyRGF0YT8udXNlcklkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICdJbnZhbGlkIExpbmUgdXNlciBkYXRhIHJlY2VpdmVkLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXJEYXRhO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBMaW5lQWRhcHRlcigpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFrRUEsSUFBQUEsb0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUF3RCxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQWxFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQSxNQUFNRyxXQUFXLFNBQVNDLDRCQUFtQixDQUFDO0VBQzVDQyxXQUFXQSxDQUFBLEVBQUc7SUFDWixLQUFLLENBQUMsTUFBTSxDQUFDO0VBQ2Y7RUFFQSxNQUFNQyxzQkFBc0JBLENBQUNDLFFBQVEsRUFBRTtJQUNyQyxJQUFJLENBQUNBLFFBQVEsQ0FBQ0MsSUFBSSxFQUFFO01BQ2xCLE1BQU0sSUFBSUMsS0FBSyxDQUFDQyxLQUFLLENBQ25CRCxLQUFLLENBQUNDLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQzVCLHFDQUNGLENBQUM7SUFDSDtJQUVBLE1BQU1DLFFBQVEsR0FBRyx1Q0FBdUM7SUFDeEQsTUFBTUMsUUFBUSxHQUFHLE1BQU1DLEtBQUssQ0FBQ0YsUUFBUSxFQUFFO01BQ3JDRyxNQUFNLEVBQUUsTUFBTTtNQUNkQyxPQUFPLEVBQUU7UUFDUCxjQUFjLEVBQUU7TUFDbEIsQ0FBQztNQUNEQyxJQUFJLEVBQUUsSUFBSUMsZUFBZSxDQUFDO1FBQ3hCQyxTQUFTLEVBQUUsSUFBSSxDQUFDQyxRQUFRO1FBQ3hCQyxhQUFhLEVBQUUsSUFBSSxDQUFDQyxZQUFZO1FBQ2hDQyxVQUFVLEVBQUUsb0JBQW9CO1FBQ2hDQyxZQUFZLEVBQUVqQixRQUFRLENBQUNpQixZQUFZO1FBQ25DaEIsSUFBSSxFQUFFRCxRQUFRLENBQUNDO01BQ2pCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUNLLFFBQVEsQ0FBQ1ksRUFBRSxFQUFFO01BQ2hCLE1BQU0sSUFBSWhCLEtBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsS0FBSyxDQUFDQyxLQUFLLENBQUNDLGdCQUFnQixFQUM1QixzQ0FBc0NFLFFBQVEsQ0FBQ2EsVUFBVSxFQUMzRCxDQUFDO0lBQ0g7SUFFQSxNQUFNQyxJQUFJLEdBQUcsTUFBTWQsUUFBUSxDQUFDZSxJQUFJLENBQUMsQ0FBQztJQUNsQyxJQUFJRCxJQUFJLENBQUNFLEtBQUssRUFBRTtNQUNkLE1BQU0sSUFBSXBCLEtBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsS0FBSyxDQUFDQyxLQUFLLENBQUNDLGdCQUFnQixFQUM1QmdCLElBQUksQ0FBQ0csaUJBQWlCLElBQUlILElBQUksQ0FBQ0UsS0FDakMsQ0FBQztJQUNIO0lBRUEsT0FBT0YsSUFBSSxDQUFDSSxZQUFZO0VBQzFCO0VBRUEsTUFBTUMsc0JBQXNCQSxDQUFDQyxXQUFXLEVBQUU7SUFDeEMsTUFBTUMsVUFBVSxHQUFHLGdDQUFnQztJQUNuRCxNQUFNckIsUUFBUSxHQUFHLE1BQU1DLEtBQUssQ0FBQ29CLFVBQVUsRUFBRTtNQUN2Q25CLE1BQU0sRUFBRSxLQUFLO01BQ2JDLE9BQU8sRUFBRTtRQUNQbUIsYUFBYSxFQUFFLFVBQVVGLFdBQVc7TUFDdEM7SUFDRixDQUFDLENBQUM7SUFFRixJQUFJLENBQUNwQixRQUFRLENBQUNZLEVBQUUsRUFBRTtNQUNoQixNQUFNLElBQUloQixLQUFLLENBQUNDLEtBQUssQ0FDbkJELEtBQUssQ0FBQ0MsS0FBSyxDQUFDQyxnQkFBZ0IsRUFDNUIsOEJBQThCRSxRQUFRLENBQUNhLFVBQVUsRUFDbkQsQ0FBQztJQUNIO0lBRUEsTUFBTVUsUUFBUSxHQUFHLE1BQU12QixRQUFRLENBQUNlLElBQUksQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQ1EsUUFBUSxFQUFFQyxNQUFNLEVBQUU7TUFDckIsTUFBTSxJQUFJNUIsS0FBSyxDQUFDQyxLQUFLLENBQ25CRCxLQUFLLENBQUNDLEtBQUssQ0FBQzRCLGdCQUFnQixFQUM1QixrQ0FDRixDQUFDO0lBQ0g7SUFFQSxPQUFPRixRQUFRO0VBQ2pCO0FBQ0Y7QUFBQyxJQUFBRyxRQUFBLEdBQUFDLE9BQUEsQ0FBQXRDLE9BQUEsR0FFYyxJQUFJQyxXQUFXLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,41 +1,117 @@
1
1
  "use strict";
2
2
 
3
- // Helper functions for accessing the linkedin API.
4
- var Parse = require('parse/node').Parse;
5
- const httpsRequest = require('./httpsRequest');
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 LinkedIn.
11
+ *
12
+ * @class LinkedInAdapter
13
+ * @param {Object} options - The adapter configuration options.
14
+ * @param {string} options.clientId - Your LinkedIn App Client ID. Required for secure authentication.
15
+ * @param {string} options.clientSecret - Your LinkedIn App Client 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 LinkedIn authentication, use the following structure:
21
+ * ### Secure Configuration
22
+ * ```json
23
+ * {
24
+ * "auth": {
25
+ * "linkedin": {
26
+ * "clientId": "your-client-id",
27
+ * "clientSecret": "your-client-secret"
28
+ * }
29
+ * }
30
+ * }
31
+ * ```
32
+ * ### Insecure Configuration (Not Recommended)
33
+ * ```json
34
+ * {
35
+ * "auth": {
36
+ * "linkedin": {
37
+ * "enableInsecureAuth": true
38
+ * }
39
+ * }
40
+ * }
41
+ * ```
42
+ *
43
+ * The adapter requires the following `authData` fields:
44
+ * - **Secure Authentication**: `code`, `redirect_uri`, and optionally `is_mobile_sdk`.
45
+ * - **Insecure Authentication (Not Recommended)**: `id`, `access_token`, and optionally `is_mobile_sdk`.
46
+ *
47
+ * ## Auth Payloads
48
+ * ### Secure Authentication Payload
49
+ * ```json
50
+ * {
51
+ * "linkedin": {
52
+ * "code": "lmn789opq012rst345uvw",
53
+ * "redirect_uri": "https://your-redirect-uri.com/callback",
54
+ * "is_mobile_sdk": true
55
+ * }
56
+ * }
57
+ * ```
58
+ *
59
+ * ### Insecure Authentication Payload (Not Recommended)
60
+ * ```json
61
+ * {
62
+ * "linkedin": {
63
+ * "id": "7654321",
64
+ * "access_token": "AQXNnd2hIT6z9bHFzZz2Kp1ghiMz_RtyuvwXYZ123abc",
65
+ * "is_mobile_sdk": true
66
+ * }
67
+ * }
68
+ * ```
69
+ *
70
+ * ## Notes
71
+ * - Secure authentication exchanges the `code` and `redirect_uri` provided by the client for an access token using LinkedIn's OAuth API.
72
+ * - Insecure authentication validates the user ID and access token directly, bypassing OAuth flows. This method is **not recommended** and may introduce security vulnerabilities.
73
+ * - `enableInsecureAuth` is **deprecated** and may be removed in future versions.
74
+ *
75
+ * @see {@link https://learn.microsoft.com/en-us/linkedin/shared/authentication/authentication LinkedIn Authentication Documentation}
76
+ */
6
77
 
7
- // Returns a promise that fulfills iff this user id is valid.
8
- function validateAuthData(authData) {
9
- return request('me', authData.access_token, authData.is_mobile_sdk).then(data => {
10
- if (data && data.id == authData.id) {
11
- return;
78
+ class LinkedInAdapter extends _BaseCodeAuthAdapter.default {
79
+ constructor() {
80
+ super('LinkedIn');
81
+ }
82
+ async getUserFromAccessToken(access_token, authData) {
83
+ const response = await fetch('https://api.linkedin.com/v2/me', {
84
+ headers: {
85
+ Authorization: `Bearer ${access_token}`,
86
+ 'x-li-format': 'json',
87
+ 'x-li-src': authData?.is_mobile_sdk ? 'msdk' : undefined
88
+ }
89
+ });
90
+ if (!response.ok) {
91
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'LinkedIn API request failed.');
12
92
  }
13
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Linkedin auth is invalid for this user.');
14
- });
15
- }
16
-
17
- // Returns a promise that fulfills iff this app id is valid.
18
- function validateAppId() {
19
- return Promise.resolve();
20
- }
21
-
22
- // A promisey wrapper for api requests
23
- function request(path, access_token, is_mobile_sdk) {
24
- var headers = {
25
- Authorization: 'Bearer ' + access_token,
26
- 'x-li-format': 'json'
27
- };
28
- if (is_mobile_sdk) {
29
- headers['x-li-src'] = 'msdk';
93
+ return response.json();
94
+ }
95
+ async getAccessTokenFromCode(authData) {
96
+ const response = await fetch('https://www.linkedin.com/oauth/v2/accessToken', {
97
+ method: 'POST',
98
+ headers: {
99
+ 'Content-Type': 'application/x-www-form-urlencoded'
100
+ },
101
+ body: new URLSearchParams({
102
+ grant_type: 'authorization_code',
103
+ code: authData.code,
104
+ redirect_uri: authData.redirect_uri,
105
+ client_id: this.clientId,
106
+ client_secret: this.clientSecret
107
+ })
108
+ });
109
+ if (!response.ok) {
110
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'LinkedIn API request failed.');
111
+ }
112
+ const json = await response.json();
113
+ return json.access_token;
30
114
  }
31
- return httpsRequest.get({
32
- host: 'api.linkedin.com',
33
- path: '/v2/' + path,
34
- headers: headers
35
- });
36
115
  }
37
- module.exports = {
38
- validateAppId: validateAppId,
39
- validateAuthData: validateAuthData
40
- };
41
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwc1JlcXVlc3QiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJyZXF1ZXN0IiwiYWNjZXNzX3Rva2VuIiwiaXNfbW9iaWxlX3NkayIsInRoZW4iLCJkYXRhIiwiaWQiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ2YWxpZGF0ZUFwcElkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJwYXRoIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJnZXQiLCJob3N0IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2xpbmtlZGluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgbGlua2VkaW4gQVBJLlxudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuY29uc3QgaHR0cHNSZXF1ZXN0ID0gcmVxdWlyZSgnLi9odHRwc1JlcXVlc3QnKTtcblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZmYgdGhpcyB1c2VyIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSkge1xuICByZXR1cm4gcmVxdWVzdCgnbWUnLCBhdXRoRGF0YS5hY2Nlc3NfdG9rZW4sIGF1dGhEYXRhLmlzX21vYmlsZV9zZGspLnRoZW4oZGF0YSA9PiB7XG4gICAgaWYgKGRhdGEgJiYgZGF0YS5pZCA9PSBhdXRoRGF0YS5pZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0xpbmtlZGluIGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICB9KTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZmYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbi8vIEEgcHJvbWlzZXkgd3JhcHBlciBmb3IgYXBpIHJlcXVlc3RzXG5mdW5jdGlvbiByZXF1ZXN0KHBhdGgsIGFjY2Vzc190b2tlbiwgaXNfbW9iaWxlX3Nkaykge1xuICB2YXIgaGVhZGVycyA9IHtcbiAgICBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcgKyBhY2Nlc3NfdG9rZW4sXG4gICAgJ3gtbGktZm9ybWF0JzogJ2pzb24nLFxuICB9O1xuXG4gIGlmIChpc19tb2JpbGVfc2RrKSB7XG4gICAgaGVhZGVyc1sneC1saS1zcmMnXSA9ICdtc2RrJztcbiAgfVxuICByZXR1cm4gaHR0cHNSZXF1ZXN0LmdldCh7XG4gICAgaG9zdDogJ2FwaS5saW5rZWRpbi5jb20nLFxuICAgIHBhdGg6ICcvdjIvJyArIHBhdGgsXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkOiB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhOiB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLElBQUlBLEtBQUssR0FBR0MsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDRCxLQUFLO0FBQ3ZDLE1BQU1FLFlBQVksR0FBR0QsT0FBTyxDQUFDLGdCQUFnQixDQUFDOztBQUU5QztBQUNBLFNBQVNFLGdCQUFnQkEsQ0FBQ0MsUUFBUSxFQUFFO0VBQ2xDLE9BQU9DLE9BQU8sQ0FBQyxJQUFJLEVBQUVELFFBQVEsQ0FBQ0UsWUFBWSxFQUFFRixRQUFRLENBQUNHLGFBQWEsQ0FBQyxDQUFDQyxJQUFJLENBQUNDLElBQUksSUFBSTtJQUMvRSxJQUFJQSxJQUFJLElBQUlBLElBQUksQ0FBQ0MsRUFBRSxJQUFJTixRQUFRLENBQUNNLEVBQUUsRUFBRTtNQUNsQztJQUNGO0lBQ0EsTUFBTSxJQUFJVixLQUFLLENBQUNXLEtBQUssQ0FBQ1gsS0FBSyxDQUFDVyxLQUFLLENBQUNDLGdCQUFnQixFQUFFLHlDQUF5QyxDQUFDO0VBQ2hHLENBQUMsQ0FBQztBQUNKOztBQUVBO0FBQ0EsU0FBU0MsYUFBYUEsQ0FBQSxFQUFHO0VBQ3ZCLE9BQU9DLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLENBQUM7QUFDMUI7O0FBRUE7QUFDQSxTQUFTVixPQUFPQSxDQUFDVyxJQUFJLEVBQUVWLFlBQVksRUFBRUMsYUFBYSxFQUFFO0VBQ2xELElBQUlVLE9BQU8sR0FBRztJQUNaQyxhQUFhLEVBQUUsU0FBUyxHQUFHWixZQUFZO0lBQ3ZDLGFBQWEsRUFBRTtFQUNqQixDQUFDO0VBRUQsSUFBSUMsYUFBYSxFQUFFO0lBQ2pCVSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTTtFQUM5QjtFQUNBLE9BQU9mLFlBQVksQ0FBQ2lCLEdBQUcsQ0FBQztJQUN0QkMsSUFBSSxFQUFFLGtCQUFrQjtJQUN4QkosSUFBSSxFQUFFLE1BQU0sR0FBR0EsSUFBSTtJQUNuQkMsT0FBTyxFQUFFQTtFQUNYLENBQUMsQ0FBQztBQUNKO0FBRUFJLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHO0VBQ2ZULGFBQWEsRUFBRUEsYUFBYTtFQUM1QlYsZ0JBQWdCLEVBQUVBO0FBQ3BCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
116
+ var _default = exports.default = new LinkedInAdapter();
117
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmFzZUNvZGVBdXRoQWRhcHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTGlua2VkSW5BZGFwdGVyIiwiQmFzZUF1dGhDb2RlQWRhcHRlciIsImNvbnN0cnVjdG9yIiwiZ2V0VXNlckZyb21BY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsImF1dGhEYXRhIiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwiaXNfbW9iaWxlX3NkayIsInVuZGVmaW5lZCIsIm9rIiwiUGFyc2UiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJqc29uIiwiZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZSIsIm1ldGhvZCIsImJvZHkiLCJVUkxTZWFyY2hQYXJhbXMiLCJncmFudF90eXBlIiwiY29kZSIsInJlZGlyZWN0X3VyaSIsImNsaWVudF9pZCIsImNsaWVudElkIiwiY2xpZW50X3NlY3JldCIsImNsaWVudFNlY3JldCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2xpbmtlZGluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyc2UgU2VydmVyIGF1dGhlbnRpY2F0aW9uIGFkYXB0ZXIgZm9yIExpbmtlZEluLlxuICpcbiAqIEBjbGFzcyBMaW5rZWRJbkFkYXB0ZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIGFkYXB0ZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuY2xpZW50SWQgLSBZb3VyIExpbmtlZEluIEFwcCBDbGllbnQgSUQuIFJlcXVpcmVkIGZvciBzZWN1cmUgYXV0aGVudGljYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5jbGllbnRTZWNyZXQgLSBZb3VyIExpbmtlZEluIEFwcCBDbGllbnQgU2VjcmV0LiBSZXF1aXJlZCBmb3Igc2VjdXJlIGF1dGhlbnRpY2F0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5lbmFibGVJbnNlY3VyZUF1dGg9ZmFsc2VdIC0gKipbREVQUkVDQVRFRF0qKiBFbmFibGUgaW5zZWN1cmUgYXV0aGVudGljYXRpb24gKG5vdCByZWNvbW1lbmRlZCkuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiAjIyBQYXJzZSBTZXJ2ZXIgQ29uZmlndXJhdGlvblxuICogVG8gY29uZmlndXJlIFBhcnNlIFNlcnZlciBmb3IgTGlua2VkSW4gYXV0aGVudGljYXRpb24sIHVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqICMjIyBTZWN1cmUgQ29uZmlndXJhdGlvblxuICogYGBganNvblxuICoge1xuICogICBcImF1dGhcIjoge1xuICogICAgIFwibGlua2VkaW5cIjoge1xuICogICAgICAgXCJjbGllbnRJZFwiOiBcInlvdXItY2xpZW50LWlkXCIsXG4gKiAgICAgICBcImNsaWVudFNlY3JldFwiOiBcInlvdXItY2xpZW50LXNlY3JldFwiXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqICMjIyBJbnNlY3VyZSBDb25maWd1cmF0aW9uIChOb3QgUmVjb21tZW5kZWQpXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYXV0aFwiOiB7XG4gKiAgICAgXCJsaW5rZWRpblwiOiB7XG4gKiAgICAgICBcImVuYWJsZUluc2VjdXJlQXV0aFwiOiB0cnVlXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgYWRhcHRlciByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGBhdXRoRGF0YWAgZmllbGRzOlxuICogLSAqKlNlY3VyZSBBdXRoZW50aWNhdGlvbioqOiBgY29kZWAsIGByZWRpcmVjdF91cmlgLCBhbmQgb3B0aW9uYWxseSBgaXNfbW9iaWxlX3Nka2AuXG4gKiAtICoqSW5zZWN1cmUgQXV0aGVudGljYXRpb24gKE5vdCBSZWNvbW1lbmRlZCkqKjogYGlkYCwgYGFjY2Vzc190b2tlbmAsIGFuZCBvcHRpb25hbGx5IGBpc19tb2JpbGVfc2RrYC5cbiAqXG4gKiAjIyBBdXRoIFBheWxvYWRzXG4gKiAjIyMgU2VjdXJlIEF1dGhlbnRpY2F0aW9uIFBheWxvYWRcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJsaW5rZWRpblwiOiB7XG4gKiAgICAgXCJjb2RlXCI6IFwibG1uNzg5b3BxMDEycnN0MzQ1dXZ3XCIsXG4gKiAgICAgXCJyZWRpcmVjdF91cmlcIjogXCJodHRwczovL3lvdXItcmVkaXJlY3QtdXJpLmNvbS9jYWxsYmFja1wiLFxuICogICAgIFwiaXNfbW9iaWxlX3Nka1wiOiB0cnVlXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIyBJbnNlY3VyZSBBdXRoZW50aWNhdGlvbiBQYXlsb2FkIChOb3QgUmVjb21tZW5kZWQpXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwibGlua2VkaW5cIjoge1xuICogICAgIFwiaWRcIjogXCI3NjU0MzIxXCIsXG4gKiAgICAgXCJhY2Nlc3NfdG9rZW5cIjogXCJBUVhObmQyaElUNno5YkhGelp6MktwMWdoaU16X1J0eXV2d1hZWjEyM2FiY1wiLFxuICogICAgIFwiaXNfbW9iaWxlX3Nka1wiOiB0cnVlXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIE5vdGVzXG4gKiAtIFNlY3VyZSBhdXRoZW50aWNhdGlvbiBleGNoYW5nZXMgdGhlIGBjb2RlYCBhbmQgYHJlZGlyZWN0X3VyaWAgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3IgYW4gYWNjZXNzIHRva2VuIHVzaW5nIExpbmtlZEluJ3MgT0F1dGggQVBJLlxuICogLSBJbnNlY3VyZSBhdXRoZW50aWNhdGlvbiB2YWxpZGF0ZXMgdGhlIHVzZXIgSUQgYW5kIGFjY2VzcyB0b2tlbiBkaXJlY3RseSwgYnlwYXNzaW5nIE9BdXRoIGZsb3dzLiBUaGlzIG1ldGhvZCBpcyAqKm5vdCByZWNvbW1lbmRlZCoqIGFuZCBtYXkgaW50cm9kdWNlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy5cbiAqIC0gYGVuYWJsZUluc2VjdXJlQXV0aGAgaXMgKipkZXByZWNhdGVkKiogYW5kIG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlua2VkaW4vc2hhcmVkL2F1dGhlbnRpY2F0aW9uL2F1dGhlbnRpY2F0aW9uIExpbmtlZEluIEF1dGhlbnRpY2F0aW9uIERvY3VtZW50YXRpb259XG4gKi9cblxuaW1wb3J0IEJhc2VBdXRoQ29kZUFkYXB0ZXIgZnJvbSAnLi9CYXNlQ29kZUF1dGhBZGFwdGVyJztcbmNsYXNzIExpbmtlZEluQWRhcHRlciBleHRlbmRzIEJhc2VBdXRoQ29kZUFkYXB0ZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignTGlua2VkSW4nKTtcbiAgfVxuICBhc3luYyBnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuKGFjY2Vzc190b2tlbiwgYXV0aERhdGEpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5saW5rZWRpbi5jb20vdjIvbWUnLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NfdG9rZW59YCxcbiAgICAgICAgJ3gtbGktZm9ybWF0JzogJ2pzb24nLFxuICAgICAgICAneC1saS1zcmMnOiBhdXRoRGF0YT8uaXNfbW9iaWxlX3NkayA/ICdtc2RrJyA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0xpbmtlZEluIEFQSSByZXF1ZXN0IGZhaWxlZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZShhdXRoRGF0YSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9vYXV0aC92Mi9hY2Nlc3NUb2tlbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICB9LFxuICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnLFxuICAgICAgICBjb2RlOiBhdXRoRGF0YS5jb2RlLFxuICAgICAgICByZWRpcmVjdF91cmk6IGF1dGhEYXRhLnJlZGlyZWN0X3VyaSxcbiAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLmNsaWVudFNlY3JldCxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdMaW5rZWRJbiBBUEkgcmVxdWVzdCBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4ganNvbi5hY2Nlc3NfdG9rZW47XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IExpbmtlZEluQWRhcHRlcigpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFxRUEsSUFBQUEsb0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUF3RCxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtB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
@@ -1,17 +1,25 @@
1
1
  "use strict";
2
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 }; }
3
6
  // Helper functions for accessing the meetup API.
4
7
  var Parse = require('parse/node').Parse;
5
8
  const httpsRequest = require('./httpsRequest');
6
-
7
9
  // Returns a promise that fulfills iff this user id is valid.
8
- function validateAuthData(authData) {
9
- return request('member/self', authData.access_token).then(data => {
10
- if (data && data.id == authData.id) {
11
- return;
12
- }
13
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Meetup auth is invalid for this user.');
10
+ async function validateAuthData(authData) {
11
+ const config = _Config.default.get(Parse.applicationId);
12
+ const meetupConfig = config.auth.meetup;
13
+ _Deprecator.default.logRuntimeDeprecation({
14
+ usage: 'meetup adapter'
14
15
  });
16
+ if (!meetupConfig?.enableInsecureAuth) {
17
+ throw new Parse.Error('Meetup only works with enableInsecureAuth: true');
18
+ }
19
+ const data = await request('member/self', authData.access_token);
20
+ if (data?.id !== authData.id) {
21
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Meetup auth is invalid for this user.');
22
+ }
15
23
  }
16
24
 
17
25
  // Returns a promise that fulfills iff this app id is valid.
@@ -33,4 +41,4 @@ module.exports = {
33
41
  validateAppId: validateAppId,
34
42
  validateAuthData: validateAuthData
35
43
  };
36
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwc1JlcXVlc3QiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJyZXF1ZXN0IiwiYWNjZXNzX3Rva2VuIiwidGhlbiIsImRhdGEiLCJpZCIsIkVycm9yIiwiT0JKRUNUX05PVF9GT1VORCIsInZhbGlkYXRlQXBwSWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInBhdGgiLCJnZXQiLCJob3N0IiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvbWVldHVwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgbWVldHVwIEFQSS5cbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcbmNvbnN0IGh0dHBzUmVxdWVzdCA9IHJlcXVpcmUoJy4vaHR0cHNSZXF1ZXN0Jyk7XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgcmV0dXJuIHJlcXVlc3QoJ21lbWJlci9zZWxmJywgYXV0aERhdGEuYWNjZXNzX3Rva2VuKS50aGVuKGRhdGEgPT4ge1xuICAgIGlmIChkYXRhICYmIGRhdGEuaWQgPT0gYXV0aERhdGEuaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdNZWV0dXAgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gIH0pO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmZiB0aGlzIGFwcCBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXBwSWQoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxuLy8gQSBwcm9taXNleSB3cmFwcGVyIGZvciBhcGkgcmVxdWVzdHNcbmZ1bmN0aW9uIHJlcXVlc3QocGF0aCwgYWNjZXNzX3Rva2VuKSB7XG4gIHJldHVybiBodHRwc1JlcXVlc3QuZ2V0KHtcbiAgICBob3N0OiAnYXBpLm1lZXR1cC5jb20nLFxuICAgIHBhdGg6ICcvMi8nICsgcGF0aCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiAnYmVhcmVyICcgKyBhY2Nlc3NfdG9rZW4sXG4gICAgfSxcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkOiB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhOiB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLElBQUlBLEtBQUssR0FBR0MsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDRCxLQUFLO0FBQ3ZDLE1BQU1FLFlBQVksR0FBR0QsT0FBTyxDQUFDLGdCQUFnQixDQUFDOztBQUU5QztBQUNBLFNBQVNFLGdCQUFnQkEsQ0FBQ0MsUUFBUSxFQUFFO0VBQ2xDLE9BQU9DLE9BQU8sQ0FBQyxhQUFhLEVBQUVELFFBQVEsQ0FBQ0UsWUFBWSxDQUFDLENBQUNDLElBQUksQ0FBQ0MsSUFBSSxJQUFJO0lBQ2hFLElBQUlBLElBQUksSUFBSUEsSUFBSSxDQUFDQyxFQUFFLElBQUlMLFFBQVEsQ0FBQ0ssRUFBRSxFQUFFO01BQ2xDO0lBQ0Y7SUFDQSxNQUFNLElBQUlULEtBQUssQ0FBQ1UsS0FBSyxDQUFDVixLQUFLLENBQUNVLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQUUsdUNBQXVDLENBQUM7RUFDOUYsQ0FBQyxDQUFDO0FBQ0o7O0FBRUE7QUFDQSxTQUFTQyxhQUFhQSxDQUFBLEVBQUc7RUFDdkIsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQztBQUMxQjs7QUFFQTtBQUNBLFNBQVNULE9BQU9BLENBQUNVLElBQUksRUFBRVQsWUFBWSxFQUFFO0VBQ25DLE9BQU9KLFlBQVksQ0FBQ2MsR0FBRyxDQUFDO0lBQ3RCQyxJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCRixJQUFJLEVBQUUsS0FBSyxHQUFHQSxJQUFJO0lBQ2xCRyxPQUFPLEVBQUU7TUFDUEMsYUFBYSxFQUFFLFNBQVMsR0FBR2I7SUFDN0I7RUFDRixDQUFDLENBQUM7QUFDSjtBQUVBYyxNQUFNLENBQUNDLE9BQU8sR0FBRztFQUNmVCxhQUFhLEVBQUVBLGFBQWE7RUFDNUJULGdCQUFnQixFQUFFQTtBQUNwQixDQUFDIiwiaWdub3JlTGlzdCI6W119
44
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQ29uZmlnIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfRGVwcmVjYXRvciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIlBhcnNlIiwiaHR0cHNSZXF1ZXN0IiwidmFsaWRhdGVBdXRoRGF0YSIsImF1dGhEYXRhIiwiY29uZmlnIiwiQ29uZmlnIiwiZ2V0IiwiYXBwbGljYXRpb25JZCIsIm1lZXR1cENvbmZpZyIsImF1dGgiLCJtZWV0dXAiLCJEZXByZWNhdG9yIiwibG9nUnVudGltZURlcHJlY2F0aW9uIiwidXNhZ2UiLCJlbmFibGVJbnNlY3VyZUF1dGgiLCJFcnJvciIsImRhdGEiLCJyZXF1ZXN0IiwiYWNjZXNzX3Rva2VuIiwiaWQiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwidmFsaWRhdGVBcHBJZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicGF0aCIsImhvc3QiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9tZWV0dXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIHRoZSBtZWV0dXAgQVBJLlxudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuY29uc3QgaHR0cHNSZXF1ZXN0ID0gcmVxdWlyZSgnLi9odHRwc1JlcXVlc3QnKTtcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vLi4vQ29uZmlnJztcbmltcG9ydCBEZXByZWNhdG9yIGZyb20gJy4uLy4uL0RlcHJlY2F0b3IvRGVwcmVjYXRvcic7XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChQYXJzZS5hcHBsaWNhdGlvbklkKTtcbiAgY29uc3QgbWVldHVwQ29uZmlnID0gY29uZmlnLmF1dGgubWVldHVwO1xuXG4gIERlcHJlY2F0b3IubG9nUnVudGltZURlcHJlY2F0aW9uKHsgdXNhZ2U6ICdtZWV0dXAgYWRhcHRlcicgfSk7XG5cbiAgaWYgKCFtZWV0dXBDb25maWc/LmVuYWJsZUluc2VjdXJlQXV0aCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcignTWVldHVwIG9ubHkgd29ya3Mgd2l0aCBlbmFibGVJbnNlY3VyZUF1dGg6IHRydWUnKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCByZXF1ZXN0KCdtZW1iZXIvc2VsZicsIGF1dGhEYXRhLmFjY2Vzc190b2tlbik7XG4gIGlmIChkYXRhPy5pZCAhPT0gYXV0aERhdGEuaWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ01lZXR1cCBhdXRoIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nKTtcbiAgfVxufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmZiB0aGlzIGFwcCBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXBwSWQoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxuLy8gQSBwcm9taXNleSB3cmFwcGVyIGZvciBhcGkgcmVxdWVzdHNcbmZ1bmN0aW9uIHJlcXVlc3QocGF0aCwgYWNjZXNzX3Rva2VuKSB7XG4gIHJldHVybiBodHRwc1JlcXVlc3QuZ2V0KHtcbiAgICBob3N0OiAnYXBpLm1lZXR1cC5jb20nLFxuICAgIHBhdGg6ICcvMi8nICsgcGF0aCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiAnYmVhcmVyICcgKyBhY2Nlc3NfdG9rZW4sXG4gICAgfSxcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkOiB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhOiB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFBcUQsU0FBQUQsdUJBQUFHLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFKckQ7QUFDQSxJQUFJRyxLQUFLLEdBQUdMLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQ0ssS0FBSztBQUN2QyxNQUFNQyxZQUFZLEdBQUdOLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUk5QztBQUNBLGVBQWVPLGdCQUFnQkEsQ0FBQ0MsUUFBUSxFQUFFO0VBQ3hDLE1BQU1DLE1BQU0sR0FBR0MsZUFBTSxDQUFDQyxHQUFHLENBQUNOLEtBQUssQ0FBQ08sYUFBYSxDQUFDO0VBQzlDLE1BQU1DLFlBQVksR0FBR0osTUFBTSxDQUFDSyxJQUFJLENBQUNDLE1BQU07RUFFdkNDLG1CQUFVLENBQUNDLHFCQUFxQixDQUFDO0lBQUVDLEtBQUssRUFBRTtFQUFpQixDQUFDLENBQUM7RUFFN0QsSUFBSSxDQUFDTCxZQUFZLEVBQUVNLGtCQUFrQixFQUFFO0lBQ3JDLE1BQU0sSUFBSWQsS0FBSyxDQUFDZSxLQUFLLENBQUMsaURBQWlELENBQUM7RUFDMUU7RUFFQSxNQUFNQyxJQUFJLEdBQUcsTUFBTUMsT0FBTyxDQUFDLGFBQWEsRUFBRWQsUUFBUSxDQUFDZSxZQUFZLENBQUM7RUFDaEUsSUFBSUYsSUFBSSxFQUFFRyxFQUFFLEtBQUtoQixRQUFRLENBQUNnQixFQUFFLEVBQUU7SUFDNUIsTUFBTSxJQUFJbkIsS0FBSyxDQUFDZSxLQUFLLENBQUNmLEtBQUssQ0FBQ2UsS0FBSyxDQUFDSyxnQkFBZ0IsRUFBRSx1Q0FBdUMsQ0FBQztFQUM5RjtBQUNGOztBQUVBO0FBQ0EsU0FBU0MsYUFBYUEsQ0FBQSxFQUFHO0VBQ3ZCLE9BQU9DLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLENBQUM7QUFDMUI7O0FBRUE7QUFDQSxTQUFTTixPQUFPQSxDQUFDTyxJQUFJLEVBQUVOLFlBQVksRUFBRTtFQUNuQyxPQUFPakIsWUFBWSxDQUFDSyxHQUFHLENBQUM7SUFDdEJtQixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCRCxJQUFJLEVBQUUsS0FBSyxHQUFHQSxJQUFJO0lBQ2xCRSxPQUFPLEVBQUU7TUFDUEMsYUFBYSxFQUFFLFNBQVMsR0FBR1Q7SUFDN0I7RUFDRixDQUFDLENBQUM7QUFDSjtBQUVBVSxNQUFNLENBQUNDLE9BQU8sR0FBRztFQUNmUixhQUFhLEVBQUVBLGFBQWE7RUFDNUJuQixnQkFBZ0IsRUFBRUE7QUFDcEIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -8,6 +8,84 @@ var _otpauth = require("otpauth");
8
8
  var _cryptoUtils = require("../../cryptoUtils");
9
9
  var _AuthAdapter = _interopRequireDefault(require("./AuthAdapter"));
10
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ /**
12
+ * Parse Server authentication adapter for Multi-Factor Authentication (MFA).
13
+ *
14
+ * @class MFAAdapter
15
+ * @param {Object} options - The adapter options.
16
+ * @param {Array<String>} options.options - Supported MFA methods. Must include `"SMS"` or `"TOTP"`.
17
+ * @param {Number} [options.digits=6] - The number of digits for the one-time password (OTP). Must be between 4 and 10.
18
+ * @param {Number} [options.period=30] - The validity period of the OTP in seconds. Must be greater than 10.
19
+ * @param {String} [options.algorithm="SHA1"] - The algorithm used for TOTP generation. Defaults to `"SHA1"`.
20
+ * @param {Function} [options.sendSMS] - A callback function for sending SMS OTPs. Required if `"SMS"` is included in `options`.
21
+ *
22
+ * @description
23
+ * ## Parse Server Configuration
24
+ * To configure Parse Server for MFA, use the following structure:
25
+ * ```javascript
26
+ * {
27
+ * auth: {
28
+ * mfa: {
29
+ * options: ["SMS", "TOTP"],
30
+ * digits: 6,
31
+ * period: 30,
32
+ * algorithm: "SHA1",
33
+ * sendSMS: (token, mobile) => {
34
+ * // Send the SMS using your preferred SMS provider.
35
+ * console.log(`Sending SMS to ${mobile} with token: ${token}`);
36
+ * }
37
+ * }
38
+ * }
39
+ * }
40
+ * ```
41
+ *
42
+ * ## MFA Methods
43
+ * - **SMS**:
44
+ * - Requires a valid mobile number.
45
+ * - Sends a one-time password (OTP) via SMS for login or verification.
46
+ * - Uses the `sendSMS` callback for sending the OTP.
47
+ *
48
+ * - **TOTP**:
49
+ * - Requires a secret key for setup.
50
+ * - Validates the user's OTP against a time-based one-time password (TOTP) generated using the secret key.
51
+ * - Supports configurable digits, period, and algorithm for TOTP generation.
52
+ *
53
+ * ## MFA Payload
54
+ * The adapter requires the following `authData` fields:
55
+ * - **For SMS-based MFA**:
56
+ * - `mobile`: The user's mobile number (required for setup).
57
+ * - `token`: The OTP provided by the user for login or verification.
58
+ * - **For TOTP-based MFA**:
59
+ * - `secret`: The TOTP secret key for the user (required for setup).
60
+ * - `token`: The OTP provided by the user for login or verification.
61
+ *
62
+ * ## Example Payloads
63
+ * ### SMS Setup Payload
64
+ * ```json
65
+ * {
66
+ * "mobile": "+1234567890"
67
+ * }
68
+ * ```
69
+ *
70
+ * ### TOTP Setup Payload
71
+ * ```json
72
+ * {
73
+ * "secret": "BASE32ENCODEDSECRET",
74
+ * "token": "123456"
75
+ * }
76
+ * ```
77
+ *
78
+ * ### Login Payload
79
+ * ```json
80
+ * {
81
+ * "token": "123456"
82
+ * }
83
+ * ```
84
+ *
85
+ * @see {@link https://en.wikipedia.org/wiki/Time-based_One-Time_Password_algorithm Time-based One-Time Password Algorithm (TOTP)}
86
+ * @see {@link https://tools.ietf.org/html/rfc6238 RFC 6238: TOTP: Time-Based One-Time Password Algorithm}
87
+ */
88
+
11
89
  class MFAAdapter extends _AuthAdapter.default {
12
90
  validateOptions(opts) {
13
91
  const validOptions = opts.options;
@@ -133,7 +211,7 @@ class MFAAdapter extends _AuthAdapter.default {
133
211
  }
134
212
  throw 'Invalid MFA data';
135
213
  }
136
- afterFind(req, authData) {
214
+ afterFind(authData, options, req) {
137
215
  if (req.master) {
138
216
  return;
139
217
  }
@@ -243,4 +321,4 @@ class MFAAdapter extends _AuthAdapter.default {
243
321
  }
244
322
  }
245
323
  var _default = exports.default = new MFAAdapter();
246
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfb3RwYXV0aCIsInJlcXVpcmUiLCJfY3J5cHRvVXRpbHMiLCJfQXV0aEFkYXB0ZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTUZBQWRhcHRlciIsIkF1dGhBZGFwdGVyIiwidmFsaWRhdGVPcHRpb25zIiwib3B0cyIsInZhbGlkT3B0aW9ucyIsIm9wdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJzbXMiLCJpbmNsdWRlcyIsInRvdHAiLCJkaWdpdHMiLCJwZXJpb2QiLCJzZW5kU01TIiwic21zQ2FsbGJhY2siLCJhbGdvcml0aG0iLCJ2YWxpZGF0ZVNldFVwIiwibWZhRGF0YSIsIm1vYmlsZSIsInNldHVwTW9iaWxlT1RQIiwic2V0dXBUT1RQIiwidmFsaWRhdGVMb2dpbiIsImxvZ2luRGF0YSIsIl8iLCJyZXEiLCJzYXZlUmVzcG9uc2UiLCJkb05vdFNhdmUiLCJ0b2tlbiIsImF1dGgiLCJvcmlnaW5hbCIsImdldCIsInNlY3JldCIsInJlY292ZXJ5Iiwic2F2ZWQiLCJleHBpcnkiLCJtZmEiLCJzZW5kVG9rZW4iLCJvYmplY3QiLCJzZXQiLCJzYXZlIiwidXNlTWFzdGVyS2V5IiwiRGF0ZSIsIlRPVFAiLCJTZWNyZXQiLCJmcm9tQmFzZTMyIiwidmFsaWQiLCJ2YWxpZGF0ZSIsInZhbGlkYXRlVXBkYXRlIiwiYXV0aERhdGEiLCJtYXN0ZXIiLCJjb25maXJtU01TT1RQIiwib2xkIiwiYWZ0ZXJGaW5kIiwic3RhdHVzIiwicG9saWN5IiwicGVuZGluZyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJ0ZXN0IiwicmFuZG9tU3RyaW5nIiwicmVwbGFjZSIsInN1YnN0cmluZyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZ2V0VGltZSIsImlucHV0RGF0YSIsInBlbmRpbmdEYXRhIiwicmVzcG9uc2UiLCJqb2luIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvbWZhLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRPVFAsIFNlY3JldCB9IGZyb20gJ290cGF1dGgnO1xuaW1wb3J0IHsgcmFuZG9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vY3J5cHRvVXRpbHMnO1xuaW1wb3J0IEF1dGhBZGFwdGVyIGZyb20gJy4vQXV0aEFkYXB0ZXInO1xuY2xhc3MgTUZBQWRhcHRlciBleHRlbmRzIEF1dGhBZGFwdGVyIHtcbiAgdmFsaWRhdGVPcHRpb25zKG9wdHMpIHtcbiAgICBjb25zdCB2YWxpZE9wdGlvbnMgPSBvcHRzLm9wdGlvbnM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbGlkT3B0aW9ucykpIHtcbiAgICAgIHRocm93ICdtZmEub3B0aW9ucyBtdXN0IGJlIGFuIGFycmF5JztcbiAgICB9XG4gICAgdGhpcy5zbXMgPSB2YWxpZE9wdGlvbnMuaW5jbHVkZXMoJ1NNUycpO1xuICAgIHRoaXMudG90cCA9IHZhbGlkT3B0aW9ucy5pbmNsdWRlcygnVE9UUCcpO1xuICAgIGlmICghdGhpcy5zbXMgJiYgIXRoaXMudG90cCkge1xuICAgICAgdGhyb3cgJ21mYS5vcHRpb25zIG11c3QgaW5jbHVkZSBTTVMgb3IgVE9UUCc7XG4gICAgfVxuICAgIGNvbnN0IGRpZ2l0cyA9IG9wdHMuZGlnaXRzIHx8IDY7XG4gICAgY29uc3QgcGVyaW9kID0gb3B0cy5wZXJpb2QgfHwgMzA7XG4gICAgaWYgKHR5cGVvZiBkaWdpdHMgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyAnbWZhLmRpZ2l0cyBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwZXJpb2QgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyAnbWZhLnBlcmlvZCBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9XG4gICAgaWYgKGRpZ2l0cyA8IDQgfHwgZGlnaXRzID4gMTApIHtcbiAgICAgIHRocm93ICdtZmEuZGlnaXRzIG11c3QgYmUgYmV0d2VlbiA0IGFuZCAxMCc7XG4gICAgfVxuICAgIGlmIChwZXJpb2QgPCAxMCkge1xuICAgICAgdGhyb3cgJ21mYS5wZXJpb2QgbXVzdCBiZSBncmVhdGVyIHRoYW4gMTAnO1xuICAgIH1cbiAgICBjb25zdCBzZW5kU01TID0gb3B0cy5zZW5kU01TO1xuICAgIGlmICh0aGlzLnNtcyAmJiB0eXBlb2Ygc2VuZFNNUyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgJ21mYS5zZW5kU01TIGNhbGxiYWNrIG11c3QgYmUgZGVmaW5lZCB3aGVuIHVzaW5nIFNNUyBPVFBzJztcbiAgICB9XG4gICAgdGhpcy5zbXNDYWxsYmFjayA9IHNlbmRTTVM7XG4gICAgdGhpcy5kaWdpdHMgPSBkaWdpdHM7XG4gICAgdGhpcy5wZXJpb2QgPSBwZXJpb2Q7XG4gICAgdGhpcy5hbGdvcml0aG0gPSBvcHRzLmFsZ29yaXRobSB8fCAnU0hBMSc7XG4gIH1cbiAgdmFsaWRhdGVTZXRVcChtZmFEYXRhKSB7XG4gICAgaWYgKG1mYURhdGEubW9iaWxlICYmIHRoaXMuc21zKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXR1cE1vYmlsZU9UUChtZmFEYXRhLm1vYmlsZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvdHApIHtcbiAgICAgIHJldHVybiB0aGlzLnNldHVwVE9UUChtZmFEYXRhKTtcbiAgICB9XG4gICAgdGhyb3cgJ0ludmFsaWQgTUZBIGRhdGEnO1xuICB9XG4gIGFzeW5jIHZhbGlkYXRlTG9naW4obG9naW5EYXRhLCBfLCByZXEpIHtcbiAgICBjb25zdCBzYXZlUmVzcG9uc2UgPSB7XG4gICAgICBkb05vdFNhdmU6IHRydWUsXG4gICAgfTtcbiAgICBjb25zdCB0b2tlbiA9IGxvZ2luRGF0YS50b2tlbjtcbiAgICBjb25zdCBhdXRoID0gcmVxLm9yaWdpbmFsLmdldCgnYXV0aERhdGEnKSB8fCB7fTtcbiAgICBjb25zdCB7IHNlY3JldCwgcmVjb3ZlcnksIG1vYmlsZSwgdG9rZW46IHNhdmVkLCBleHBpcnkgfSA9IGF1dGgubWZhIHx8IHt9O1xuICAgIGlmICh0aGlzLnNtcyAmJiBtb2JpbGUpIHtcbiAgICAgIGlmICh0b2tlbiA9PT0gJ3JlcXVlc3QnKSB7XG4gICAgICAgIGNvbnN0IHsgdG9rZW46IHNlbmRUb2tlbiwgZXhwaXJ5IH0gPSBhd2FpdCB0aGlzLnNlbmRTTVMobW9iaWxlKTtcbiAgICAgICAgYXV0aC5tZmEudG9rZW4gPSBzZW5kVG9rZW47XG4gICAgICAgIGF1dGgubWZhLmV4cGlyeSA9IGV4cGlyeTtcbiAgICAgICAgcmVxLm9iamVjdC5zZXQoJ2F1dGhEYXRhJywgYXV0aCk7XG4gICAgICAgIGF3YWl0IHJlcS5vYmplY3Quc2F2ZShudWxsLCB7IHVzZU1hc3RlcktleTogdHJ1ZSB9KTtcbiAgICAgICAgdGhyb3cgJ1BsZWFzZSBlbnRlciB0aGUgdG9rZW4nO1xuICAgICAgfVxuICAgICAgaWYgKCFzYXZlZCB8fCB0b2tlbiAhPT0gc2F2ZWQpIHtcbiAgICAgICAgdGhyb3cgJ0ludmFsaWQgTUZBIHRva2VuIDEnO1xuICAgICAgfVxuICAgICAgaWYgKG5ldyBEYXRlKCkgPiBleHBpcnkpIHtcbiAgICAgICAgdGhyb3cgJ0ludmFsaWQgTUZBIHRva2VuIDInO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGF1dGgubWZhLnRva2VuO1xuICAgICAgZGVsZXRlIGF1dGgubWZhLmV4cGlyeTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNhdmU6IGF1dGgubWZhLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMudG90cCkge1xuICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgJ0ludmFsaWQgTUZBIHRva2VuJztcbiAgICAgIH1cbiAgICAgIGlmICghc2VjcmV0KSB7XG4gICAgICAgIHJldHVybiBzYXZlUmVzcG9uc2U7XG4gICAgICB9XG4gICAgICBpZiAocmVjb3ZlcnlbMF0gPT09IHRva2VuIHx8IHJlY292ZXJ5WzFdID09PSB0b2tlbikge1xuICAgICAgICByZXR1cm4gc2F2ZVJlc3BvbnNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdG90cCA9IG5ldyBUT1RQKHtcbiAgICAgICAgYWxnb3JpdGhtOiB0aGlzLmFsZ29yaXRobSxcbiAgICAgICAgZGlnaXRzOiB0aGlzLmRpZ2l0cyxcbiAgICAgICAgcGVyaW9kOiB0aGlzLnBlcmlvZCxcbiAgICAgICAgc2VjcmV0OiBTZWNyZXQuZnJvbUJhc2UzMihzZWNyZXQpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB2YWxpZCA9IHRvdHAudmFsaWRhdGUoe1xuICAgICAgICB0b2tlbixcbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbGlkID09PSBudWxsKSB7XG4gICAgICAgIHRocm93ICdJbnZhbGlkIE1GQSB0b2tlbic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzYXZlUmVzcG9uc2U7XG4gIH1cbiAgYXN5bmMgdmFsaWRhdGVVcGRhdGUoYXV0aERhdGEsIF8sIHJlcSkge1xuICAgIGlmIChyZXEubWFzdGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhdXRoRGF0YS5tb2JpbGUgJiYgdGhpcy5zbXMpIHtcbiAgICAgIGlmICghYXV0aERhdGEudG9rZW4pIHtcbiAgICAgICAgdGhyb3cgJ01GQSBpcyBhbHJlYWR5IHNldCB1cCBvbiB0aGlzIGFjY291bnQnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY29uZmlybVNNU09UUChhdXRoRGF0YSwgcmVxLm9yaWdpbmFsLmdldCgnYXV0aERhdGEnKT8ubWZhIHx8IHt9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudG90cCkge1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUxvZ2luKHsgdG9rZW46IGF1dGhEYXRhLm9sZCB9LCBudWxsLCByZXEpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTZXRVcChhdXRoRGF0YSk7XG4gICAgfVxuICAgIHRocm93ICdJbnZhbGlkIE1GQSBkYXRhJztcbiAgfVxuICBhZnRlckZpbmQocmVxLCBhdXRoRGF0YSkge1xuICAgIGlmIChyZXEubWFzdGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnRvdHAgJiYgYXV0aERhdGEuc2VjcmV0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdlbmFibGVkJyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnNtcyAmJiBhdXRoRGF0YS5tb2JpbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2VuYWJsZWQnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Rpc2FibGVkJyxcbiAgICB9O1xuICB9XG5cbiAgcG9saWN5KHJlcSwgYXV0aCkge1xuICAgIGlmICh0aGlzLnNtcyAmJiBhdXRoPy5wZW5kaW5nICYmIE9iamVjdC5rZXlzKGF1dGgpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuICdkZWZhdWx0JztcbiAgICB9XG4gICAgcmV0dXJuICdhZGRpdGlvbmFsJztcbiAgfVxuXG4gIGFzeW5jIHNldHVwTW9iaWxlT1RQKG1vYmlsZSkge1xuICAgIGNvbnN0IHsgdG9rZW4sIGV4cGlyeSB9ID0gYXdhaXQgdGhpcy5zZW5kU01TKG1vYmlsZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNhdmU6IHtcbiAgICAgICAgcGVuZGluZzoge1xuICAgICAgICAgIFttb2JpbGVdOiB7XG4gICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIGV4cGlyeSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2VuZFNNUyhtb2JpbGUpIHtcbiAgICBpZiAoIS9eWytdKlsoXXswLDF9WzAtOV17MSwzfVspXXswLDF9Wy1cXHNcXC4vMC05XSokL2cudGVzdChtb2JpbGUpKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBtb2JpbGUgbnVtYmVyLic7XG4gICAgfVxuICAgIGxldCB0b2tlbiA9ICcnO1xuICAgIHdoaWxlICh0b2tlbi5sZW5ndGggPCB0aGlzLmRpZ2l0cykge1xuICAgICAgdG9rZW4gKz0gcmFuZG9tU3RyaW5nKDEwKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIH1cbiAgICB0b2tlbiA9IHRva2VuLnN1YnN0cmluZygwLCB0aGlzLmRpZ2l0cyk7XG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHRoaXMuc21zQ2FsbGJhY2sodG9rZW4sIG1vYmlsZSkpO1xuICAgIGNvbnN0IGV4cGlyeSA9IG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgdGhpcy5wZXJpb2QgKiAxMDAwKTtcbiAgICByZXR1cm4geyB0b2tlbiwgZXhwaXJ5IH07XG4gIH1cblxuICBhc3luYyBjb25maXJtU01TT1RQKGlucHV0RGF0YSwgYXV0aERhdGEpIHtcbiAgICBjb25zdCB7IG1vYmlsZSwgdG9rZW4gfSA9IGlucHV0RGF0YTtcbiAgICBpZiAoIWF1dGhEYXRhLnBlbmRpbmc/Llttb2JpbGVdKSB7XG4gICAgICB0aHJvdyAnVGhpcyBudW1iZXIgaXMgbm90IHBlbmRpbmcnO1xuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nRGF0YSA9IGF1dGhEYXRhLnBlbmRpbmdbbW9iaWxlXTtcbiAgICBpZiAodG9rZW4gIT09IHBlbmRpbmdEYXRhLnRva2VuKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBNRkEgdG9rZW4nO1xuICAgIH1cbiAgICBpZiAobmV3IERhdGUoKSA+IHBlbmRpbmdEYXRhLmV4cGlyeSkge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgTUZBIHRva2VuJztcbiAgICB9XG4gICAgZGVsZXRlIGF1dGhEYXRhLnBlbmRpbmdbbW9iaWxlXTtcbiAgICBhdXRoRGF0YS5tb2JpbGUgPSBtb2JpbGU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNhdmU6IGF1dGhEYXRhLFxuICAgIH07XG4gIH1cblxuICBzZXR1cFRPVFAobWZhRGF0YSkge1xuICAgIGNvbnN0IHsgc2VjcmV0LCB0b2tlbiB9ID0gbWZhRGF0YTtcbiAgICBpZiAoIXNlY3JldCB8fCAhdG9rZW4gfHwgc2VjcmV0Lmxlbmd0aCA8IDIwKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBNRkEgZGF0YSc7XG4gICAgfVxuICAgIGNvbnN0IHRvdHAgPSBuZXcgVE9UUCh7XG4gICAgICBhbGdvcml0aG06IHRoaXMuYWxnb3JpdGhtLFxuICAgICAgZGlnaXRzOiB0aGlzLmRpZ2l0cyxcbiAgICAgIHBlcmlvZDogdGhpcy5wZXJpb2QsXG4gICAgICBzZWNyZXQ6IFNlY3JldC5mcm9tQmFzZTMyKHNlY3JldCksXG4gICAgfSk7XG4gICAgY29uc3QgdmFsaWQgPSB0b3RwLnZhbGlkYXRlKHtcbiAgICAgIHRva2VuLFxuICAgIH0pO1xuICAgIGlmICh2YWxpZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgTUZBIHRva2VuJztcbiAgICB9XG4gICAgY29uc3QgcmVjb3ZlcnkgPSBbcmFuZG9tU3RyaW5nKDMwKSwgcmFuZG9tU3RyaW5nKDMwKV07XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3BvbnNlOiB7IHJlY292ZXJ5OiByZWNvdmVyeS5qb2luKCcsICcpIH0sXG4gICAgICBzYXZlOiB7IHNlY3JldCwgcmVjb3ZlcnkgfSxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBuZXcgTUZBQWRhcHRlcigpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFBd0MsU0FBQUcsdUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFDeEMsTUFBTUcsVUFBVSxTQUFTQyxvQkFBVyxDQUFDO0VBQ25DQyxlQUFlQSxDQUFDQyxJQUFJLEVBQUU7SUFDcEIsTUFBTUMsWUFBWSxHQUFHRCxJQUFJLENB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
324
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfb3RwYXV0aCIsInJlcXVpcmUiLCJfY3J5cHRvVXRpbHMiLCJfQXV0aEFkYXB0ZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTUZBQWRhcHRlciIsIkF1dGhBZGFwdGVyIiwidmFsaWRhdGVPcHRpb25zIiwib3B0cyIsInZhbGlkT3B0aW9ucyIsIm9wdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJzbXMiLCJpbmNsdWRlcyIsInRvdHAiLCJkaWdpdHMiLCJwZXJpb2QiLCJzZW5kU01TIiwic21zQ2FsbGJhY2siLCJhbGdvcml0aG0iLCJ2YWxpZGF0ZVNldFVwIiwibWZhRGF0YSIsIm1vYmlsZSIsInNldHVwTW9iaWxlT1RQIiwic2V0dXBUT1RQIiwidmFsaWRhdGVMb2dpbiIsImxvZ2luRGF0YSIsIl8iLCJyZXEiLCJzYXZlUmVzcG9uc2UiLCJkb05vdFNhdmUiLCJ0b2tlbiIsImF1dGgiLCJvcmlnaW5hbCIsImdldCIsInNlY3JldCIsInJlY292ZXJ5Iiwic2F2ZWQiLCJleHBpcnkiLCJtZmEiLCJzZW5kVG9rZW4iLCJvYmplY3QiLCJzZXQiLCJzYXZlIiwidXNlTWFzdGVyS2V5IiwiRGF0ZSIsIlRPVFAiLCJTZWNyZXQiLCJmcm9tQmFzZTMyIiwidmFsaWQiLCJ2YWxpZGF0ZSIsInZhbGlkYXRlVXBkYXRlIiwiYXV0aERhdGEiLCJtYXN0ZXIiLCJjb25maXJtU01TT1RQIiwib2xkIiwiYWZ0ZXJGaW5kIiwic3RhdHVzIiwicG9saWN5IiwicGVuZGluZyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJ0ZXN0IiwicmFuZG9tU3RyaW5nIiwicmVwbGFjZSIsInN1YnN0cmluZyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZ2V0VGltZSIsImlucHV0RGF0YSIsInBlbmRpbmdEYXRhIiwicmVzcG9uc2UiLCJqb2luIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvbWZhLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyc2UgU2VydmVyIGF1dGhlbnRpY2F0aW9uIGFkYXB0ZXIgZm9yIE11bHRpLUZhY3RvciBBdXRoZW50aWNhdGlvbiAoTUZBKS5cbiAqXG4gKiBAY2xhc3MgTUZBQWRhcHRlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgYWRhcHRlciBvcHRpb25zLlxuICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSBvcHRpb25zLm9wdGlvbnMgLSBTdXBwb3J0ZWQgTUZBIG1ldGhvZHMuIE11c3QgaW5jbHVkZSBgXCJTTVNcImAgb3IgYFwiVE9UUFwiYC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kaWdpdHM9Nl0gLSBUaGUgbnVtYmVyIG9mIGRpZ2l0cyBmb3IgdGhlIG9uZS10aW1lIHBhc3N3b3JkIChPVFApLiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMTAuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucGVyaW9kPTMwXSAtIFRoZSB2YWxpZGl0eSBwZXJpb2Qgb2YgdGhlIE9UUCBpbiBzZWNvbmRzLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAxMC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbGdvcml0aG09XCJTSEExXCJdIC0gVGhlIGFsZ29yaXRobSB1c2VkIGZvciBUT1RQIGdlbmVyYXRpb24uIERlZmF1bHRzIHRvIGBcIlNIQTFcImAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5zZW5kU01TXSAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHNlbmRpbmcgU01TIE9UUHMuIFJlcXVpcmVkIGlmIGBcIlNNU1wiYCBpcyBpbmNsdWRlZCBpbiBgb3B0aW9uc2AuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiAjIyBQYXJzZSBTZXJ2ZXIgQ29uZmlndXJhdGlvblxuICogVG8gY29uZmlndXJlIFBhcnNlIFNlcnZlciBmb3IgTUZBLCB1c2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB7XG4gKiAgIGF1dGg6IHtcbiAqICAgICBtZmE6IHtcbiAqICAgICAgIG9wdGlvbnM6IFtcIlNNU1wiLCBcIlRPVFBcIl0sXG4gKiAgICAgICBkaWdpdHM6IDYsXG4gKiAgICAgICBwZXJpb2Q6IDMwLFxuICogICAgICAgYWxnb3JpdGhtOiBcIlNIQTFcIixcbiAqICAgICAgIHNlbmRTTVM6ICh0b2tlbiwgbW9iaWxlKSA9PiB7XG4gKiAgICAgICAgIC8vIFNlbmQgdGhlIFNNUyB1c2luZyB5b3VyIHByZWZlcnJlZCBTTVMgcHJvdmlkZXIuXG4gKiAgICAgICAgIGNvbnNvbGUubG9nKGBTZW5kaW5nIFNNUyB0byAke21vYmlsZX0gd2l0aCB0b2tlbjogJHt0b2tlbn1gKTtcbiAqICAgICAgIH1cbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIE1GQSBNZXRob2RzXG4gKiAtICoqU01TKio6XG4gKiAgIC0gUmVxdWlyZXMgYSB2YWxpZCBtb2JpbGUgbnVtYmVyLlxuICogICAtIFNlbmRzIGEgb25lLXRpbWUgcGFzc3dvcmQgKE9UUCkgdmlhIFNNUyBmb3IgbG9naW4gb3IgdmVyaWZpY2F0aW9uLlxuICogICAtIFVzZXMgdGhlIGBzZW5kU01TYCBjYWxsYmFjayBmb3Igc2VuZGluZyB0aGUgT1RQLlxuICpcbiAqIC0gKipUT1RQKio6XG4gKiAgIC0gUmVxdWlyZXMgYSBzZWNyZXQga2V5IGZvciBzZXR1cC5cbiAqICAgLSBWYWxpZGF0ZXMgdGhlIHVzZXIncyBPVFAgYWdhaW5zdCBhIHRpbWUtYmFzZWQgb25lLXRpbWUgcGFzc3dvcmQgKFRPVFApIGdlbmVyYXRlZCB1c2luZyB0aGUgc2VjcmV0IGtleS5cbiAqICAgLSBTdXBwb3J0cyBjb25maWd1cmFibGUgZGlnaXRzLCBwZXJpb2QsIGFuZCBhbGdvcml0aG0gZm9yIFRPVFAgZ2VuZXJhdGlvbi5cbiAqXG4gKiAjIyBNRkEgUGF5bG9hZFxuICogVGhlIGFkYXB0ZXIgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBgYXV0aERhdGFgIGZpZWxkczpcbiAqIC0gKipGb3IgU01TLWJhc2VkIE1GQSoqOlxuICogICAtIGBtb2JpbGVgOiBUaGUgdXNlcidzIG1vYmlsZSBudW1iZXIgKHJlcXVpcmVkIGZvciBzZXR1cCkuXG4gKiAgIC0gYHRva2VuYDogVGhlIE9UUCBwcm92aWRlZCBieSB0aGUgdXNlciBmb3IgbG9naW4gb3IgdmVyaWZpY2F0aW9uLlxuICogLSAqKkZvciBUT1RQLWJhc2VkIE1GQSoqOlxuICogICAtIGBzZWNyZXRgOiBUaGUgVE9UUCBzZWNyZXQga2V5IGZvciB0aGUgdXNlciAocmVxdWlyZWQgZm9yIHNldHVwKS5cbiAqICAgLSBgdG9rZW5gOiBUaGUgT1RQIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGZvciBsb2dpbiBvciB2ZXJpZmljYXRpb24uXG4gKlxuICogIyMgRXhhbXBsZSBQYXlsb2Fkc1xuICogIyMjIFNNUyBTZXR1cCBQYXlsb2FkXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwibW9iaWxlXCI6IFwiKzEyMzQ1Njc4OTBcIlxuICogfVxuICogYGBgXG4gKlxuICogIyMjIFRPVFAgU2V0dXAgUGF5bG9hZFxuICogYGBganNvblxuICoge1xuICogICBcInNlY3JldFwiOiBcIkJBU0UzMkVOQ09ERURTRUNSRVRcIixcbiAqICAgXCJ0b2tlblwiOiBcIjEyMzQ1NlwiXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgTG9naW4gUGF5bG9hZFxuICogYGBganNvblxuICoge1xuICogICBcInRva2VuXCI6IFwiMTIzNDU2XCJcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RpbWUtYmFzZWRfT25lLVRpbWVfUGFzc3dvcmRfYWxnb3JpdGhtIFRpbWUtYmFzZWQgT25lLVRpbWUgUGFzc3dvcmQgQWxnb3JpdGhtIChUT1RQKX1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjM4IFJGQyA2MjM4OiBUT1RQOiBUaW1lLUJhc2VkIE9uZS1UaW1lIFBhc3N3b3JkIEFsZ29yaXRobX1cbiAqL1xuXG5pbXBvcnQgeyBUT1RQLCBTZWNyZXQgfSBmcm9tICdvdHBhdXRoJztcbmltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uLy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCBBdXRoQWRhcHRlciBmcm9tICcuL0F1dGhBZGFwdGVyJztcbmNsYXNzIE1GQUFkYXB0ZXIgZXh0ZW5kcyBBdXRoQWRhcHRlciB7XG4gIHZhbGlkYXRlT3B0aW9ucyhvcHRzKSB7XG4gICAgY29uc3QgdmFsaWRPcHRpb25zID0gb3B0cy5vcHRpb25zO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWxpZE9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyAnbWZhLm9wdGlvbnMgbXVzdCBiZSBhbiBhcnJheSc7XG4gICAgfVxuICAgIHRoaXMuc21zID0gdmFsaWRPcHRpb25zLmluY2x1ZGVzKCdTTVMnKTtcbiAgICB0aGlzLnRvdHAgPSB2YWxpZE9wdGlvbnMuaW5jbHVkZXMoJ1RPVFAnKTtcbiAgICBpZiAoIXRoaXMuc21zICYmICF0aGlzLnRvdHApIHtcbiAgICAgIHRocm93ICdtZmEub3B0aW9ucyBtdXN0IGluY2x1ZGUgU01TIG9yIFRPVFAnO1xuICAgIH1cbiAgICBjb25zdCBkaWdpdHMgPSBvcHRzLmRpZ2l0cyB8fCA2O1xuICAgIGNvbnN0IHBlcmlvZCA9IG9wdHMucGVyaW9kIHx8IDMwO1xuICAgIGlmICh0eXBlb2YgZGlnaXRzICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgJ21mYS5kaWdpdHMgbXVzdCBiZSBhIG51bWJlcic7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGVyaW9kICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgJ21mYS5wZXJpb2QgbXVzdCBiZSBhIG51bWJlcic7XG4gICAgfVxuICAgIGlmIChkaWdpdHMgPCA0IHx8IGRpZ2l0cyA+IDEwKSB7XG4gICAgICB0aHJvdyAnbWZhLmRpZ2l0cyBtdXN0IGJlIGJldHdlZW4gNCBhbmQgMTAnO1xuICAgIH1cbiAgICBpZiAocGVyaW9kIDwgMTApIHtcbiAgICAgIHRocm93ICdtZmEucGVyaW9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEwJztcbiAgICB9XG4gICAgY29uc3Qgc2VuZFNNUyA9IG9wdHMuc2VuZFNNUztcbiAgICBpZiAodGhpcy5zbXMgJiYgdHlwZW9mIHNlbmRTTVMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93ICdtZmEuc2VuZFNNUyBjYWxsYmFjayBtdXN0IGJlIGRlZmluZWQgd2hlbiB1c2luZyBTTVMgT1RQcyc7XG4gICAgfVxuICAgIHRoaXMuc21zQ2FsbGJhY2sgPSBzZW5kU01TO1xuICAgIHRoaXMuZGlnaXRzID0gZGlnaXRzO1xuICAgIHRoaXMucGVyaW9kID0gcGVyaW9kO1xuICAgIHRoaXMuYWxnb3JpdGhtID0gb3B0cy5hbGdvcml0aG0gfHwgJ1NIQTEnO1xuICB9XG4gIHZhbGlkYXRlU2V0VXAobWZhRGF0YSkge1xuICAgIGlmIChtZmFEYXRhLm1vYmlsZSAmJiB0aGlzLnNtcykge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0dXBNb2JpbGVPVFAobWZhRGF0YS5tb2JpbGUpO1xuICAgIH1cbiAgICBpZiAodGhpcy50b3RwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXR1cFRPVFAobWZhRGF0YSk7XG4gICAgfVxuICAgIHRocm93ICdJbnZhbGlkIE1GQSBkYXRhJztcbiAgfVxuICBhc3luYyB2YWxpZGF0ZUxvZ2luKGxvZ2luRGF0YSwgXywgcmVxKSB7XG4gICAgY29uc3Qgc2F2ZVJlc3BvbnNlID0ge1xuICAgICAgZG9Ob3RTYXZlOiB0cnVlLFxuICAgIH07XG4gICAgY29uc3QgdG9rZW4gPSBsb2dpbkRhdGEudG9rZW47XG4gICAgY29uc3QgYXV0aCA9IHJlcS5vcmlnaW5hbC5nZXQoJ2F1dGhEYXRhJykgfHwge307XG4gICAgY29uc3QgeyBzZWNyZXQsIHJlY292ZXJ5LCBtb2JpbGUsIHRva2VuOiBzYXZlZCwgZXhwaXJ5IH0gPSBhdXRoLm1mYSB8fCB7fTtcbiAgICBpZiAodGhpcy5zbXMgJiYgbW9iaWxlKSB7XG4gICAgICBpZiAodG9rZW4gPT09ICdyZXF1ZXN0Jykge1xuICAgICAgICBjb25zdCB7IHRva2VuOiBzZW5kVG9rZW4sIGV4cGlyeSB9ID0gYXdhaXQgdGhpcy5zZW5kU01TKG1vYmlsZSk7XG4gICAgICAgIGF1dGgubWZhLnRva2VuID0gc2VuZFRva2VuO1xuICAgICAgICBhdXRoLm1mYS5leHBpcnkgPSBleHBpcnk7XG4gICAgICAgIHJlcS5vYmplY3Quc2V0KCdhdXRoRGF0YScsIGF1dGgpO1xuICAgICAgICBhd2FpdCByZXEub2JqZWN0LnNhdmUobnVsbCwgeyB1c2VNYXN0ZXJLZXk6IHRydWUgfSk7XG4gICAgICAgIHRocm93ICdQbGVhc2UgZW50ZXIgdGhlIHRva2VuJztcbiAgICAgIH1cbiAgICAgIGlmICghc2F2ZWQgfHwgdG9rZW4gIT09IHNhdmVkKSB7XG4gICAgICAgIHRocm93ICdJbnZhbGlkIE1GQSB0b2tlbiAxJztcbiAgICAgIH1cbiAgICAgIGlmIChuZXcgRGF0ZSgpID4gZXhwaXJ5KSB7XG4gICAgICAgIHRocm93ICdJbnZhbGlkIE1GQSB0b2tlbiAyJztcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBhdXRoLm1mYS50b2tlbjtcbiAgICAgIGRlbGV0ZSBhdXRoLm1mYS5leHBpcnk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzYXZlOiBhdXRoLm1mYSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnRvdHApIHtcbiAgICAgIGlmICh0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93ICdJbnZhbGlkIE1GQSB0b2tlbic7XG4gICAgICB9XG4gICAgICBpZiAoIXNlY3JldCkge1xuICAgICAgICByZXR1cm4gc2F2ZVJlc3BvbnNlO1xuICAgICAgfVxuICAgICAgaWYgKHJlY292ZXJ5WzBdID09PSB0b2tlbiB8fCByZWNvdmVyeVsxXSA9PT0gdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHNhdmVSZXNwb25zZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdHAgPSBuZXcgVE9UUCh7XG4gICAgICAgIGFsZ29yaXRobTogdGhpcy5hbGdvcml0aG0sXG4gICAgICAgIGRpZ2l0czogdGhpcy5kaWdpdHMsXG4gICAgICAgIHBlcmlvZDogdGhpcy5wZXJpb2QsXG4gICAgICAgIHNlY3JldDogU2VjcmV0LmZyb21CYXNlMzIoc2VjcmV0KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdmFsaWQgPSB0b3RwLnZhbGlkYXRlKHtcbiAgICAgICAgdG9rZW4sXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWxpZCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnSW52YWxpZCBNRkEgdG9rZW4nO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2F2ZVJlc3BvbnNlO1xuICB9XG4gIGFzeW5jIHZhbGlkYXRlVXBkYXRlKGF1dGhEYXRhLCBfLCByZXEpIHtcbiAgICBpZiAocmVxLm1hc3Rlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYXV0aERhdGEubW9iaWxlICYmIHRoaXMuc21zKSB7XG4gICAgICBpZiAoIWF1dGhEYXRhLnRva2VuKSB7XG4gICAgICAgIHRocm93ICdNRkEgaXMgYWxyZWFkeSBzZXQgdXAgb24gdGhpcyBhY2NvdW50JztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmNvbmZpcm1TTVNPVFAoYXV0aERhdGEsIHJlcS5vcmlnaW5hbC5nZXQoJ2F1dGhEYXRhJyk/Lm1mYSB8fCB7fSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvdHApIHtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVMb2dpbih7IHRva2VuOiBhdXRoRGF0YS5vbGQgfSwgbnVsbCwgcmVxKTtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2V0VXAoYXV0aERhdGEpO1xuICAgIH1cbiAgICB0aHJvdyAnSW52YWxpZCBNRkEgZGF0YSc7XG4gIH1cbiAgYWZ0ZXJGaW5kKGF1dGhEYXRhLCBvcHRpb25zLCByZXEpIHtcbiAgICBpZiAocmVxLm1hc3Rlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50b3RwICYmIGF1dGhEYXRhLnNlY3JldCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnZW5hYmxlZCcsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5zbXMgJiYgYXV0aERhdGEubW9iaWxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdlbmFibGVkJyxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdkaXNhYmxlZCcsXG4gICAgfTtcbiAgfVxuXG4gIHBvbGljeShyZXEsIGF1dGgpIHtcbiAgICBpZiAodGhpcy5zbXMgJiYgYXV0aD8ucGVuZGluZyAmJiBPYmplY3Qua2V5cyhhdXRoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiAnZGVmYXVsdCc7XG4gICAgfVxuICAgIHJldHVybiAnYWRkaXRpb25hbCc7XG4gIH1cblxuICBhc3luYyBzZXR1cE1vYmlsZU9UUChtb2JpbGUpIHtcbiAgICBjb25zdCB7IHRva2VuLCBleHBpcnkgfSA9IGF3YWl0IHRoaXMuc2VuZFNNUyhtb2JpbGUpO1xuICAgIHJldHVybiB7XG4gICAgICBzYXZlOiB7XG4gICAgICAgIHBlbmRpbmc6IHtcbiAgICAgICAgICBbbW9iaWxlXToge1xuICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICBleHBpcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRTTVMobW9iaWxlKSB7XG4gICAgaWYgKCEvXlsrXSpbKF17MCwxfVswLTldezEsM31bKV17MCwxfVstXFxzXFwuLzAtOV0qJC9nLnRlc3QobW9iaWxlKSkge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgbW9iaWxlIG51bWJlci4nO1xuICAgIH1cbiAgICBsZXQgdG9rZW4gPSAnJztcbiAgICB3aGlsZSAodG9rZW4ubGVuZ3RoIDwgdGhpcy5kaWdpdHMpIHtcbiAgICAgIHRva2VuICs9IHJhbmRvbVN0cmluZygxMCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICB9XG4gICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgdGhpcy5kaWdpdHMpO1xuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSh0aGlzLnNtc0NhbGxiYWNrKHRva2VuLCBtb2JpbGUpKTtcbiAgICBjb25zdCBleHBpcnkgPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHRoaXMucGVyaW9kICogMTAwMCk7XG4gICAgcmV0dXJuIHsgdG9rZW4sIGV4cGlyeSB9O1xuICB9XG5cbiAgYXN5bmMgY29uZmlybVNNU09UUChpbnB1dERhdGEsIGF1dGhEYXRhKSB7XG4gICAgY29uc3QgeyBtb2JpbGUsIHRva2VuIH0gPSBpbnB1dERhdGE7XG4gICAgaWYgKCFhdXRoRGF0YS5wZW5kaW5nPy5bbW9iaWxlXSkge1xuICAgICAgdGhyb3cgJ1RoaXMgbnVtYmVyIGlzIG5vdCBwZW5kaW5nJztcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZ0RhdGEgPSBhdXRoRGF0YS5wZW5kaW5nW21vYmlsZV07XG4gICAgaWYgKHRva2VuICE9PSBwZW5kaW5nRGF0YS50b2tlbikge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgTUZBIHRva2VuJztcbiAgICB9XG4gICAgaWYgKG5ldyBEYXRlKCkgPiBwZW5kaW5nRGF0YS5leHBpcnkpIHtcbiAgICAgIHRocm93ICdJbnZhbGlkIE1GQSB0b2tlbic7XG4gICAgfVxuICAgIGRlbGV0ZSBhdXRoRGF0YS5wZW5kaW5nW21vYmlsZV07XG4gICAgYXV0aERhdGEubW9iaWxlID0gbW9iaWxlO1xuICAgIHJldHVybiB7XG4gICAgICBzYXZlOiBhdXRoRGF0YSxcbiAgICB9O1xuICB9XG5cbiAgc2V0dXBUT1RQKG1mYURhdGEpIHtcbiAgICBjb25zdCB7IHNlY3JldCwgdG9rZW4gfSA9IG1mYURhdGE7XG4gICAgaWYgKCFzZWNyZXQgfHwgIXRva2VuIHx8IHNlY3JldC5sZW5ndGggPCAyMCkge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgTUZBIGRhdGEnO1xuICAgIH1cbiAgICBjb25zdCB0b3RwID0gbmV3IFRPVFAoe1xuICAgICAgYWxnb3JpdGhtOiB0aGlzLmFsZ29yaXRobSxcbiAgICAgIGRpZ2l0czogdGhpcy5kaWdpdHMsXG4gICAgICBwZXJpb2Q6IHRoaXMucGVyaW9kLFxuICAgICAgc2VjcmV0OiBTZWNyZXQuZnJvbUJhc2UzMihzZWNyZXQpLFxuICAgIH0pO1xuICAgIGNvbnN0IHZhbGlkID0gdG90cC52YWxpZGF0ZSh7XG4gICAgICB0b2tlbixcbiAgICB9KTtcbiAgICBpZiAodmFsaWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93ICdJbnZhbGlkIE1GQSB0b2tlbic7XG4gICAgfVxuICAgIGNvbnN0IHJlY292ZXJ5ID0gW3JhbmRvbVN0cmluZygzMCksIHJhbmRvbVN0cmluZygzMCldO1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZTogeyByZWNvdmVyeTogcmVjb3Zlcnkuam9pbignLCAnKSB9LFxuICAgICAgc2F2ZTogeyBzZWNyZXQsIHJlY292ZXJ5IH0sXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbmV3IE1GQUFkYXB0ZXIoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBOEVBLElBQUFBLFFBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUF3QyxTQUFBRyx1QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQWhGeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUt3QyxXQUFXLENBQUN4QyxLQUFLLEVBQUU7TUFDL0IsTUFBTSxtQkFBbUI7SUFDM0I7SUFDQSxJQUFJLElBQUljLElBQUksQ0FBQyxDQUFDLEdBQUcwQixXQUFXLENBQUNqQyxNQUFNLEVBQUU7TUFDbkMsTUFBTSxtQkFBbUI7SUFDM0I7SUFDQSxPQUFPYyxRQUFRLENBQUNPLE9BQU8sQ0FBQ3JDLE1BQU0sQ0FBQztJQUMvQjhCLFFBQVEsQ0FBQzlCLE1BQU0sR0FBR0EsTUFBTTtJQUN4QixPQUFPO01BQ0xxQixJQUFJLEVBQUVTO0lBQ1IsQ0FBQztFQUNIO0VBRUE1QixTQUFTQSxDQUFDSCxPQUFPLEVBQUU7SUFDakIsTUFBTTtNQUFFYyxNQUFNO01BQUVKO0lBQU0sQ0FBQyxHQUFHVixPQUFPO0lBQ2pDLElBQUksQ0FBQ2MsTUFBTSxJQUFJLENBQUNKLEtBQUssSUFBSUksTUFBTSxDQUFDMkIsTUFBTSxHQUFHLEVBQUUsRUFBRTtNQUMzQyxNQUFNLGtCQUFrQjtJQUMxQjtJQUNBLE1BQU1oRCxJQUFJLEdBQUcsSUFBSWdDLGFBQUksQ0FBQztNQUNwQjNCLFNBQVMsRUFBRSxJQUFJLENBQUNBLFNBQVM7TUFDekJKLE1BQU0sRUFBRSxJQUFJLENBQUNBLE1BQU07TUFDbkJDLE1BQU0sRUFBRSxJQUFJLENBQUNBLE1BQU07TUFDbkJtQixNQUFNLEVBQUVZLGVBQU0sQ0FBQ0MsVUFBVSxDQUFDYixNQUFNO0lBQ2xDLENBQUMsQ0FBQztJQUNGLE1BQU1jLEtBQUssR0FBR25DLElBQUksQ0FBQ29DLFFBQVEsQ0FBQztNQUMxQm5CO0lBQ0YsQ0FBQyxDQUFDO0lBQ0YsSUFBSWtCLEtBQUssS0FBSyxJQUFJLEVBQUU7TUFDbEIsTUFBTSxtQkFBbUI7SUFDM0I7SUFDQSxNQUFNYixRQUFRLEdBQUcsQ0FBQyxJQUFBNEIseUJBQVksRUFBQyxFQUFFLENBQUMsRUFBRSxJQUFBQSx5QkFBWSxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELE9BQU87TUFDTFEsUUFBUSxFQUFFO1FBQUVwQyxRQUFRLEVBQUVBLFFBQVEsQ0FBQ3FDLElBQUksQ0FBQyxJQUFJO01BQUUsQ0FBQztNQUMzQzlCLElBQUksRUFBRTtRQUFFUixNQUFNO1FBQUVDO01BQVM7SUFDM0IsQ0FBQztFQUNIO0FBQ0Y7QUFBQyxJQUFBc0MsUUFBQSxHQUFBQyxPQUFBLENBQUF4RSxPQUFBLEdBQ2MsSUFBSUMsVUFBVSxDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=