parse-server 4.10.10 → 4.10.11

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.
@@ -20,6 +20,14 @@ const crypto = require('crypto');
20
20
 
21
21
  const https = require('https');
22
22
 
23
+ const {
24
+ pki
25
+ } = require('node-forge');
26
+
27
+ const ca = {
28
+ cert: null,
29
+ url: null
30
+ };
23
31
  const cache = {}; // (publicKey -> cert) cache
24
32
 
25
33
  function verifyPublicKeyUrl(publicKeyUrl) {
@@ -54,34 +62,60 @@ async function getAppleCertificate(publicKeyUrl) {
54
62
  path: url.pathname,
55
63
  method: 'HEAD'
56
64
  };
57
- const headers = await new Promise((resolve, reject) => https.get(headOptions, res => resolve(res.headers)).on('error', reject));
65
+ const cert_headers = await new Promise((resolve, reject) => https.get(headOptions, res => resolve(res.headers)).on('error', reject));
66
+ const validContentTypes = ['application/x-x509-ca-cert', 'application/pkix-cert'];
58
67
 
59
- if (headers['content-type'] !== 'application/pkix-cert' || headers['content-length'] == null || headers['content-length'] > 10000) {
68
+ if (!validContentTypes.includes(cert_headers['content-type']) || cert_headers['content-length'] == null || cert_headers['content-length'] > 10000) {
60
69
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
61
70
  }
62
71
 
72
+ const {
73
+ certificate,
74
+ headers
75
+ } = await getCertificate(publicKeyUrl);
76
+
77
+ if (headers['cache-control']) {
78
+ const expire = headers['cache-control'].match(/max-age=([0-9]+)/);
79
+
80
+ if (expire) {
81
+ cache[publicKeyUrl] = certificate; // we'll expire the cache entry later, as per max-age
82
+
83
+ setTimeout(() => {
84
+ delete cache[publicKeyUrl];
85
+ }, parseInt(expire[1], 10) * 1000);
86
+ }
87
+ }
88
+
89
+ return verifyPublicKeyIssuer(certificate, publicKeyUrl);
90
+ }
91
+
92
+ function getCertificate(url, buffer) {
63
93
  return new Promise((resolve, reject) => {
64
- https.get(publicKeyUrl, res => {
65
- let data = '';
94
+ https.get(url, res => {
95
+ const data = [];
66
96
  res.on('data', chunk => {
67
- data += chunk.toString('base64');
97
+ data.push(chunk);
68
98
  });
69
99
  res.on('end', () => {
70
- const cert = convertX509CertToPEM(data);
71
-
72
- if (res.headers['cache-control']) {
73
- var expire = res.headers['cache-control'].match(/max-age=([0-9]+)/);
100
+ if (buffer) {
101
+ resolve({
102
+ certificate: Buffer.concat(data),
103
+ headers: res.headers
104
+ });
105
+ return;
106
+ }
74
107
 
75
- if (expire) {
76
- cache[publicKeyUrl] = cert; // we'll expire the cache entry later, as per max-age
108
+ let cert = '';
77
109
 
78
- setTimeout(() => {
79
- delete cache[publicKeyUrl];
80
- }, parseInt(expire[1], 10) * 1000);
81
- }
110
+ for (const chunk of data) {
111
+ cert += chunk.toString('base64');
82
112
  }
83
113
 
84
- resolve(cert);
114
+ const certificate = convertX509CertToPEM(cert);
115
+ resolve({
116
+ certificate,
117
+ headers: res.headers
118
+ });
85
119
  });
86
120
  }).on('error', reject);
87
121
  });
@@ -106,6 +140,24 @@ function verifySignature(publicKey, authData) {
106
140
  if (!verifier.verify(publicKey, authData.signature, 'base64')) {
107
141
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center - invalid signature');
108
142
  }
143
+ }
144
+
145
+ function verifyPublicKeyIssuer(cert, publicKeyUrl) {
146
+ const publicKeyCert = pki.certificateFromPem(cert);
147
+
148
+ if (!ca.cert) {
149
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
150
+ }
151
+
152
+ try {
153
+ if (!ca.cert.verify(publicKeyCert)) {
154
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
155
+ }
156
+ } catch (e) {
157
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
158
+ }
159
+
160
+ return cert;
109
161
  } // Returns a promise that fulfills if this user id is valid.
110
162
 
111
163
 
@@ -120,12 +172,31 @@ async function validateAuthData(authData) {
120
172
  } // Returns a promise that fulfills if this app id is valid.
121
173
 
122
174
 
123
- function validateAppId() {
124
- return Promise.resolve();
175
+ async function validateAppId(appIds, authData, options = {}) {
176
+ if (!options.rootCertificateUrl) {
177
+ options.rootCertificateUrl = 'https://cacerts.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crt.pem';
178
+ }
179
+
180
+ if (ca.url === options.rootCertificateUrl) {
181
+ return;
182
+ }
183
+
184
+ const {
185
+ certificate,
186
+ headers
187
+ } = await getCertificate(options.rootCertificateUrl, true);
188
+
189
+ if (headers['content-type'] !== 'application/x-pem-file' || headers['content-length'] == null || headers['content-length'] > 10000) {
190
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
191
+ }
192
+
193
+ ca.cert = pki.certificateFromPem(certificate);
194
+ ca.url = options.rootCertificateUrl;
125
195
  }
126
196
 
127
197
  module.exports = {
128
198
  validateAppId,
129
- validateAuthData
199
+ validateAuthData,
200
+ cache
130
201
  };
131
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInJlZ2V4IiwidGVzdCIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiam9pbiIsImdldEFwcGxlQ2VydGlmaWNhdGUiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ1cmwiLCJVUkwiLCJoZWFkT3B0aW9ucyIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwiaGVhZGVycyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwib24iLCJkYXRhIiwiY2h1bmsiLCJ0b1N0cmluZyIsImNlcnQiLCJleHBpcmUiLCJzZXRUaW1lb3V0IiwicGFyc2VJbnQiLCJjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4iLCJ0aW1lc3RhbXAiLCJidWZmZXIiLCJCdWZmZXIiLCJhbGxvYyIsImhpZ2giLCJsb3ciLCJ3cml0ZVVJbnQzMkJFIiwidmVyaWZ5U2lnbmF0dXJlIiwicHVibGljS2V5IiwiYXV0aERhdGEiLCJ2ZXJpZmllciIsImNyZWF0ZVZlcmlmeSIsInVwZGF0ZSIsInBsYXllcklkIiwiYnVuZGxlSWQiLCJzYWx0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwidmFsaWRhdGVBdXRoRGF0YSIsImlkIiwidmFsaWRhdGVBcHBJZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7Ozs7Ozs7OztBQWFBLE1BQU07QUFBRUEsRUFBQUE7QUFBRixJQUFZQyxPQUFPLENBQUMsWUFBRCxDQUF6Qjs7QUFDQSxNQUFNQyxNQUFNLEdB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QixTQUFPbEMsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDRDs7QUFFRGtDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjtBQUNmRixFQUFBQSxhQURlO0FBRWZGLEVBQUFBO0FBRmUsQ0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBBcHBsZSBHYW1lIENlbnRlciBBdXRoXG5odHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9nYW1la2l0L2drbG9jYWxwbGF5ZXIvMTUxNTQwNy1nZW5lcmF0ZWlkZW50aXR5dmVyaWZpY2F0aW9uc2lnbiNkaXNjdXNzaW9uXG5cbmNvbnN0IGF1dGhEYXRhID0ge1xuICBwdWJsaWNLZXlVcmw6ICdodHRwczovL3ZhbGlkLmFwcGxlLmNvbS9wdWJsaWMvdGltZW91dC5jZXInLFxuICB0aW1lc3RhbXA6IDE0NjA5ODE0MjEzMDMsXG4gIHNpZ25hdHVyZTogJ1BvRHdmMzlEQ040NjRCNDlqSkNVMGQ5WTBKJyxcbiAgc2FsdDogJ3NhbHRTVD09JyxcbiAgYnVuZGxlSWQ6ICdjb20udmFsaWQuYXBwJ1xuICBpZDogJ3BsYXllcklkJyxcbn07XG4qL1xuXG5jb25zdCB7IFBhcnNlIH0gPSByZXF1aXJlKCdwYXJzZS9ub2RlJyk7XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcblxuY29uc3QgY2FjaGUgPSB7fTsgLy8gKHB1YmxpY0tleSAtPiBjZXJ0KSBjYWNoZVxuXG5mdW5jdGlvbiB2ZXJpZnlQdWJsaWNLZXlVcmwocHVibGljS2V5VXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVnZXggPSAvXmh0dHBzOlxcL1xcLyg/OlstX0EtWmEtejAtOV0rXFwuKXswLH1hcHBsZVxcLmNvbVxcLy4qXFwuY2VyJC87XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QocHVibGljS2V5VXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFg1MDlDZXJ0VG9QRU0oWDUwOUNlcnQpIHtcbiAgY29uc3QgcGVtUHJlRml4ID0gJy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcbic7XG4gIGNvbnN0IHBlbVBvc3RGaXggPSAnLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSc7XG5cbiAgY29uc3QgYmFzZTY0ID0gWDUwOUNlcnQ7XG4gIGNvbnN0IGNlcnRCb2R5ID0gYmFzZTY0Lm1hdGNoKG5ldyBSZWdFeHAoJy57MCw2NH0nLCAnZycpKS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gcGVtUHJlRml4ICsgY2VydEJvZHkgKyBwZW1Qb3N0Rml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHBsZUNlcnRpZmljYXRlKHB1YmxpY0tleVVybCkge1xuICBpZiAoIXZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBpZiAoY2FjaGVbcHVibGljS2V5VXJsXSkge1xuICAgIHJldHVybiBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICB9XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocHVibGljS2V5VXJsKTtcbiAgY29uc3QgaGVhZE9wdGlvbnMgPSB7XG4gICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgbWV0aG9kOiAnSEVBRCcsXG4gIH07XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIGh0dHBzLmdldChoZWFkT3B0aW9ucywgcmVzID0+IHJlc29sdmUocmVzLmhlYWRlcnMpKS5vbignZXJyb3InLCByZWplY3QpXG4gICk7XG4gIGlmIChcbiAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ2FwcGxpY2F0aW9uL3BraXgtY2VydCcgfHxcbiAgICBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09IG51bGwgfHxcbiAgICBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID4gMTAwMDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGh0dHBzXG4gICAgICAuZ2V0KHB1YmxpY0tleVVybCwgcmVzID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIGRhdGEgKz0gY2h1bmsudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2VydCA9IGNvbnZlcnRYNTA5Q2VydFRvUEVNKGRhdGEpO1xuICAgICAgICAgIGlmIChyZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddKSB7XG4gICAgICAgICAgICB2YXIgZXhwaXJlID0gcmVzLmhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXS5tYXRjaCgvbWF4LWFnZT0oWzAtOV0rKS8pO1xuICAgICAgICAgICAgaWYgKGV4cGlyZSkge1xuICAgICAgICAgICAgICBjYWNoZVtwdWJsaWNLZXlVcmxdID0gY2VydDtcbiAgICAgICAgICAgICAgLy8gd2UnbGwgZXhwaXJlIHRoZSBjYWNoZSBlbnRyeSBsYXRlciwgYXMgcGVyIG1heC1hZ2VcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW3B1YmxpY0tleVVybF07XG4gICAgICAgICAgICAgIH0sIHBhcnNlSW50KGV4cGlyZVsxXSwgMTApICogMTAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoY2VydCk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCByZWplY3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKHRpbWVzdGFtcCkge1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG5cbiAgY29uc3QgaGlnaCA9IH5+KHRpbWVzdGFtcCAvIDB4ZmZmZmZmZmYpO1xuICBjb25zdCBsb3cgPSB0aW1lc3RhbXAgJSAoMHhmZmZmZmZmZiArIDB4MSk7XG5cbiAgYnVmZmVyLndyaXRlVUludDMyQkUocGFyc2VJbnQoaGlnaCwgMTApLCAwKTtcbiAgYnVmZmVyLndyaXRlVUludDMyQkUocGFyc2VJbnQobG93LCAxMCksIDQpO1xuXG4gIHJldHVybiBidWZmZXI7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShwdWJsaWNLZXksIGF1dGhEYXRhKSB7XG4gIGNvbnN0IHZlcmlmaWVyID0gY3J5cHRvLmNyZWF0ZVZlcmlmeSgnc2hhMjU2Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5wbGF5ZXJJZCwgJ3V0ZjgnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLmJ1bmRsZUlkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKGF1dGhEYXRhLnRpbWVzdGFtcCkpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuc2FsdCwgJ2Jhc2U2NCcpO1xuXG4gIGlmICghdmVyaWZpZXIudmVyaWZ5KHB1YmxpY0tleSwgYXV0aERhdGEuc2lnbmF0dXJlLCAnYmFzZTY0JykpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0FwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgfVxufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgaWYgKCFhdXRoRGF0YS5pZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBhdXRoRGF0YSBpZCBtaXNzaW5nJyk7XG4gIH1cbiAgYXV0aERhdGEucGxheWVySWQgPSBhdXRoRGF0YS5pZDtcbiAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgZ2V0QXBwbGVDZXJ0aWZpY2F0ZShhdXRoRGF0YS5wdWJsaWNLZXlVcmwpO1xuICByZXR1cm4gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZCgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YSxcbn07XG4iXX0=
202
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJwa2kiLCJjYSIsImNlcnQiLCJ1cmwiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInJlZ2V4IiwidGVzdCIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiam9pbiIsImdldEFwcGxlQ2VydGlmaWNhdGUiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJVUkwiLCJoZWFkT3B0aW9ucyIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwiY2VydF9oZWFkZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJnZXQiLCJyZXMiLCJoZWFkZXJzIiwib24iLCJ2YWxpZENvbnRlbnRUeXBlcyIsImluY2x1ZGVzIiwiY2VydGlmaWNhdGUiLCJnZXRDZXJ0aWZpY2F0ZSIsImV4cGlyZSIsInNldFRpbWVvdXQiLCJwYXJzZUludCIsInZlcmlmeVB1YmxpY0tleUlzc3VlciIsImJ1ZmZlciIsImRhdGEiLCJjaHVuayIsInB1c2giLCJCdWZmZXIiLCJjb25jYXQiLCJ0b1N0cmluZyIsImNvbnZlcnRUaW1lc3RhbXBUb0JpZ0VuZGlhbiIsInRpbWVzdGFtcCIsImFsbG9jIiwiaGlnaCIsImxvdyIsIndyaXRlVUludDMyQkUiLCJ2ZXJpZnlTaWduYXR1cmUiLCJwdWJsaWNLZXkiLCJhdXRoRGF0YSIsInZlcmlmaWVyIiwiY3JlYXRlVmVyaWZ5IiwidXBkYXRlIiwicGxheWVySWQiLCJidW5kbGVJZCIsInNhbHQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJwdWJsaWNLZXlDZXJ0IiwiY2VydGlmaWNhdGVGcm9tUGVtIiwiZSIsInZhbGlkYXRlQXV0aERhdGEiLCJpZCIsInZhbGlkYXRlQXBwSWQiLCJhcHBJZHMiLCJvcHRpb25zIiwicm9vdENlcnRpZmljYXRlVXJsIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7Ozs7O0FBYUEsTUFBTTtBQUFFQSxFQUFBQTtBQUFGLElBQVlDLE9BQU8sQ0FBQyxZQUFELENBQXpCOztBQUNBLE1BQU1DLE1BQU0sR0FBR0QsT0FBTyxDQUFDLFFBQUQsQ0FBdEI7O0FBQ0EsTUFBTUUsS0FBSyxHQUFHRixPQUFPLENBQUMsT0FBRCxDQUFyQjs7QUFDQSxNQUFNO0FBQUVHLEVBQUFBO0FBQUYsSUFBVUgsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsTUFBTUksRUFBRSxHQUFHO0FBQUVDLEVBQUFBLElBQUksRUFBRSxJQUFSO0FBQWNDLEVBQUFBLEdBQUcsRUFBRTtBQUFuQixDQUFYO0FBQ0EsTUFBTUMsS0FBSyxHQUFHLEVBQWQsQyxDQUFrQjs7QUFFbEIsU0FBU0Msa0JBQVQsQ0FBNEJDLFlBQTVCLEVBQTBDO0FBQ3hDLE1BQUk7QUFDRixVQUFNQyxLQUFLLEdBQUcseURBQWQ7QUFDQSxXQUFPQSxLQUFLLENBQUNDLElBQU4sQ0FBV0YsWUFBWCxDQUFQO0FBQ0QsR0FIRCxDQUdFLE9BQU9HLEtBQVAsRUFBYztBQUNkLFdBQU8sS0FBUDtBQUNEO0FBQ0Y7O0FBRUQsU0FBU0Msb0JBQVQsQ0FBOEJDLFFBQTlCLEVBQXdDO0FBQ3RDLFFBQU1DLFNBQVMsR0FBRywrQkFBbEI7QUFDQSxRQUFNQyxVQUFVLEdBQUcsMkJBQW5CO0FBRUEsUUFBTUMsTUFBTSxHQUFHSCxRQUFmO0FBQ0EsUUFBTUksUUFBUSxHQUFHRCxNQUFNLENBQUNFLEtBQVAsQ0FBYSxJQUFJQyxNQUFKLENBQVcsU0FBWCxFQUFzQixHQUF0QixDQUFiLEVBQXlDQyxJQUF6QyxDQUE4QyxJQUE5QyxDQUFqQjtBQUVBLFNBQU9OLFNBQVMsR0FBR0csUUFBWixHQUF1QkYsVUFBOUI7QUFD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RUFBNkIsSUFBN0IsQ0FBckQ7O0FBQ0EsTUFDRTFDLE9BQU8sQ0FBQyxjQUFELENBQVAsS0FBNEIsd0JBQTVCLElBQ0FBLE9BQU8sQ0FBQyxnQkFBRCxDQUFQLElBQTZCLElBRDdCLElBRUFBLE9BQU8sQ0FBQyxnQkFBRCxDQUFQLEdBQTRCLEtBSDlCLEVBSUU7QUFDQSxVQUFNLElBQUl0QyxLQUFLLENBQUN3QixLQUFWLENBQ0p4QixLQUFLLENBQUN3QixLQUFOLENBQVlDLGdCQURSLEVBRUosMkVBRkksQ0FBTjtBQUlEOztBQUNEcEIsRUFBQUEsRUFBRSxDQUFDQyxJQUFILEdBQVVGLEdBQUcsQ0FBQ3FFLGtCQUFKLENBQXVCL0IsV0FBdkIsQ0FBVjtBQUNBckMsRUFBQUEsRUFBRSxDQUFDRSxHQUFILEdBQVN3RSxPQUFPLENBQUNDLGtCQUFqQjtBQUNEOztBQUVEQyxNQUFNLENBQUNDLE9BQVAsR0FBaUI7QUFDZkwsRUFBQUEsYUFEZTtBQUVmRixFQUFBQSxnQkFGZTtBQUdmbkUsRUFBQUE7QUFIZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIEFwcGxlIEdhbWUgQ2VudGVyIEF1dGhcbmh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL2dhbWVraXQvZ2tsb2NhbHBsYXllci8xNTE1NDA3LWdlbmVyYXRlaWRlbnRpdHl2ZXJpZmljYXRpb25zaWduI2Rpc2N1c3Npb25cblxuY29uc3QgYXV0aERhdGEgPSB7XG4gIHB1YmxpY0tleVVybDogJ2h0dHBzOi8vdmFsaWQuYXBwbGUuY29tL3B1YmxpYy90aW1lb3V0LmNlcicsXG4gIHRpbWVzdGFtcDogMTQ2MDk4MTQyMTMwMyxcbiAgc2lnbmF0dXJlOiAnUG9Ed2YzOURDTjQ2NEI0OWpKQ1UwZDlZMEonLFxuICBzYWx0OiAnc2FsdFNUPT0nLFxuICBidW5kbGVJZDogJ2NvbS52YWxpZC5hcHAnXG4gIGlkOiAncGxheWVySWQnLFxufTtcbiovXG5cbmNvbnN0IHsgUGFyc2UgfSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuY29uc3QgeyBwa2kgfSA9IHJlcXVpcmUoJ25vZGUtZm9yZ2UnKTtcbmNvbnN0IGNhID0geyBjZXJ0OiBudWxsLCB1cmw6IG51bGwgfTtcbmNvbnN0IGNhY2hlID0ge307IC8vIChwdWJsaWNLZXkgLT4gY2VydCkgY2FjaGVcblxuZnVuY3Rpb24gdmVyaWZ5UHVibGljS2V5VXJsKHB1YmxpY0tleVVybCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlZ2V4ID0gL15odHRwczpcXC9cXC8oPzpbLV9BLVphLXowLTldK1xcLil7MCx9YXBwbGVcXC5jb21cXC8uKlxcLmNlciQvO1xuICAgIHJldHVybiByZWdleC50ZXN0KHB1YmxpY0tleVVybCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRYNTA5Q2VydFRvUEVNKFg1MDlDZXJ0KSB7XG4gIGNvbnN0IHBlbVByZUZpeCA9ICctLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cXG4nO1xuICBjb25zdCBwZW1Qb3N0Rml4ID0gJy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0nO1xuXG4gIGNvbnN0IGJhc2U2NCA9IFg1MDlDZXJ0O1xuICBjb25zdCBjZXJ0Qm9keSA9IGJhc2U2NC5tYXRjaChuZXcgUmVnRXhwKCcuezAsNjR9JywgJ2cnKSkuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIHBlbVByZUZpeCArIGNlcnRCb2R5ICsgcGVtUG9zdEZpeDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBwbGVDZXJ0aWZpY2F0ZShwdWJsaWNLZXlVcmwpIHtcbiAgaWYgKCF2ZXJpZnlQdWJsaWNLZXlVcmwocHVibGljS2V5VXJsKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHB1YmxpY0tleVVybDogJHtwdWJsaWNLZXlVcmx9YFxuICAgICk7XG4gIH1cbiAgaWYgKGNhY2hlW3B1YmxpY0tleVVybF0pIHtcbiAgICByZXR1cm4gY2FjaGVbcHVibGljS2V5VXJsXTtcbiAgfVxuICBjb25zdCB1cmwgPSBuZXcgVVJMKHB1YmxpY0tleVVybCk7XG4gIGNvbnN0IGhlYWRPcHRpb25zID0ge1xuICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgIG1ldGhvZDogJ0hFQUQnLFxuICB9O1xuICBjb25zdCBjZXJ0X2hlYWRlcnMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIGh0dHBzLmdldChoZWFkT3B0aW9ucywgcmVzID0+IHJlc29sdmUocmVzLmhlYWRlcnMpKS5vbignZXJyb3InLCByZWplY3QpXG4gICk7XG4gIGNvbnN0IHZhbGlkQ29udGVudFR5cGVzID0gWydhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCcsICdhcHBsaWNhdGlvbi9wa2l4LWNlcnQnXTtcbiAgaWYgKFxuICAgICF2YWxpZENvbnRlbnRUeXBlcy5pbmNsdWRlcyhjZXJ0X2hlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSB8fFxuICAgIGNlcnRfaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9PSBudWxsIHx8XG4gICAgY2VydF9oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID4gMTAwMDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBjb25zdCB7IGNlcnRpZmljYXRlLCBoZWFkZXJzIH0gPSBhd2FpdCBnZXRDZXJ0aWZpY2F0ZShwdWJsaWNLZXlVcmwpO1xuICBpZiAoaGVhZGVyc1snY2FjaGUtY29udHJvbCddKSB7XG4gICAgY29uc3QgZXhwaXJlID0gaGVhZGVyc1snY2FjaGUtY29udHJvbCddLm1hdGNoKC9tYXgtYWdlPShbMC05XSspLyk7XG4gICAgaWYgKGV4cGlyZSkge1xuICAgICAgY2FjaGVbcHVibGljS2V5VXJsXSA9IGNlcnRpZmljYXRlO1xuICAgICAgLy8gd2UnbGwgZXhwaXJlIHRoZSBjYWNoZSBlbnRyeSBsYXRlciwgYXMgcGVyIG1heC1hZ2VcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkZWxldGUgY2FjaGVbcHVibGljS2V5VXJsXTtcbiAgICAgIH0sIHBhcnNlSW50KGV4cGlyZVsxXSwgMTApICogMTAwMCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2ZXJpZnlQdWJsaWNLZXlJc3N1ZXIoY2VydGlmaWNhdGUsIHB1YmxpY0tleVVybCk7XG59XG5cbmZ1bmN0aW9uIGdldENlcnRpZmljYXRlKHVybCwgYnVmZmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaHR0cHNcbiAgICAgIC5nZXQodXJsLCByZXMgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gW107XG4gICAgICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICBkYXRhLnB1c2goY2h1bmspO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmVzb2x2ZSh7IGNlcnRpZmljYXRlOiBCdWZmZXIuY29uY2F0KGRhdGEpLCBoZWFkZXJzOiByZXMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGNlcnQgPSAnJztcbiAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGRhdGEpIHtcbiAgICAgICAgICAgIGNlcnQgKz0gY2h1bmsudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGNvbnZlcnRYNTA5Q2VydFRvUEVNKGNlcnQpO1xuICAgICAgICAgIHJlc29sdmUoeyBjZXJ0aWZpY2F0ZSwgaGVhZGVyczogcmVzLmhlYWRlcnMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCByZWplY3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKHRpbWVzdGFtcCkge1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG5cbiAgY29uc3QgaGlnaCA9IH5+KHRpbWVzdGFtcCAvIDB4ZmZmZmZmZmYpO1xuICBjb25zdCBsb3cgPSB0aW1lc3RhbXAgJSAoMHhmZmZmZmZmZiArIDB4MSk7XG5cbiAgYnVmZmVyLndyaXRlVUludDMyQkUocGFyc2VJbnQoaGlnaCwgMTApLCAwKTtcbiAgYnVmZmVyLndyaXRlVUludDMyQkUocGFyc2VJbnQobG93LCAxMCksIDQpO1xuXG4gIHJldHVybiBidWZmZXI7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShwdWJsaWNLZXksIGF1dGhEYXRhKSB7XG4gIGNvbnN0IHZlcmlmaWVyID0gY3J5cHRvLmNyZWF0ZVZlcmlmeSgnc2hhMjU2Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5wbGF5ZXJJZCwgJ3V0ZjgnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLmJ1bmRsZUlkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKGF1dGhEYXRhLnRpbWVzdGFtcCkpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuc2FsdCwgJ2Jhc2U2NCcpO1xuXG4gIGlmICghdmVyaWZpZXIudmVyaWZ5KHB1YmxpY0tleSwgYXV0aERhdGEuc2lnbmF0dXJlLCAnYmFzZTY0JykpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0FwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2ZXJpZnlQdWJsaWNLZXlJc3N1ZXIoY2VydCwgcHVibGljS2V5VXJsKSB7XG4gIGNvbnN0IHB1YmxpY0tleUNlcnQgPSBwa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnQpO1xuICBpZiAoIWNhLmNlcnQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgJ0FwcGxlIEdhbWUgQ2VudGVyIGF1dGggYWRhcHRlciBwYXJhbWV0ZXIgYHJvb3RDZXJ0aWZpY2F0ZVVSTGAgaXMgaW52YWxpZC4nXG4gICAgKTtcbiAgfVxuICB0cnkge1xuICAgIGlmICghY2EuY2VydC52ZXJpZnkocHVibGljS2V5Q2VydCkpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2VydDtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIHVzZXIgaWQgaXMgdmFsaWQuXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhKSB7XG4gIGlmICghYXV0aERhdGEuaWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0FwcGxlIEdhbWUgQ2VudGVyIC0gYXV0aERhdGEgaWQgbWlzc2luZycpO1xuICB9XG4gIGF1dGhEYXRhLnBsYXllcklkID0gYXV0aERhdGEuaWQ7XG4gIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IGdldEFwcGxlQ2VydGlmaWNhdGUoYXV0aERhdGEucHVibGljS2V5VXJsKTtcbiAgcmV0dXJuIHZlcmlmeVNpZ25hdHVyZShwdWJsaWNLZXksIGF1dGhEYXRhKTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIGFwcCBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXBwSWQoYXBwSWRzLCBhdXRoRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICghb3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmwpIHtcbiAgICBvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCA9XG4gICAgICAnaHR0cHM6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0LnBlbSc7XG4gIH1cbiAgaWYgKGNhLnVybCA9PT0gb3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwgaGVhZGVycyB9ID0gYXdhaXQgZ2V0Q2VydGlmaWNhdGUob3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmwsIHRydWUpO1xuICBpZiAoXG4gICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gIT09ICdhcHBsaWNhdGlvbi94LXBlbS1maWxlJyB8fFxuICAgIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPT0gbnVsbCB8fFxuICAgIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPiAxMDAwMFxuICApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgJ0FwcGxlIEdhbWUgQ2VudGVyIGF1dGggYWRhcHRlciBwYXJhbWV0ZXIgYHJvb3RDZXJ0aWZpY2F0ZVVSTGAgaXMgaW52YWxpZC4nXG4gICAgKTtcbiAgfVxuICBjYS5jZXJ0ID0gcGtpLmNlcnRpZmljYXRlRnJvbVBlbShjZXJ0aWZpY2F0ZSk7XG4gIGNhLnVybCA9IG9wdGlvbnMucm9vdENlcnRpZmljYXRlVXJsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YSxcbiAgY2FjaGUsXG59O1xuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "parse-server",
3
- "version": "4.10.10",
3
+ "version": "4.10.11",
4
4
  "description": "An express module providing a Parse-compatible API server",
5
5
  "main": "lib/index.js",
6
6
  "repository": {