@beiguancyc/parse-server 9.9.0-ruixiang.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 (251) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +10 -0
  3. package/README.md +1311 -0
  4. package/bin/parse-live-query-server +3 -0
  5. package/bin/parse-server +3 -0
  6. package/lib/AccountLockout.js +149 -0
  7. package/lib/Adapters/AdapterLoader.js +60 -0
  8. package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
  9. package/lib/Adapters/Auth/AuthAdapter.js +132 -0
  10. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
  11. package/lib/Adapters/Auth/OAuth1Client.js +204 -0
  12. package/lib/Adapters/Auth/apple.js +125 -0
  13. package/lib/Adapters/Auth/facebook.js +187 -0
  14. package/lib/Adapters/Auth/gcenter.js +217 -0
  15. package/lib/Adapters/Auth/github.js +125 -0
  16. package/lib/Adapters/Auth/google.js +122 -0
  17. package/lib/Adapters/Auth/gpgames.js +125 -0
  18. package/lib/Adapters/Auth/httpsRequest.js +41 -0
  19. package/lib/Adapters/Auth/index.js +248 -0
  20. package/lib/Adapters/Auth/instagram.js +118 -0
  21. package/lib/Adapters/Auth/janraincapture.js +85 -0
  22. package/lib/Adapters/Auth/janrainengage.js +57 -0
  23. package/lib/Adapters/Auth/keycloak.js +168 -0
  24. package/lib/Adapters/Auth/ldap.js +193 -0
  25. package/lib/Adapters/Auth/line.js +125 -0
  26. package/lib/Adapters/Auth/linkedin.js +117 -0
  27. package/lib/Adapters/Auth/meetup.js +44 -0
  28. package/lib/Adapters/Auth/mfa.js +334 -0
  29. package/lib/Adapters/Auth/microsoft.js +111 -0
  30. package/lib/Adapters/Auth/oauth2.js +115 -0
  31. package/lib/Adapters/Auth/phantauth.js +53 -0
  32. package/lib/Adapters/Auth/qq.js +113 -0
  33. package/lib/Adapters/Auth/spotify.js +115 -0
  34. package/lib/Adapters/Auth/twitter.js +197 -0
  35. package/lib/Adapters/Auth/utils.js +28 -0
  36. package/lib/Adapters/Auth/vkontakte.js +55 -0
  37. package/lib/Adapters/Auth/wechat.js +110 -0
  38. package/lib/Adapters/Auth/weibo.js +141 -0
  39. package/lib/Adapters/Cache/CacheAdapter.js +40 -0
  40. package/lib/Adapters/Cache/InMemoryCache.js +61 -0
  41. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
  42. package/lib/Adapters/Cache/LRUCache.js +35 -0
  43. package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
  44. package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
  45. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  46. package/lib/Adapters/Email/MailAdapter.js +32 -0
  47. package/lib/Adapters/Files/FilesAdapter.js +129 -0
  48. package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
  49. package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
  50. package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
  51. package/lib/Adapters/Logger/WinstonLogger.js +107 -0
  52. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
  53. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
  54. package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
  55. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  56. package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
  57. package/lib/Adapters/Push/PushAdapter.js +40 -0
  58. package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
  59. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
  60. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
  61. package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
  62. package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
  63. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
  64. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
  65. package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
  66. package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
  67. package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
  68. package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
  69. package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
  70. package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
  71. package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
  72. package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
  73. package/lib/Adapters/Storage/StorageAdapter.js +2 -0
  74. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  75. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  76. package/lib/Auth.js +687 -0
  77. package/lib/AuthDataLock.js +53 -0
  78. package/lib/ClientSDK.js +39 -0
  79. package/lib/Config.js +879 -0
  80. package/lib/Controllers/AdaptableController.js +72 -0
  81. package/lib/Controllers/AnalyticsController.js +43 -0
  82. package/lib/Controllers/CacheController.js +71 -0
  83. package/lib/Controllers/DatabaseController.js +1685 -0
  84. package/lib/Controllers/FilesController.js +122 -0
  85. package/lib/Controllers/HooksController.js +254 -0
  86. package/lib/Controllers/LiveQueryController.js +72 -0
  87. package/lib/Controllers/LoggerController.js +222 -0
  88. package/lib/Controllers/ParseGraphQLController.js +294 -0
  89. package/lib/Controllers/PushController.js +224 -0
  90. package/lib/Controllers/SchemaController.js +1563 -0
  91. package/lib/Controllers/UserController.js +364 -0
  92. package/lib/Controllers/index.js +251 -0
  93. package/lib/Controllers/types.js +2 -0
  94. package/lib/Deprecator/Deprecations.js +100 -0
  95. package/lib/Deprecator/Deprecator.js +140 -0
  96. package/lib/Error.js +50 -0
  97. package/lib/FileUrlValidator.js +69 -0
  98. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  99. package/lib/GraphQL/ParseGraphQLServer.js +241 -0
  100. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  101. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  102. package/lib/GraphQL/helpers/queryComplexity.js +138 -0
  103. package/lib/GraphQL/loaders/configMutations.js +87 -0
  104. package/lib/GraphQL/loaders/configQueries.js +79 -0
  105. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  106. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  107. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
  108. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  109. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  110. package/lib/GraphQL/loaders/functionsMutations.js +77 -0
  111. package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
  112. package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
  113. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  114. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  115. package/lib/GraphQL/loaders/schemaMutations.js +161 -0
  116. package/lib/GraphQL/loaders/schemaQueries.js +80 -0
  117. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  118. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  119. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  120. package/lib/GraphQL/parseGraphQLUtils.js +71 -0
  121. package/lib/GraphQL/transformers/className.js +14 -0
  122. package/lib/GraphQL/transformers/constraintType.js +53 -0
  123. package/lib/GraphQL/transformers/inputType.js +51 -0
  124. package/lib/GraphQL/transformers/mutation.js +280 -0
  125. package/lib/GraphQL/transformers/outputType.js +51 -0
  126. package/lib/GraphQL/transformers/query.js +237 -0
  127. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  128. package/lib/InstallationDedup.js +178 -0
  129. package/lib/KeyPromiseQueue.js +48 -0
  130. package/lib/LiveQuery/Client.js +90 -0
  131. package/lib/LiveQuery/Id.js +20 -0
  132. package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
  133. package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
  134. package/lib/LiveQuery/ParsePubSub.js +37 -0
  135. package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
  136. package/lib/LiveQuery/QueryTools.js +443 -0
  137. package/lib/LiveQuery/RequestSchema.js +161 -0
  138. package/lib/LiveQuery/SessionTokenCache.js +51 -0
  139. package/lib/LiveQuery/Subscription.js +47 -0
  140. package/lib/LiveQuery/equalObjects.js +50 -0
  141. package/lib/Options/Definitions.js +1599 -0
  142. package/lib/Options/docs.js +389 -0
  143. package/lib/Options/index.js +12 -0
  144. package/lib/Options/parsers.js +89 -0
  145. package/lib/Page.js +44 -0
  146. package/lib/ParseMessageQueue.js +24 -0
  147. package/lib/ParseServer.js +632 -0
  148. package/lib/ParseServerRESTController.js +173 -0
  149. package/lib/PromiseRouter.js +208 -0
  150. package/lib/Push/PushQueue.js +67 -0
  151. package/lib/Push/PushWorker.js +101 -0
  152. package/lib/Push/utils.js +129 -0
  153. package/lib/RestQuery.js +1208 -0
  154. package/lib/RestWrite.js +1671 -0
  155. package/lib/Routers/AggregateRouter.js +150 -0
  156. package/lib/Routers/AnalyticsRouter.js +26 -0
  157. package/lib/Routers/AudiencesRouter.js +54 -0
  158. package/lib/Routers/ClassesRouter.js +191 -0
  159. package/lib/Routers/CloudCodeRouter.js +87 -0
  160. package/lib/Routers/FeaturesRouter.js +72 -0
  161. package/lib/Routers/FilesRouter.js +772 -0
  162. package/lib/Routers/FunctionsRouter.js +341 -0
  163. package/lib/Routers/GlobalConfigRouter.js +123 -0
  164. package/lib/Routers/GraphQLRouter.js +41 -0
  165. package/lib/Routers/HooksRouter.js +121 -0
  166. package/lib/Routers/IAPValidationRouter.js +113 -0
  167. package/lib/Routers/InstallationsRouter.js +46 -0
  168. package/lib/Routers/LogsRouter.js +57 -0
  169. package/lib/Routers/PagesRouter.js +676 -0
  170. package/lib/Routers/PurgeRouter.js +45 -0
  171. package/lib/Routers/PushRouter.js +75 -0
  172. package/lib/Routers/RolesRouter.js +33 -0
  173. package/lib/Routers/SchemasRouter.js +118 -0
  174. package/lib/Routers/SecurityRouter.js +34 -0
  175. package/lib/Routers/SessionsRouter.js +126 -0
  176. package/lib/Routers/UsersRouter.js +733 -0
  177. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  178. package/lib/SchemaMigrations/Migrations.js +30 -0
  179. package/lib/Security/Check.js +109 -0
  180. package/lib/Security/CheckGroup.js +44 -0
  181. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  182. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
  183. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  184. package/lib/Security/CheckRunner.js +213 -0
  185. package/lib/SharedRest.js +34 -0
  186. package/lib/StatusHandler.js +329 -0
  187. package/lib/TestUtils.js +87 -0
  188. package/lib/Utils.js +577 -0
  189. package/lib/batch.js +185 -0
  190. package/lib/cache.js +12 -0
  191. package/lib/cli/definitions/parse-live-query-server.js +9 -0
  192. package/lib/cli/definitions/parse-server.js +9 -0
  193. package/lib/cli/parse-live-query-server.js +14 -0
  194. package/lib/cli/parse-server.js +101 -0
  195. package/lib/cli/utils/commander.js +132 -0
  196. package/lib/cli/utils/runner.js +53 -0
  197. package/lib/cloud-code/Parse.Cloud.js +797 -0
  198. package/lib/cloud-code/Parse.Server.js +21 -0
  199. package/lib/cryptoUtils.js +54 -0
  200. package/lib/defaults.js +58 -0
  201. package/lib/deprecated.js +12 -0
  202. package/lib/index.js +89 -0
  203. package/lib/logger.js +40 -0
  204. package/lib/middlewares.js +810 -0
  205. package/lib/password.js +40 -0
  206. package/lib/request.js +175 -0
  207. package/lib/requiredParameter.js +11 -0
  208. package/lib/rest.js +264 -0
  209. package/lib/triggers.js +949 -0
  210. package/lib/vendor/README.md +8 -0
  211. package/lib/vendor/mongodbUrl.js +1012 -0
  212. package/package.json +172 -0
  213. package/postinstall.js +38 -0
  214. package/public/custom_json.html +17 -0
  215. package/public/custom_json.json +23 -0
  216. package/public/custom_page.html +15 -0
  217. package/public/de/email_verification_link_expired.html +24 -0
  218. package/public/de/email_verification_link_invalid.html +21 -0
  219. package/public/de/email_verification_send_fail.html +21 -0
  220. package/public/de/email_verification_send_success.html +19 -0
  221. package/public/de/email_verification_success.html +18 -0
  222. package/public/de/password_reset.html +65 -0
  223. package/public/de/password_reset_link_invalid.html +19 -0
  224. package/public/de/password_reset_success.html +18 -0
  225. package/public/de-AT/email_verification_link_expired.html +24 -0
  226. package/public/de-AT/email_verification_link_invalid.html +21 -0
  227. package/public/de-AT/email_verification_send_fail.html +21 -0
  228. package/public/de-AT/email_verification_send_success.html +19 -0
  229. package/public/de-AT/email_verification_success.html +18 -0
  230. package/public/de-AT/password_reset.html +65 -0
  231. package/public/de-AT/password_reset_link_invalid.html +19 -0
  232. package/public/de-AT/password_reset_success.html +18 -0
  233. package/public/email_verification_link_expired.html +24 -0
  234. package/public/email_verification_link_invalid.html +21 -0
  235. package/public/email_verification_send_fail.html +21 -0
  236. package/public/email_verification_send_success.html +19 -0
  237. package/public/email_verification_success.html +18 -0
  238. package/public/password_reset.html +65 -0
  239. package/public/password_reset_link_invalid.html +19 -0
  240. package/public/password_reset_success.html +18 -0
  241. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  242. package/types/@types/deepcopy/index.d.ts +5 -0
  243. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  244. package/types/Options/index.d.ts +320 -0
  245. package/types/ParseServer.d.ts +65 -0
  246. package/types/eslint.config.mjs +30 -0
  247. package/types/index.d.ts +21 -0
  248. package/types/logger.d.ts +2 -0
  249. package/types/tests.ts +44 -0
  250. package/types/tsconfig.json +24 -0
  251. package/views/choose_password +215 -0
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _crypto = _interopRequireDefault(require("crypto"));
8
+ var _nodeForge = require("node-forge");
9
+ var _AuthAdapter = _interopRequireDefault(require("./AuthAdapter"));
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ /**
12
+ * Parse Server authentication adapter for Apple Game Center.
13
+ *
14
+ * @class AppleGameCenterAdapter
15
+ * @param {Object} options - Configuration options for the adapter.
16
+ * @param {string} options.bundleId - Your Apple Game Center bundle ID. Required for secure authentication.
17
+ * @param {boolean} [options.enableInsecureAuth=false] - **[DEPRECATED]** Enable insecure authentication (not recommended).
18
+ *
19
+ * @param {Object} authData - The authentication data provided by the client.
20
+ * @param {string} authData.id - The user ID obtained from Apple Game Center.
21
+ * @param {string} authData.publicKeyUrl - The public key URL obtained from Apple Game Center.
22
+ * @param {string} authData.timestamp - The timestamp obtained from Apple Game Center.
23
+ * @param {string} authData.signature - The signature obtained from Apple Game Center.
24
+ * @param {string} authData.salt - The salt obtained from Apple Game Center.
25
+ * @param {string} [authData.bundleId] - **[DEPRECATED]** The bundle ID obtained from Apple Game Center (required for insecure authentication).
26
+ *
27
+ * @description
28
+ * ## Parse Server Configuration
29
+ * The following `authData` fields are required:
30
+ * `id`, `publicKeyUrl`, `timestamp`, `signature`, and `salt`. These fields are validated against the configured `bundleId` for additional security.
31
+ *
32
+ * To configure Parse Server for Apple Game Center authentication, use the following structure:
33
+ * ```json
34
+ * {
35
+ * "auth": {
36
+ * "gcenter": {
37
+ * "bundleId": "com.valid.app"
38
+ * }
39
+ * }
40
+ * ```
41
+ *
42
+ * ## Insecure Authentication (Not Recommended)
43
+ * The following `authData` fields are required for insecure authentication:
44
+ * `id`, `publicKeyUrl`, `timestamp`, `signature`, `salt`, and `bundleId` (**[DEPRECATED]**). This flow is insecure and poses potential security risks.
45
+ *
46
+ * To configure Parse Server for insecure authentication, use the following structure:
47
+ * ```json
48
+ * {
49
+ * "auth": {
50
+ * "gcenter": {
51
+ * "enableInsecureAuth": true
52
+ * }
53
+ * }
54
+ * ```
55
+ *
56
+ * ### Deprecation Notice
57
+ * The `enableInsecureAuth` option and `authData.bundleId` parameter are deprecated and may be removed in future releases. Use secure authentication with the `bundleId` configured in the `options` object instead.
58
+ *
59
+ *
60
+ * @example <caption>Secure Authentication Example</caption>
61
+ * // Example authData for secure authentication:
62
+ * const authData = {
63
+ * gcenter: {
64
+ * id: "1234567",
65
+ * publicKeyUrl: "https://valid.apple.com/public/timeout.cer",
66
+ * timestamp: 1460981421303,
67
+ * salt: "saltST==",
68
+ * signature: "PoDwf39DCN464B49jJCU0d9Y0J"
69
+ * }
70
+ * };
71
+ *
72
+ * @example <caption>Insecure Authentication Example (Not Recommended)</caption>
73
+ * // Example authData for insecure authentication:
74
+ * const authData = {
75
+ * gcenter: {
76
+ * id: "1234567",
77
+ * publicKeyUrl: "https://valid.apple.com/public/timeout.cer",
78
+ * timestamp: 1460981421303,
79
+ * salt: "saltST==",
80
+ * signature: "PoDwf39DCN464B49jJCU0d9Y0J",
81
+ * bundleId: "com.valid.app" // Deprecated.
82
+ * }
83
+ * };
84
+ *
85
+ * @see {@link https://developer.apple.com/documentation/gamekit/gklocalplayer/3516283-fetchitems Apple Game Center Documentation}
86
+ */
87
+ /* global BigInt */
88
+
89
+ class GameCenterAuth extends _AuthAdapter.default {
90
+ constructor() {
91
+ super();
92
+ this.ca = {
93
+ cert: null,
94
+ url: null
95
+ };
96
+ this.cache = {};
97
+ this.bundleId = '';
98
+ }
99
+ validateOptions(options) {
100
+ if (!options) {
101
+ throw new Error('Game center auth options are required.');
102
+ }
103
+ if (!this.loadingPromise) {
104
+ this.loadingPromise = this.loadCertificate(options);
105
+ }
106
+ this.enableInsecureAuth = options.enableInsecureAuth;
107
+ this.bundleId = options.bundleId;
108
+ if (!this.enableInsecureAuth && !this.bundleId) {
109
+ throw new Error('bundleId is required for secure auth.');
110
+ }
111
+ }
112
+ async loadCertificate(options) {
113
+ const rootCertificateUrl = options.rootCertificateUrl || 'https://cacerts.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crt.pem';
114
+ if (this.ca.url === rootCertificateUrl) {
115
+ return rootCertificateUrl;
116
+ }
117
+ const {
118
+ certificate,
119
+ headers
120
+ } = await this.fetchCertificate(rootCertificateUrl);
121
+ if (headers.get('content-type') !== 'application/x-pem-file' || !headers.get('content-length') || parseInt(headers.get('content-length'), 10) > 10000) {
122
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Invalid rootCertificateURL.');
123
+ }
124
+ this.ca.cert = _nodeForge.pki.certificateFromPem(certificate);
125
+ this.ca.url = rootCertificateUrl;
126
+ return rootCertificateUrl;
127
+ }
128
+ verifyPublicKeyUrl(publicKeyUrl) {
129
+ const regex = /^https:\/\/(?:[-_A-Za-z0-9]+\.){0,}apple\.com\/.*\.cer$/;
130
+ return regex.test(publicKeyUrl);
131
+ }
132
+ async fetchCertificate(url) {
133
+ const response = await fetch(url);
134
+ if (!response.ok) {
135
+ throw new Error(`Failed to fetch certificate: ${url}`);
136
+ }
137
+ const contentType = response.headers.get('content-type');
138
+ const isPem = contentType?.includes('application/x-pem-file');
139
+ if (isPem) {
140
+ const certificate = await response.text();
141
+ return {
142
+ certificate,
143
+ headers: response.headers
144
+ };
145
+ }
146
+ const data = await response.arrayBuffer();
147
+ const binaryData = Buffer.from(data);
148
+ const asn1Cert = _nodeForge.asn1.fromDer(binaryData.toString('binary'));
149
+ const forgeCert = _nodeForge.pki.certificateFromAsn1(asn1Cert);
150
+ const certificate = _nodeForge.pki.certificateToPem(forgeCert);
151
+ return {
152
+ certificate,
153
+ headers: response.headers
154
+ };
155
+ }
156
+ async getAppleCertificate(publicKeyUrl) {
157
+ if (!this.verifyPublicKeyUrl(publicKeyUrl)) {
158
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Invalid publicKeyUrl: ${publicKeyUrl}`);
159
+ }
160
+ if (this.cache[publicKeyUrl]) {
161
+ return this.cache[publicKeyUrl];
162
+ }
163
+ const {
164
+ certificate,
165
+ headers
166
+ } = await this.fetchCertificate(publicKeyUrl);
167
+ const cacheControl = headers.get('cache-control');
168
+ const expire = cacheControl?.match(/max-age=([0-9]+)/);
169
+ this.verifyPublicKeyIssuer(certificate, publicKeyUrl);
170
+ if (expire) {
171
+ this.cache[publicKeyUrl] = certificate;
172
+ setTimeout(() => delete this.cache[publicKeyUrl], parseInt(expire[1], 10) * 1000);
173
+ }
174
+ return certificate;
175
+ }
176
+ verifyPublicKeyIssuer(cert, publicKeyUrl) {
177
+ const publicKeyCert = _nodeForge.pki.certificateFromPem(cert);
178
+ if (!this.ca.cert) {
179
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Root certificate is invalid or missing.');
180
+ }
181
+ if (!this.ca.cert.verify(publicKeyCert)) {
182
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Invalid publicKeyUrl: ${publicKeyUrl}`);
183
+ }
184
+ }
185
+ verifySignature(publicKey, authData) {
186
+ const bundleId = this.bundleId || this.enableInsecureAuth && authData.bundleId;
187
+ const verifier = _crypto.default.createVerify('sha256');
188
+ verifier.update(Buffer.from(authData.id, 'utf8'));
189
+ verifier.update(Buffer.from(bundleId, 'utf8'));
190
+ verifier.update(this.convertTimestampToBigEndian(authData.timestamp));
191
+ verifier.update(Buffer.from(authData.salt, 'base64'));
192
+ if (!verifier.verify(publicKey, authData.signature, 'base64')) {
193
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Invalid signature.');
194
+ }
195
+ }
196
+ async validateAuthData(authData) {
197
+ const requiredKeys = ['id', 'publicKeyUrl', 'timestamp', 'signature', 'salt'];
198
+ if (this.enableInsecureAuth) {
199
+ requiredKeys.push('bundleId');
200
+ }
201
+ for (const key of requiredKeys) {
202
+ if (!authData[key]) {
203
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `AuthData ${key} is missing.`);
204
+ }
205
+ }
206
+ await this.loadingPromise;
207
+ const publicKey = await this.getAppleCertificate(authData.publicKeyUrl);
208
+ this.verifySignature(publicKey, authData);
209
+ }
210
+ convertTimestampToBigEndian(timestamp) {
211
+ const buffer = Buffer.alloc(8);
212
+ buffer.writeBigUInt64BE(BigInt(timestamp));
213
+ return buffer;
214
+ }
215
+ }
216
+ var _default = exports.default = new GameCenterAuth();
217
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbm9kZUZvcmdlIiwiX0F1dGhBZGFwdGVyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiR2FtZUNlbnRlckF1dGgiLCJBdXRoQWRhcHRlciIsImNvbnN0cnVjdG9yIiwiY2EiLCJjZXJ0IiwidXJsIiwiY2FjaGUiLCJidW5kbGVJZCIsInZhbGlkYXRlT3B0aW9ucyIsIm9wdGlvbnMiLCJFcnJvciIsImxvYWRpbmdQcm9taXNlIiwibG9hZENlcnRpZmljYXRlIiwiZW5hYmxlSW5zZWN1cmVBdXRoIiwicm9vdENlcnRpZmljYXRlVXJsIiwiY2VydGlmaWNhdGUiLCJoZWFkZXJzIiwiZmV0Y2hDZXJ0aWZpY2F0ZSIsImdldCIsInBhcnNlSW50IiwiUGFyc2UiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwicGtpIiwiY2VydGlmaWNhdGVGcm9tUGVtIiwidmVyaWZ5UHVibGljS2V5VXJsIiwicHVibGljS2V5VXJsIiwicmVnZXgiLCJ0ZXN0IiwicmVzcG9uc2UiLCJmZXRjaCIsIm9rIiwiY29udGVudFR5cGUiLCJpc1BlbSIsImluY2x1ZGVzIiwidGV4dCIsImRhdGEiLCJhcnJheUJ1ZmZlciIsImJpbmFyeURhdGEiLCJCdWZmZXIiLCJmcm9tIiwiYXNuMUNlcnQiLCJhc24xIiwiZnJvbURlciIsInRvU3RyaW5nIiwiZm9yZ2VDZXJ0IiwiY2VydGlmaWNhdGVGcm9tQXNuMSIsImNlcnRpZmljYXRlVG9QZW0iLCJnZXRBcHBsZUNlcnRpZmljYXRlIiwiY2FjaGVDb250cm9sIiwiZXhwaXJlIiwibWF0Y2giLCJ2ZXJpZnlQdWJsaWNLZXlJc3N1ZXIiLCJzZXRUaW1lb3V0IiwicHVibGljS2V5Q2VydCIsInZlcmlmeSIsInZlcmlmeVNpZ25hdHVyZSIsInB1YmxpY0tleSIsImF1dGhEYXRhIiwidmVyaWZpZXIiLCJjcnlwdG8iLCJjcmVhdGVWZXJpZnkiLCJ1cGRhdGUiLCJpZCIsImNvbnZlcnRUaW1lc3RhbXBUb0JpZ0VuZGlhbiIsInRpbWVzdGFtcCIsInNhbHQiLCJzaWduYXR1cmUiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwicmVxdWlyZWRLZXlzIiwicHVzaCIsImtleSIsImJ1ZmZlciIsImFsbG9jIiwid3JpdGVCaWdVSW50NjRCRSIsIkJpZ0ludCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXJzZSBTZXJ2ZXIgYXV0aGVudGljYXRpb24gYWRhcHRlciBmb3IgQXBwbGUgR2FtZSBDZW50ZXIuXG4gKlxuICogQGNsYXNzIEFwcGxlR2FtZUNlbnRlckFkYXB0ZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmJ1bmRsZUlkIC0gWW91ciBBcHBsZSBHYW1lIENlbnRlciBidW5kbGUgSUQuIFJlcXVpcmVkIGZvciBzZWN1cmUgYXV0aGVudGljYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmVuYWJsZUluc2VjdXJlQXV0aD1mYWxzZV0gLSAqKltERVBSRUNBVEVEXSoqIEVuYWJsZSBpbnNlY3VyZSBhdXRoZW50aWNhdGlvbiAobm90IHJlY29tbWVuZGVkKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXV0aERhdGEgLSBUaGUgYXV0aGVudGljYXRpb24gZGF0YSBwcm92aWRlZCBieSB0aGUgY2xpZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGF1dGhEYXRhLmlkIC0gVGhlIHVzZXIgSUQgb2J0YWluZWQgZnJvbSBBcHBsZSBHYW1lIENlbnRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoRGF0YS5wdWJsaWNLZXlVcmwgLSBUaGUgcHVibGljIGtleSBVUkwgb2J0YWluZWQgZnJvbSBBcHBsZSBHYW1lIENlbnRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoRGF0YS50aW1lc3RhbXAgLSBUaGUgdGltZXN0YW1wIG9idGFpbmVkIGZyb20gQXBwbGUgR2FtZSBDZW50ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXV0aERhdGEuc2lnbmF0dXJlIC0gVGhlIHNpZ25hdHVyZSBvYnRhaW5lZCBmcm9tIEFwcGxlIEdhbWUgQ2VudGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGF1dGhEYXRhLnNhbHQgLSBUaGUgc2FsdCBvYnRhaW5lZCBmcm9tIEFwcGxlIEdhbWUgQ2VudGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthdXRoRGF0YS5idW5kbGVJZF0gLSAqKltERVBSRUNBVEVEXSoqIFRoZSBidW5kbGUgSUQgb2J0YWluZWQgZnJvbSBBcHBsZSBHYW1lIENlbnRlciAocmVxdWlyZWQgZm9yIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uKS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICMjIFBhcnNlIFNlcnZlciBDb25maWd1cmF0aW9uXG4gKiBUaGUgZm9sbG93aW5nIGBhdXRoRGF0YWAgZmllbGRzIGFyZSByZXF1aXJlZDpcbiAqIGBpZGAsIGBwdWJsaWNLZXlVcmxgLCBgdGltZXN0YW1wYCwgYHNpZ25hdHVyZWAsIGFuZCBgc2FsdGAuIFRoZXNlIGZpZWxkcyBhcmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlIGNvbmZpZ3VyZWQgYGJ1bmRsZUlkYCBmb3IgYWRkaXRpb25hbCBzZWN1cml0eS5cbiAqXG4gKiBUbyBjb25maWd1cmUgUGFyc2UgU2VydmVyIGZvciBBcHBsZSBHYW1lIENlbnRlciBhdXRoZW50aWNhdGlvbiwgdXNlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICogYGBganNvblxuICoge1xuICogIFwiYXV0aFwiOiB7XG4gKiAgICBcImdjZW50ZXJcIjoge1xuICogICAgIFwiYnVuZGxlSWRcIjogXCJjb20udmFsaWQuYXBwXCJcbiAqICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBJbnNlY3VyZSBBdXRoZW50aWNhdGlvbiAoTm90IFJlY29tbWVuZGVkKVxuICogVGhlIGZvbGxvd2luZyBgYXV0aERhdGFgIGZpZWxkcyBhcmUgcmVxdWlyZWQgZm9yIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uOlxuICogYGlkYCwgYHB1YmxpY0tleVVybGAsIGB0aW1lc3RhbXBgLCBgc2lnbmF0dXJlYCwgYHNhbHRgLCBhbmQgYGJ1bmRsZUlkYCAoKipbREVQUkVDQVRFRF0qKikuIFRoaXMgZmxvdyBpcyBpbnNlY3VyZSBhbmQgcG9zZXMgcG90ZW50aWFsIHNlY3VyaXR5IHJpc2tzLlxuICpcbiAqIFRvIGNvbmZpZ3VyZSBQYXJzZSBTZXJ2ZXIgZm9yIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uLCB1c2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYXV0aFwiOiB7XG4gKiAgICBcImdjZW50ZXJcIjoge1xuICogICAgICBcImVuYWJsZUluc2VjdXJlQXV0aFwiOiB0cnVlXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIyBEZXByZWNhdGlvbiBOb3RpY2VcbiAqIFRoZSBgZW5hYmxlSW5zZWN1cmVBdXRoYCBvcHRpb24gYW5kIGBhdXRoRGF0YS5idW5kbGVJZGAgcGFyYW1ldGVyIGFyZSBkZXByZWNhdGVkIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgcmVsZWFzZXMuIFVzZSBzZWN1cmUgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgYGJ1bmRsZUlkYCBjb25maWd1cmVkIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGluc3RlYWQuXG4gKlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPlNlY3VyZSBBdXRoZW50aWNhdGlvbiBFeGFtcGxlPC9jYXB0aW9uPlxuICogLy8gRXhhbXBsZSBhdXRoRGF0YSBmb3Igc2VjdXJlIGF1dGhlbnRpY2F0aW9uOlxuICogY29uc3QgYXV0aERhdGEgPSB7XG4gKiAgIGdjZW50ZXI6IHtcbiAqICAgICBpZDogXCIxMjM0NTY3XCIsXG4gKiAgICAgcHVibGljS2V5VXJsOiBcImh0dHBzOi8vdmFsaWQuYXBwbGUuY29tL3B1YmxpYy90aW1lb3V0LmNlclwiLFxuICogICAgIHRpbWVzdGFtcDogMTQ2MDk4MTQyMTMwMyxcbiAqICAgICBzYWx0OiBcInNhbHRTVD09XCIsXG4gKiAgICAgc2lnbmF0dXJlOiBcIlBvRHdmMzlEQ040NjRCNDlqSkNVMGQ5WTBKXCJcbiAqICAgfVxuICogfTtcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5JbnNlY3VyZSBBdXRoZW50aWNhdGlvbiBFeGFtcGxlIChOb3QgUmVjb21tZW5kZWQpPC9jYXB0aW9uPlxuICogLy8gRXhhbXBsZSBhdXRoRGF0YSBmb3IgaW5zZWN1cmUgYXV0aGVudGljYXRpb246XG4gKiBjb25zdCBhdXRoRGF0YSA9IHtcbiAqICAgZ2NlbnRlcjoge1xuICogICAgIGlkOiBcIjEyMzQ1NjdcIixcbiAqICAgICBwdWJsaWNLZXlVcmw6IFwiaHR0cHM6Ly92YWxpZC5hcHBsZS5jb20vcHVibGljL3RpbWVvdXQuY2VyXCIsXG4gKiAgICAgdGltZXN0YW1wOiAxNDYwOTgxNDIxMzAzLFxuICogICAgIHNhbHQ6IFwic2FsdFNUPT1cIixcbiAqICAgICBzaWduYXR1cmU6IFwiUG9Ed2YzOURDTjQ2NEI0OWpKQ1UwZDlZMEpcIixcbiAqICAgICBidW5kbGVJZDogXCJjb20udmFsaWQuYXBwXCIgLy8gRGVwcmVjYXRlZC5cbiAqICAgfVxuICogfTtcbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9nYW1la2l0L2drbG9jYWxwbGF5ZXIvMzUxNjI4My1mZXRjaGl0ZW1zIEFwcGxlIEdhbWUgQ2VudGVyIERvY3VtZW50YXRpb259XG4gKi9cbi8qIGdsb2JhbCBCaWdJbnQgKi9cblxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgYXNuMSwgcGtpIH0gZnJvbSAnbm9kZS1mb3JnZSc7XG5pbXBvcnQgQXV0aEFkYXB0ZXIgZnJvbSAnLi9BdXRoQWRhcHRlcic7XG5jbGFzcyBHYW1lQ2VudGVyQXV0aCBleHRlbmRzIEF1dGhBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNhID0geyBjZXJ0OiBudWxsLCB1cmw6IG51bGwgfTtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gICAgdGhpcy5idW5kbGVJZCA9ICcnO1xuICB9XG5cbiAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2FtZSBjZW50ZXIgYXV0aCBvcHRpb25zIGFyZSByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubG9hZGluZ1Byb21pc2UpIHtcbiAgICAgIHRoaXMubG9hZGluZ1Byb21pc2UgPSB0aGlzLmxvYWRDZXJ0aWZpY2F0ZShvcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuYWJsZUluc2VjdXJlQXV0aCA9IG9wdGlvbnMuZW5hYmxlSW5zZWN1cmVBdXRoO1xuICAgIHRoaXMuYnVuZGxlSWQgPSBvcHRpb25zLmJ1bmRsZUlkO1xuXG4gICAgaWYgKCF0aGlzLmVuYWJsZUluc2VjdXJlQXV0aCAmJiAhdGhpcy5idW5kbGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW5kbGVJZCBpcyByZXF1aXJlZCBmb3Igc2VjdXJlIGF1dGguJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZENlcnRpZmljYXRlKG9wdGlvbnMpIHtcbiAgICBjb25zdCByb290Q2VydGlmaWNhdGVVcmwgPVxuICAgICAgb3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmwgfHxcbiAgICAgICdodHRwczovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQucGVtJztcblxuICAgIGlmICh0aGlzLmNhLnVybCA9PT0gcm9vdENlcnRpZmljYXRlVXJsKSB7XG4gICAgICByZXR1cm4gcm9vdENlcnRpZmljYXRlVXJsO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGhlYWRlcnMgfSA9IGF3YWl0IHRoaXMuZmV0Y2hDZXJ0aWZpY2F0ZShyb290Q2VydGlmaWNhdGVVcmwpO1xuXG4gICAgaWYgKFxuICAgICAgaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpICE9PSAnYXBwbGljYXRpb24veC1wZW0tZmlsZScgfHxcbiAgICAgICFoZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSB8fFxuICAgICAgcGFyc2VJbnQoaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyksIDEwKSA+IDEwMDAwXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0ludmFsaWQgcm9vdENlcnRpZmljYXRlVVJMLicpO1xuICAgIH1cblxuICAgIHRoaXMuY2EuY2VydCA9IHBraS5jZXJ0aWZpY2F0ZUZyb21QZW0oY2VydGlmaWNhdGUpO1xuICAgIHRoaXMuY2EudXJsID0gcm9vdENlcnRpZmljYXRlVXJsO1xuXG4gICAgcmV0dXJuIHJvb3RDZXJ0aWZpY2F0ZVVybDtcbiAgfVxuXG4gIHZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpIHtcbiAgICBjb25zdCByZWdleCA9IC9eaHR0cHM6XFwvXFwvKD86Wy1fQS1aYS16MC05XStcXC4pezAsfWFwcGxlXFwuY29tXFwvLipcXC5jZXIkLztcbiAgICByZXR1cm4gcmVnZXgudGVzdChwdWJsaWNLZXlVcmwpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hDZXJ0aWZpY2F0ZSh1cmwpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY2VydGlmaWNhdGU6ICR7dXJsfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICAgIGNvbnN0IGlzUGVtID0gY29udGVudFR5cGU/LmluY2x1ZGVzKCdhcHBsaWNhdGlvbi94LXBlbS1maWxlJyk7XG5cbiAgICBpZiAoaXNQZW0pIHtcbiAgICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgcmV0dXJuIHsgY2VydGlmaWNhdGUsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICBjb25zdCBiaW5hcnlEYXRhID0gQnVmZmVyLmZyb20oZGF0YSk7XG5cbiAgICBjb25zdCBhc24xQ2VydCA9IGFzbjEuZnJvbURlcihiaW5hcnlEYXRhLnRvU3RyaW5nKCdiaW5hcnknKSk7XG4gICAgY29uc3QgZm9yZ2VDZXJ0ID0gcGtpLmNlcnRpZmljYXRlRnJvbUFzbjEoYXNuMUNlcnQpO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gcGtpLmNlcnRpZmljYXRlVG9QZW0oZm9yZ2VDZXJ0KTtcblxuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzIH07XG4gIH1cblxuICBhc3luYyBnZXRBcHBsZUNlcnRpZmljYXRlKHB1YmxpY0tleVVybCkge1xuICAgIGlmICghdGhpcy52ZXJpZnlQdWJsaWNLZXlVcmwocHVibGljS2V5VXJsKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGBJbnZhbGlkIHB1YmxpY0tleVVybDogJHtwdWJsaWNLZXlVcmx9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FjaGVbcHVibGljS2V5VXJsXSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVbcHVibGljS2V5VXJsXTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNlcnRpZmljYXRlLCBoZWFkZXJzIH0gPSBhd2FpdCB0aGlzLmZldGNoQ2VydGlmaWNhdGUocHVibGljS2V5VXJsKTtcbiAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSBoZWFkZXJzLmdldCgnY2FjaGUtY29udHJvbCcpO1xuICAgIGNvbnN0IGV4cGlyZSA9IGNhY2hlQ29udHJvbD8ubWF0Y2goL21heC1hZ2U9KFswLTldKykvKTtcblxuICAgIHRoaXMudmVyaWZ5UHVibGljS2V5SXNzdWVyKGNlcnRpZmljYXRlLCBwdWJsaWNLZXlVcmwpO1xuXG4gICAgaWYgKGV4cGlyZSkge1xuICAgICAgdGhpcy5jYWNoZVtwdWJsaWNLZXlVcmxdID0gY2VydGlmaWNhdGU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGRlbGV0ZSB0aGlzLmNhY2hlW3B1YmxpY0tleVVybF0sIHBhcnNlSW50KGV4cGlyZVsxXSwgMTApICogMTAwMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNlcnRpZmljYXRlO1xuICB9XG5cbiAgdmVyaWZ5UHVibGljS2V5SXNzdWVyKGNlcnQsIHB1YmxpY0tleVVybCkge1xuICAgIGNvbnN0IHB1YmxpY0tleUNlcnQgPSBwa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnQpO1xuXG4gICAgaWYgKCF0aGlzLmNhLmNlcnQpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgJ1Jvb3QgY2VydGlmaWNhdGUgaXMgaW52YWxpZCBvciBtaXNzaW5nLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhLmNlcnQudmVyaWZ5KHB1YmxpY0tleUNlcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYEludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gKTtcbiAgICB9XG4gIH1cblxuICB2ZXJpZnlTaWduYXR1cmUocHVibGljS2V5LCBhdXRoRGF0YSkge1xuICAgIGNvbnN0IGJ1bmRsZUlkID0gdGhpcy5idW5kbGVJZCB8fCAodGhpcy5lbmFibGVJbnNlY3VyZUF1dGggJiYgYXV0aERhdGEuYnVuZGxlSWQpO1xuXG4gICAgY29uc3QgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdzaGEyNTYnKTtcbiAgICB2ZXJpZmllci51cGRhdGUoQnVmZmVyLmZyb20oYXV0aERhdGEuaWQsICd1dGY4JykpO1xuICAgIHZlcmlmaWVyLnVwZGF0ZShCdWZmZXIuZnJvbShidW5kbGVJZCwgJ3V0ZjgnKSk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaXMuY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKGF1dGhEYXRhLnRpbWVzdGFtcCkpO1xuICAgIHZlcmlmaWVyLnVwZGF0ZShCdWZmZXIuZnJvbShhdXRoRGF0YS5zYWx0LCAnYmFzZTY0JykpO1xuXG4gICAgaWYgKCF2ZXJpZmllci52ZXJpZnkocHVibGljS2V5LCBhdXRoRGF0YS5zaWduYXR1cmUsICdiYXNlNjQnKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdJbnZhbGlkIHNpZ25hdHVyZS4nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhKSB7XG5cbiAgICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ2lkJywgJ3B1YmxpY0tleVVybCcsICd0aW1lc3RhbXAnLCAnc2lnbmF0dXJlJywgJ3NhbHQnXTtcbiAgICBpZiAodGhpcy5lbmFibGVJbnNlY3VyZUF1dGgpIHtcbiAgICAgIHJlcXVpcmVkS2V5cy5wdXNoKCdidW5kbGVJZCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlcXVpcmVkS2V5cykge1xuICAgICAgaWYgKCFhdXRoRGF0YVtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBgQXV0aERhdGEgJHtrZXl9IGlzIG1pc3NpbmcuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5sb2FkaW5nUHJvbWlzZTtcblxuICAgIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IHRoaXMuZ2V0QXBwbGVDZXJ0aWZpY2F0ZShhdXRoRGF0YS5wdWJsaWNLZXlVcmwpO1xuICAgIHRoaXMudmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpO1xuICB9XG5cbiAgY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKHRpbWVzdGFtcCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBidWZmZXIud3JpdGVCaWdVSW50NjRCRShCaWdJbnQodGltZXN0YW1wKSk7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgR2FtZUNlbnRlckF1dGgoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBOEVBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUF3QyxTQUFBRCx1QkFBQUksQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQWhGeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+
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 GitHub.
11
+ * @class GitHubAdapter
12
+ * @param {Object} options - The adapter configuration options.
13
+ * @param {string} options.clientId - The GitHub App Client ID. Required for secure authentication.
14
+ * @param {string} options.clientSecret - The GitHub App Client Secret. Required for secure authentication.
15
+ * @param {boolean} [options.enableInsecureAuth=false] - **[DEPRECATED]** Enable insecure authentication (not recommended).
16
+ *
17
+ * @param {Object} authData - The authentication data provided by the client.
18
+ * @param {string} authData.code - The authorization code from GitHub. Required for secure authentication.
19
+ * @param {string} [authData.id] - **[DEPRECATED]** The GitHub user ID (required for insecure authentication).
20
+ * @param {string} [authData.access_token] - **[DEPRECATED]** The GitHub access token (required for insecure authentication).
21
+ *
22
+ * @description
23
+ * ## Parse Server Configuration
24
+ * * To configure Parse Server for GitHub authentication, use the following structure:
25
+ * ```json
26
+ * {
27
+ * "auth": {
28
+ * "github": {
29
+ * "clientId": "12345",
30
+ * "clientSecret": "abcde"
31
+ * }
32
+ * }
33
+ * ```
34
+ *
35
+ * The GitHub adapter exchanges the `authData.code` provided by the client for an access token using GitHub's OAuth API. The following `authData` field is required:
36
+ * - `code`
37
+ *
38
+ * ## Insecure Authentication (Not Recommended)
39
+ * Insecure authentication uses the `authData.id` and `authData.access_token` provided by the client. This flow is insecure, deprecated, and poses potential security risks. The following `authData` fields are required:
40
+ * - `id` (**[DEPRECATED]**): The GitHub user ID.
41
+ * - `access_token` (**[DEPRECATED]**): The GitHub access token.
42
+ * To configure Parse Server for insecure authentication, use the following structure:
43
+ * ```json
44
+ * {
45
+ * "auth": {
46
+ * "github": {
47
+ * "enableInsecureAuth": true
48
+ * }
49
+ * }
50
+ * ```
51
+ *
52
+ * ### Deprecation Notice
53
+ * The `enableInsecureAuth` option and insecure `authData` fields (`id`, `access_token`) are deprecated and will be removed in future versions. Use secure authentication with `clientId` and `clientSecret`.
54
+ *
55
+ * @example <caption>Secure Authentication Example</caption>
56
+ * // Example authData for secure authentication:
57
+ * const authData = {
58
+ * github: {
59
+ * code: "abc123def456ghi789"
60
+ * }
61
+ * };
62
+ *
63
+ * @example <caption>Insecure Authentication Example (Not Recommended)</caption>
64
+ * // Example authData for insecure authentication:
65
+ * const authData = {
66
+ * github: {
67
+ * id: "1234567",
68
+ * access_token: "abc123def456ghi789" // Deprecated.
69
+ * }
70
+ * };
71
+ *
72
+ * @note `enableInsecureAuth` will be removed in future versions. Use secure authentication with `clientId` and `clientSecret`.
73
+ * @note Secure authentication exchanges the `code` provided by the client for an access token using GitHub's OAuth API.
74
+ *
75
+ * @see {@link https://docs.github.com/en/developers/apps/authorizing-oauth-apps GitHub OAuth Documentation}
76
+ */
77
+
78
+ class GitHubAdapter extends _BaseCodeAuthAdapter.default {
79
+ constructor() {
80
+ super('GitHub');
81
+ }
82
+ async getAccessTokenFromCode(authData) {
83
+ const tokenUrl = 'https://github.com/login/oauth/access_token';
84
+ const response = await fetch(tokenUrl, {
85
+ method: 'POST',
86
+ headers: {
87
+ 'Content-Type': 'application/json',
88
+ Accept: 'application/json'
89
+ },
90
+ body: JSON.stringify({
91
+ client_id: this.clientId,
92
+ client_secret: this.clientSecret,
93
+ code: authData.code
94
+ })
95
+ });
96
+ if (!response.ok) {
97
+ throw new Parse.Error(Parse.Error.VALIDATION_ERROR, `Failed to exchange code for token: ${response.statusText}`);
98
+ }
99
+ const data = await response.json();
100
+ if (data.error) {
101
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, data.error_description || data.error);
102
+ }
103
+ return data.access_token;
104
+ }
105
+ async getUserFromAccessToken(accessToken) {
106
+ const userApiUrl = 'https://api.github.com/user';
107
+ const response = await fetch(userApiUrl, {
108
+ method: 'GET',
109
+ headers: {
110
+ Authorization: `Bearer ${accessToken}`,
111
+ Accept: 'application/json'
112
+ }
113
+ });
114
+ if (!response.ok) {
115
+ throw new Parse.Error(Parse.Error.VALIDATION_ERROR, `Failed to fetch GitHub user: ${response.statusText}`);
116
+ }
117
+ const userData = await response.json();
118
+ if (!userData.id || !userData.login) {
119
+ throw new Parse.Error(Parse.Error.VALIDATION_ERROR, 'Invalid GitHub user data received.');
120
+ }
121
+ return userData;
122
+ }
123
+ }
124
+ var _default = exports.default = new GitHubAdapter();
125
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmFzZUNvZGVBdXRoQWRhcHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiR2l0SHViQWRhcHRlciIsIkJhc2VDb2RlQXV0aEFkYXB0ZXIiLCJjb25zdHJ1Y3RvciIsImdldEFjY2Vzc1Rva2VuRnJvbUNvZGUiLCJhdXRoRGF0YSIsInRva2VuVXJsIiwicmVzcG9uc2UiLCJmZXRjaCIsIm1ldGhvZCIsImhlYWRlcnMiLCJBY2NlcHQiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsImNsaWVudF9pZCIsImNsaWVudElkIiwiY2xpZW50X3NlY3JldCIsImNsaWVudFNlY3JldCIsImNvZGUiLCJvayIsIlBhcnNlIiwiRXJyb3IiLCJWQUxJREFUSU9OX0VSUk9SIiwic3RhdHVzVGV4dCIsImRhdGEiLCJqc29uIiwiZXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJhY2Nlc3NfdG9rZW4iLCJnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuIiwiYWNjZXNzVG9rZW4iLCJ1c2VyQXBpVXJsIiwiQXV0aG9yaXphdGlvbiIsInVzZXJEYXRhIiwiaWQiLCJsb2dpbiIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2dpdGh1Yi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnNlIFNlcnZlciBhdXRoZW50aWNhdGlvbiBhZGFwdGVyIGZvciBHaXRIdWIuXG4gKiBAY2xhc3MgR2l0SHViQWRhcHRlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgYWRhcHRlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5jbGllbnRJZCAtIFRoZSBHaXRIdWIgQXBwIENsaWVudCBJRC4gUmVxdWlyZWQgZm9yIHNlY3VyZSBhdXRoZW50aWNhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmNsaWVudFNlY3JldCAtIFRoZSBHaXRIdWIgQXBwIENsaWVudCBTZWNyZXQuIFJlcXVpcmVkIGZvciBzZWN1cmUgYXV0aGVudGljYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmVuYWJsZUluc2VjdXJlQXV0aD1mYWxzZV0gLSAqKltERVBSRUNBVEVEXSoqIEVuYWJsZSBpbnNlY3VyZSBhdXRoZW50aWNhdGlvbiAobm90IHJlY29tbWVuZGVkKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXV0aERhdGEgLSBUaGUgYXV0aGVudGljYXRpb24gZGF0YSBwcm92aWRlZCBieSB0aGUgY2xpZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGF1dGhEYXRhLmNvZGUgLSBUaGUgYXV0aG9yaXphdGlvbiBjb2RlIGZyb20gR2l0SHViLiBSZXF1aXJlZCBmb3Igc2VjdXJlIGF1dGhlbnRpY2F0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFthdXRoRGF0YS5pZF0gLSAqKltERVBSRUNBVEVEXSoqIFRoZSBHaXRIdWIgdXNlciBJRCAocmVxdWlyZWQgZm9yIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXV0aERhdGEuYWNjZXNzX3Rva2VuXSAtICoqW0RFUFJFQ0FURURdKiogVGhlIEdpdEh1YiBhY2Nlc3MgdG9rZW4gKHJlcXVpcmVkIGZvciBpbnNlY3VyZSBhdXRoZW50aWNhdGlvbikuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiAjIyBQYXJzZSBTZXJ2ZXIgQ29uZmlndXJhdGlvblxuICogKiBUbyBjb25maWd1cmUgUGFyc2UgU2VydmVyIGZvciBHaXRIdWIgYXV0aGVudGljYXRpb24sIHVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICBcImF1dGhcIjoge1xuICogICBcImdpdGh1YlwiOiB7XG4gKiAgICAgXCJjbGllbnRJZFwiOiBcIjEyMzQ1XCIsXG4gKiAgICAgXCJjbGllbnRTZWNyZXRcIjogXCJhYmNkZVwiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoZSBHaXRIdWIgYWRhcHRlciBleGNoYW5nZXMgdGhlIGBhdXRoRGF0YS5jb2RlYCBwcm92aWRlZCBieSB0aGUgY2xpZW50IGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgR2l0SHViJ3MgT0F1dGggQVBJLiBUaGUgZm9sbG93aW5nIGBhdXRoRGF0YWAgZmllbGQgaXMgcmVxdWlyZWQ6XG4gKiAtIGBjb2RlYFxuICpcbiAqICMjIEluc2VjdXJlIEF1dGhlbnRpY2F0aW9uIChOb3QgUmVjb21tZW5kZWQpXG4gKiBJbnNlY3VyZSBhdXRoZW50aWNhdGlvbiB1c2VzIHRoZSBgYXV0aERhdGEuaWRgIGFuZCBgYXV0aERhdGEuYWNjZXNzX3Rva2VuYCBwcm92aWRlZCBieSB0aGUgY2xpZW50LiBUaGlzIGZsb3cgaXMgaW5zZWN1cmUsIGRlcHJlY2F0ZWQsIGFuZCBwb3NlcyBwb3RlbnRpYWwgc2VjdXJpdHkgcmlza3MuIFRoZSBmb2xsb3dpbmcgYGF1dGhEYXRhYCBmaWVsZHMgYXJlIHJlcXVpcmVkOlxuICogLSBgaWRgICgqKltERVBSRUNBVEVEXSoqKTogVGhlIEdpdEh1YiB1c2VyIElELlxuICogLSBgYWNjZXNzX3Rva2VuYCAoKipbREVQUkVDQVRFRF0qKik6IFRoZSBHaXRIdWIgYWNjZXNzIHRva2VuLlxuICogVG8gY29uZmlndXJlIFBhcnNlIFNlcnZlciBmb3IgaW5zZWN1cmUgYXV0aGVudGljYXRpb24sIHVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICBcImF1dGhcIjoge1xuICogICAgXCJnaXRodWJcIjoge1xuICogICAgXCJlbmFibGVJbnNlY3VyZUF1dGhcIjogdHJ1ZVxuICogIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIyBEZXByZWNhdGlvbiBOb3RpY2VcbiAqIFRoZSBgZW5hYmxlSW5zZWN1cmVBdXRoYCBvcHRpb24gYW5kIGluc2VjdXJlIGBhdXRoRGF0YWAgZmllbGRzIChgaWRgLCBgYWNjZXNzX3Rva2VuYCkgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFVzZSBzZWN1cmUgYXV0aGVudGljYXRpb24gd2l0aCBgY2xpZW50SWRgIGFuZCBgY2xpZW50U2VjcmV0YC5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5TZWN1cmUgQXV0aGVudGljYXRpb24gRXhhbXBsZTwvY2FwdGlvbj5cbiAqIC8vIEV4YW1wbGUgYXV0aERhdGEgZm9yIHNlY3VyZSBhdXRoZW50aWNhdGlvbjpcbiAqIGNvbnN0IGF1dGhEYXRhID0ge1xuICogICBnaXRodWI6IHtcbiAqICAgICBjb2RlOiBcImFiYzEyM2RlZjQ1NmdoaTc4OVwiXG4gKiAgIH1cbiAqIH07XG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+SW5zZWN1cmUgQXV0aGVudGljYXRpb24gRXhhbXBsZSAoTm90IFJlY29tbWVuZGVkKTwvY2FwdGlvbj5cbiAqIC8vIEV4YW1wbGUgYXV0aERhdGEgZm9yIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uOlxuICogY29uc3QgYXV0aERhdGEgPSB7XG4gKiAgIGdpdGh1Yjoge1xuICogICAgIGlkOiBcIjEyMzQ1NjdcIixcbiAqICAgICBhY2Nlc3NfdG9rZW46IFwiYWJjMTIzZGVmNDU2Z2hpNzg5XCIgLy8gRGVwcmVjYXRlZC5cbiAqICAgfVxuICogfTtcbiAqXG4gKiBAbm90ZSBgZW5hYmxlSW5zZWN1cmVBdXRoYCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiBVc2Ugc2VjdXJlIGF1dGhlbnRpY2F0aW9uIHdpdGggYGNsaWVudElkYCBhbmQgYGNsaWVudFNlY3JldGAuXG4gKiBAbm90ZSBTZWN1cmUgYXV0aGVudGljYXRpb24gZXhjaGFuZ2VzIHRoZSBgY29kZWAgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3IgYW4gYWNjZXNzIHRva2VuIHVzaW5nIEdpdEh1YidzIE9BdXRoIEFQSS5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9kZXZlbG9wZXJzL2FwcHMvYXV0aG9yaXppbmctb2F1dGgtYXBwcyBHaXRIdWIgT0F1dGggRG9jdW1lbnRhdGlvbn1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvZGVBdXRoQWRhcHRlciBmcm9tICcuL0Jhc2VDb2RlQXV0aEFkYXB0ZXInO1xuY2xhc3MgR2l0SHViQWRhcHRlciBleHRlbmRzIEJhc2VDb2RlQXV0aEFkYXB0ZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignR2l0SHViJyk7XG4gIH1cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZShhdXRoRGF0YSkge1xuICAgIGNvbnN0IHRva2VuVXJsID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aC9hY2Nlc3NfdG9rZW4nO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godG9rZW5VcmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRTZWNyZXQsXG4gICAgICAgIGNvZGU6IGF1dGhEYXRhLmNvZGUsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBgRmFpbGVkIHRvIGV4Y2hhbmdlIGNvZGUgZm9yIHRva2VuOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGRhdGEuZXJyb3JfZGVzY3JpcHRpb24gfHwgZGF0YS5lcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEuYWNjZXNzX3Rva2VuO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlckZyb21BY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xuICAgIGNvbnN0IHVzZXJBcGlVcmwgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2VyJztcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVzZXJBcGlVcmwsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgYEZhaWxlZCB0byBmZXRjaCBHaXRIdWIgdXNlcjogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICghdXNlckRhdGEuaWQgfHwgIXVzZXJEYXRhLmxvZ2luKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgJ0ludmFsaWQgR2l0SHViIHVzZXIgZGF0YSByZWNlaXZlZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNlckRhdGE7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgR2l0SHVi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
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Parse Server authentication adapter for Google.
3
+ *
4
+ * @class GoogleAdapter
5
+ * @param {Object} options - The adapter configuration options.
6
+ * @param {string} options.clientId - Your Google application Client ID.
7
+ * @param {number} [options.cacheMaxEntries] - Maximum number of JWKS cache entries. Default: 5.
8
+ * @param {number} [options.cacheMaxAge] - Maximum age of JWKS cache entries in ms. Default: 3600000 (1 hour).
9
+ *
10
+ * @description
11
+ * ## Parse Server Configuration
12
+ * To configure Parse Server for Google authentication, use the following structure:
13
+ * ```json
14
+ * {
15
+ * "auth": {
16
+ * "google": {
17
+ * "clientId": "your-client-id"
18
+ * }
19
+ * }
20
+ * }
21
+ * ```
22
+ *
23
+ * The adapter requires the following `authData` fields:
24
+ * - **id**: The Google user ID.
25
+ * - **id_token**: The Google ID token.
26
+ *
27
+ * ## Auth Payload
28
+ * ### Example Auth Data Payload
29
+ * ```json
30
+ * {
31
+ * "google": {
32
+ * "id": "1234567",
33
+ * "id_token": "xxxxx.yyyyy.zzzzz"
34
+ * }
35
+ * }
36
+ * ```
37
+ *
38
+ * ## Notes
39
+ * - Ensure your Google Client ID is configured properly in the Parse Server configuration.
40
+ * - The `id_token` is validated against Google's authentication services.
41
+ *
42
+ * @see {@link https://developers.google.com/identity/sign-in/web/backend-auth Google Authentication Documentation}
43
+ */
44
+
45
+ 'use strict';
46
+
47
+ var Parse = require('parse/node').Parse;
48
+ const jwksClient = require('jwks-rsa');
49
+ const jwt = require('jsonwebtoken');
50
+ const authUtils = require('./utils');
51
+ const TOKEN_ISSUER = 'accounts.google.com';
52
+ const HTTPS_TOKEN_ISSUER = 'https://accounts.google.com';
53
+ const getGoogleKeyByKeyId = async (keyId, cacheMaxEntries, cacheMaxAge) => {
54
+ const client = jwksClient({
55
+ jwksUri: 'https://www.googleapis.com/oauth2/v3/certs',
56
+ cache: true,
57
+ cacheMaxEntries,
58
+ cacheMaxAge
59
+ });
60
+ let key;
61
+ try {
62
+ key = await authUtils.getSigningKey(client, keyId);
63
+ } catch {
64
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Unable to find matching key for Key ID: ${keyId}`);
65
+ }
66
+ return key;
67
+ };
68
+ async function verifyIdToken({
69
+ id_token: token,
70
+ id
71
+ }, {
72
+ clientId,
73
+ cacheMaxEntries,
74
+ cacheMaxAge
75
+ }) {
76
+ if (!clientId) {
77
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Google auth is not configured.');
78
+ }
79
+ if (!token) {
80
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token is invalid for this user.`);
81
+ }
82
+ const {
83
+ kid: keyId
84
+ } = authUtils.getHeaderFromToken(token);
85
+ const ONE_HOUR_IN_MS = 3600000;
86
+ let jwtClaims;
87
+ cacheMaxAge = cacheMaxAge || ONE_HOUR_IN_MS;
88
+ cacheMaxEntries = cacheMaxEntries || 5;
89
+ const googleKey = await getGoogleKeyByKeyId(keyId, cacheMaxEntries, cacheMaxAge);
90
+ const signingKey = googleKey.publicKey || googleKey.rsaPublicKey;
91
+ try {
92
+ jwtClaims = jwt.verify(token, signingKey, {
93
+ algorithms: ['RS256'],
94
+ audience: clientId
95
+ });
96
+ } catch (exception) {
97
+ const message = exception.message;
98
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `${message}`);
99
+ }
100
+ if (jwtClaims.iss !== TOKEN_ISSUER && jwtClaims.iss !== HTTPS_TOKEN_ISSUER) {
101
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token not issued by correct provider - expected: ${TOKEN_ISSUER} or ${HTTPS_TOKEN_ISSUER} | from: ${jwtClaims.iss}`);
102
+ }
103
+ if (jwtClaims.sub !== id) {
104
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `auth data is invalid for this user.`);
105
+ }
106
+ return jwtClaims;
107
+ }
108
+
109
+ // Returns a promise that fulfills if this user id is valid.
110
+ function validateAuthData(authData, options = {}) {
111
+ return verifyIdToken(authData, options);
112
+ }
113
+
114
+ // Returns a promise that fulfills if this app id is valid.
115
+ function validateAppId() {
116
+ return Promise.resolve();
117
+ }
118
+ module.exports = {
119
+ validateAppId: validateAppId,
120
+ validateAuthData: validateAuthData
121
+ };
122
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJqd2tzQ2xpZW50Iiwiand0IiwiYXV0aFV0aWxzIiwiVE9LRU5fSVNTVUVSIiwiSFRUUFNfVE9LRU5fSVNTVUVSIiwiZ2V0R29vZ2xlS2V5QnlLZXlJZCIsImtleUlkIiwiY2FjaGVNYXhFbnRyaWVzIiwiY2FjaGVNYXhBZ2UiLCJjbGllbnQiLCJqd2tzVXJpIiwiY2FjaGUiLCJrZXkiLCJnZXRTaWduaW5nS2V5IiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwidmVyaWZ5SWRUb2tlbiIsImlkX3Rva2VuIiwidG9rZW4iLCJpZCIsImNsaWVudElkIiwia2lkIiwiZ2V0SGVhZGVyRnJvbVRva2VuIiwiT05FX0hPVVJfSU5fTVMiLCJqd3RDbGFpbXMiLCJnb29nbGVLZXkiLCJzaWduaW5nS2V5IiwicHVibGljS2V5IiwicnNhUHVibGljS2V5IiwidmVyaWZ5IiwiYWxnb3JpdGhtcyIsImF1ZGllbmNlIiwiZXhjZXB0aW9uIiwibWVzc2FnZSIsImlzcyIsInN1YiIsInZhbGlkYXRlQXV0aERhdGEiLCJhdXRoRGF0YSIsIm9wdGlvbnMiLCJ2YWxpZGF0ZUFwcElkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvZ29vZ2xlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyc2UgU2VydmVyIGF1dGhlbnRpY2F0aW9uIGFkYXB0ZXIgZm9yIEdvb2dsZS5cbiAqXG4gKiBAY2xhc3MgR29vZ2xlQWRhcHRlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgYWRhcHRlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5jbGllbnRJZCAtIFlvdXIgR29vZ2xlIGFwcGxpY2F0aW9uIENsaWVudCBJRC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jYWNoZU1heEVudHJpZXNdIC0gTWF4aW11bSBudW1iZXIgb2YgSldLUyBjYWNoZSBlbnRyaWVzLiBEZWZhdWx0OiA1LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNhY2hlTWF4QWdlXSAtIE1heGltdW0gYWdlIG9mIEpXS1MgY2FjaGUgZW50cmllcyBpbiBtcy4gRGVmYXVsdDogMzYwMDAwMCAoMSBob3VyKS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICMjIFBhcnNlIFNlcnZlciBDb25maWd1cmF0aW9uXG4gKiBUbyBjb25maWd1cmUgUGFyc2UgU2VydmVyIGZvciBHb29nbGUgYXV0aGVudGljYXRpb24sIHVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJhdXRoXCI6IHtcbiAqICAgICBcImdvb2dsZVwiOiB7XG4gKiAgICAgICBcImNsaWVudElkXCI6IFwieW91ci1jbGllbnQtaWRcIlxuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhlIGFkYXB0ZXIgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBgYXV0aERhdGFgIGZpZWxkczpcbiAqIC0gKippZCoqOiBUaGUgR29vZ2xlIHVzZXIgSUQuXG4gKiAtICoqaWRfdG9rZW4qKjogVGhlIEdvb2dsZSBJRCB0b2tlbi5cbiAqXG4gKiAjIyBBdXRoIFBheWxvYWRcbiAqICMjIyBFeGFtcGxlIEF1dGggRGF0YSBQYXlsb2FkXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiZ29vZ2xlXCI6IHtcbiAqICAgICBcImlkXCI6IFwiMTIzNDU2N1wiLFxuICogICAgIFwiaWRfdG9rZW5cIjogXCJ4eHh4eC55eXl5eS56enp6elwiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIE5vdGVzXG4gKiAtIEVuc3VyZSB5b3VyIEdvb2dsZSBDbGllbnQgSUQgaXMgY29uZmlndXJlZCBwcm9wZXJseSBpbiB0aGUgUGFyc2UgU2VydmVyIGNvbmZpZ3VyYXRpb24uXG4gKiAtIFRoZSBgaWRfdG9rZW5gIGlzIHZhbGlkYXRlZCBhZ2FpbnN0IEdvb2dsZSdzIGF1dGhlbnRpY2F0aW9uIHNlcnZpY2VzLlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2lkZW50aXR5L3NpZ24taW4vd2ViL2JhY2tlbmQtYXV0aCBHb29nbGUgQXV0aGVudGljYXRpb24gRG9jdW1lbnRhdGlvbn1cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcblxuY29uc3Qgandrc0NsaWVudCA9IHJlcXVpcmUoJ2p3a3MtcnNhJyk7XG5jb25zdCBqd3QgPSByZXF1aXJlKCdqc29ud2VidG9rZW4nKTtcbmNvbnN0IGF1dGhVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuY29uc3QgVE9LRU5fSVNTVUVSID0gJ2FjY291bnRzLmdvb2dsZS5jb20nO1xuY29uc3QgSFRUUFNfVE9LRU5fSVNTVUVSID0gJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSc7XG5cbmNvbnN0IGdldEdvb2dsZUtleUJ5S2V5SWQgPSBhc3luYyAoa2V5SWQsIGNhY2hlTWF4RW50cmllcywgY2FjaGVNYXhBZ2UpID0+IHtcbiAgY29uc3QgY2xpZW50ID0gandrc0NsaWVudCh7XG4gICAgandrc1VyaTogJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92My9jZXJ0cycsXG4gICAgY2FjaGU6IHRydWUsXG4gICAgY2FjaGVNYXhFbnRyaWVzLFxuICAgIGNhY2hlTWF4QWdlLFxuICB9KTtcblxuICBsZXQga2V5O1xuICB0cnkge1xuICAgIGtleSA9IGF3YWl0IGF1dGhVdGlscy5nZXRTaWduaW5nS2V5KGNsaWVudCwga2V5SWQpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYFVuYWJsZSB0byBmaW5kIG1hdGNoaW5nIGtleSBmb3IgS2V5IElEOiAke2tleUlkfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBrZXk7XG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlJZFRva2VuKHsgaWRfdG9rZW46IHRva2VuLCBpZCB9LCB7IGNsaWVudElkLCBjYWNoZU1heEVudHJpZXMsIGNhY2hlTWF4QWdlIH0pIHtcbiAgaWYgKCFjbGllbnRJZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnR29vZ2xlIGF1dGggaXMgbm90IGNvbmZpZ3VyZWQuJ1xuICAgICk7XG4gIH1cblxuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGBpZCB0b2tlbiBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuYCk7XG4gIH1cblxuICBjb25zdCB7IGtpZDoga2V5SWQgfSA9IGF1dGhVdGlscy5nZXRIZWFkZXJGcm9tVG9rZW4odG9rZW4pO1xuICBjb25zdCBPTkVfSE9VUl9JTl9NUyA9IDM2MDAwMDA7XG4gIGxldCBqd3RDbGFpbXM7XG5cbiAgY2FjaGVNYXhBZ2UgPSBjYWNoZU1heEFnZSB8fCBPTkVfSE9VUl9JTl9NUztcbiAgY2FjaGVNYXhFbnRyaWVzID0gY2FjaGVNYXhFbnRyaWVzIHx8IDU7XG5cbiAgY29uc3QgZ29vZ2xlS2V5ID0gYXdhaXQgZ2V0R29vZ2xlS2V5QnlLZXlJZChrZXlJZCwgY2FjaGVNYXhFbnRyaWVzLCBjYWNoZU1heEFnZSk7XG4gIGNvbnN0IHNpZ25pbmdLZXkgPSBnb29nbGVLZXkucHVibGljS2V5IHx8IGdvb2dsZUtleS5yc2FQdWJsaWNLZXk7XG5cbiAgdHJ5IHtcbiAgICBqd3RDbGFpbXMgPSBqd3QudmVyaWZ5KHRva2VuLCBzaWduaW5nS2V5LCB7XG4gICAgICBhbGdvcml0aG1zOiBbJ1JTMjU2J10sXG4gICAgICBhdWRpZW5jZTogY2xpZW50SWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlcHRpb24ubWVzc2FnZTtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYCR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChqd3RDbGFpbXMuaXNzICE9PSBUT0tFTl9JU1NVRVIgJiYgand0Q2xhaW1zLmlzcyAhPT0gSFRUUFNfVE9LRU5fSVNTVUVSKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBpZCB0b2tlbiBub3QgaXNzdWVkIGJ5IGNvcnJlY3QgcHJvdmlkZXIgLSBleHBlY3RlZDogJHtUT0tFTl9JU1NVRVJ9IG9yICR7SFRUUFNfVE9LRU5fSVNTVUVSfSB8IGZyb206ICR7and0Q2xhaW1zLmlzc31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChqd3RDbGFpbXMuc3ViICE9PSBpZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBgYXV0aCBkYXRhIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci5gKTtcbiAgfVxuXG4gIHJldHVybiBqd3RDbGFpbXM7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyB1c2VyIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiB2ZXJpZnlJZFRva2VuKGF1dGhEYXRhLCBvcHRpb25zKTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIGFwcCBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXBwSWQoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHZhbGlkYXRlQXBwSWQ6IHZhbGlkYXRlQXBwSWQsXG4gIHZhbGlkYXRlQXV0aERhdGE6IHZhbGlkYXRlQXV0aERhdGEsXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxZQUFZOztBQUVaLElBQUlBLEtBQUssR0FBR0MsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDRCxLQUFLO0FBRXZDLE1BQU1FLFVBQVUsR0FBR0QsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUN0QyxNQUFNRSxHQUFHLEdBQUdGLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDbkMsTUFBTUcsU0FBUyxHQUFHSCxPQUFPLENBQUMsU0FBUyxDQUFDO0FBRXBDLE1BQU1JLFlBQVksR0FBRyxxQkFBcUI7QUFDMUMsTUFBTUMsa0JBQWtCLEdBQUcsNkJBQTZCO0FBRXhELE1BQU1DLG1CQUFtQixHQUFHLE1BQUFBLENBQU9DLEtBQUssRUFBRUMsZUFBZSxFQUFFQyxXQUFXLEtBQUs7RUFDekUsTUFBTUMsTUFBTSxHQUFHVCxVQUFVLENBQUM7SUFDeEJVLE9BQU8sRUFBRSw0Q0FBNEM7SUFDckRDLEtBQUssRUFBRSxJQUFJO0lBQ1hKLGVBQWU7SUFDZkM7RUFDRixDQUFDLENBQUM7RUFFRixJQUFJSSxHQUFHO0VBQ1AsSUFBSTtJQUNGQSxHQUFHLEdBQUcsTUFBTVYsU0FBUyxDQUFDVyxhQUFhLENBQUNKLE1BQU0sRUFBRUgsS0FBSyxDQUFDO0VBQ3BELENBQUMsQ0FBQyxNQUFNO0lBQ04sTUFBTSxJQUFJUixLQUFLLENBQUNnQixLQUFLLENBQ25C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