diff --git a/integration/server.js b/integration/server.js
index 35f021190..dbfcd90e6 100644
--- a/integration/server.js
+++ b/integration/server.js
@@ -42,6 +42,25 @@ const api = new ParseServer({
},
});
+const mfa = new ParseServer({
+ databaseURI: 'mongodb://localhost:27017/integration',
+ appId: 'integration',
+ masterKey: 'notsosecret',
+ serverURL: 'http://localhost:1337/mfa',
+ multiFactorAuth: {
+ enableMfa: true,
+ encryptionKey: '89E4AFF1-DFE4-4603-9574-BFA16BB446FD',
+ },
+ appName: 'testApp',
+ verbose: false,
+ silent: true,
+ serverStartComplete: () => {
+ /* Ignore ParseError: schema class name does not revalidate */
+ },
+});
+
+app.use('/mfa', mfa);
+
app.use('/parse', api);
const TestUtils = require('parse-server').TestUtils;
diff --git a/integration/test/ParseUserTest.js b/integration/test/ParseUserTest.js
index e9d338bb9..c4b573499 100644
--- a/integration/test/ParseUserTest.js
+++ b/integration/test/ParseUserTest.js
@@ -3,6 +3,7 @@
const assert = require('assert');
const clear = require('./clear');
const Parse = require('../../node');
+const otplib = require('otplib');
const TestObject = Parse.Object.extend('TestObject');
@@ -119,6 +120,79 @@ describe('Parse User', () => {
});
});
+ it("can enable MFA", async () => {
+ Parse.User.enableUnsafeCurrentUser();
+ Parse.serverURL = 'http://localhost:1337/mfa'
+ const user = await Parse.User.signUp("asdf", "zxcv");
+ const { secret, qrcodeURL } = await user.enableMfa();
+ expect(qrcodeURL).toBeDefined();
+ expect(qrcodeURL).toContain('otpauth://totp/testApp');
+ expect(qrcodeURL).toContain('secret');
+ expect(qrcodeURL).toContain('asdf');
+ expect(qrcodeURL).toContain('period');
+ expect(qrcodeURL).toContain('digits');
+ expect(qrcodeURL).toContain('algorithm');
+ expect(secret).toBeDefined();
+ // show UI: in order to confirm your MFA, you need to add it to a TPA app, and enter the code below to verify.
+ // Next step is window.open(qrcodeURL) if mobile, or render a QR code pointing to the qrcodeURL.
+ const token = otplib.authenticator.generate(secret);
+ // submit the token generated from TPA app
+ const { recoveryKeys } = await user.verifyMfa(token);
+ // 'great, MFA is enabled. Don't get locked out, here are your recovery keys. Keep them in a safe place offline.'
+ expect(recoveryKeys).toBeDefined();
+ expect(recoveryKeys[0]).toBeDefined();
+ expect(recoveryKeys[1]).toBeDefined();
+ expect(recoveryKeys[0].length).toBe(20);
+ expect(recoveryKeys[1].length).toBe(20);
+ expect(Parse.User.current().get('mfaEnabled')).toBe(true);
+ Parse.serverURL = 'http://localhost:1337/parse'
+ });
+
+ it("can login with MFA", async () => {
+ Parse.User.enableUnsafeCurrentUser();
+ Parse.serverURL = 'http://localhost:1337/mfa'
+ const user = await Parse.User.signUp("asdf", "zxcv");
+ const { secret } = await user.enableMfa();
+ let token = otplib.authenticator.generate(secret);
+ await user.verifyMfa(token);
+ await Parse.User.logOut();
+ token = null;
+ const login = async () => {
+ try {
+ const current = await Parse.User.logIn("asdf", "zxcv", {token});
+ if (!token) {
+ throw 'should not have been able to login without providing a MFA token';
+ }
+ expect(current.get('mfaEnabled')).toBe(true);
+ expect(current.get('username')).toBe('asdf');
+ } catch (e) {
+ if (e.code == Parse.Error.MFA_TOKEN_REQUIRED) {
+ // please enter your TPA code in order to login. Can't access your account? Enter recovery codes.
+ token = otplib.authenticator.generate(secret);
+ await login();
+ return;
+ }
+ throw e;
+ }
+ }
+ await login();
+ Parse.serverURL = 'http://localhost:1337/parse'
+ });
+
+ it("can recover MFA", async () => {
+ Parse.User.enableUnsafeCurrentUser();
+ Parse.serverURL = 'http://localhost:1337/mfa'
+ const user = await Parse.User.signUp("asdf", "zxcv");
+ const { secret } = await user.enableMfa();
+ const token = otplib.authenticator.generate(secret);
+ const {recoveryKeys} = await user.verifyMfa(token);
+ await Parse.User.logOut();
+ const current = await Parse.User.logIn("asdf", "zxcv", {recoveryKeys});
+ expect(current.get('mfaEnabled')).toBe(false);
+ expect(current.get('username')).toBe('asdf');
+ Parse.serverURL = 'http://localhost:1337/parse'
+ });
+
it('can login users with installationId', async () => {
Parse.User.enableUnsafeCurrentUser();
const currentInstallation = await Parse.CoreManager.getInstallationController().currentInstallationId();
diff --git a/package-lock.json b/package-lock.json
index cdb8a302a..925ab318f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,34 +5,45 @@
"requires": true,
"dependencies": {
"@apollo/client": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.2.5.tgz",
- "integrity": "sha512-zpruxnFMz6K94gs2pqc3sidzFDbQpKT5D6P/J/I9s8ekHZ5eczgnRp6pqXC86Bh7+44j/btpmOT0kwiboyqTnA==",
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.3.4.tgz",
+ "integrity": "sha512-PnbkSa2gcFD6Qakn2eJCJ1RMYdCzEIlRlaHZGnUNbH+7AKOYwjDVtSVCC03nDtWeS9yWiJ15A8xGMreMKAboQQ==",
"dev": true,
"requires": {
"@graphql-typed-document-node/core": "^3.0.0",
"@types/zen-observable": "^0.8.0",
"@wry/context": "^0.5.2",
- "@wry/equality": "^0.2.0",
+ "@wry/equality": "^0.3.0",
"fast-json-stable-stringify": "^2.0.0",
"graphql-tag": "^2.11.0",
"hoist-non-react-statics": "^3.3.2",
- "optimism": "^0.13.0",
+ "optimism": "^0.13.1",
"prop-types": "^15.7.2",
"symbol-observable": "^2.0.0",
- "ts-invariant": "^0.4.4",
+ "ts-invariant": "^0.6.0",
"tslib": "^1.10.0",
"zen-observable": "^0.8.14"
},
"dependencies": {
"@wry/equality": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.2.0.tgz",
- "integrity": "sha512-Y4d+WH6hs+KZJUC8YKLYGarjGekBrhslDbf/R20oV+AakHPINSitHfDRQz3EGcEWc1luXYNUvMhawWtZVWNGvQ==",
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.3.0.tgz",
+ "integrity": "sha512-DRDAu/e3oWBj826OWNV/GCmSdHD248mASXImgNoLE/3SDvpgb+k6G/+TAmdpIB35ju264+kB22Rx92eXg52DnA==",
"dev": true,
"requires": {
"tslib": "^1.9.3"
}
+ },
+ "ts-invariant": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.6.0.tgz",
+ "integrity": "sha512-caoafsfgb8QxdrKzFfjKt627m4i8KTtfAiji0DYJfWI4A/S9ORNNpzYuD9br64kyKFgxn9UNaLLbSupam84mCA==",
+ "dev": true,
+ "requires": {
+ "@types/ungap__global-this": "^0.3.1",
+ "@ungap/global-this": "^0.4.2",
+ "tslib": "^1.9.3"
+ }
}
}
},
@@ -58,9 +69,9 @@
},
"dependencies": {
"@types/node": {
- "version": "10.17.40",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.40.tgz",
- "integrity": "sha512-3hZT2z2/531A5pc8hYhn1gU5Qb1SIRSgMLQ6zuHA5xtt16lWAxUGprtr8lJuc9zNJMXEIIBWfSnzqBP/4mglpA==",
+ "version": "10.17.48",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.48.tgz",
+ "integrity": "sha512-Agl6xbYP6FOMDeAsr3QVZ+g7Yzg0uhPHWx0j5g4LFdUBHVtqtU+gH660k/lCEe506jJLOGbEzsnqPDTZGJQLag==",
"dev": true
}
}
@@ -1294,12 +1305,12 @@
}
},
"@graphql-tools/batch-delegate": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/batch-delegate/-/batch-delegate-6.2.2.tgz",
- "integrity": "sha512-xXJKVvBxafdn9tVWe3oJreTHuFAKWblw4zK0KvKhEVJOjPytKweGCZI3kTs9hdmjgPz1ZjSQEVvgmZJ0GubrWA==",
+ "version": "6.2.6",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/batch-delegate/-/batch-delegate-6.2.6.tgz",
+ "integrity": "sha512-QUoE9pQtkdNPFdJHSnBhZtUfr3M7pIRoXoMR+TG7DK2Y62ISKbT/bKtZEUU1/2v5uqd5WVIvw9dF8gHDSJAsSA==",
"dev": true,
"requires": {
- "@graphql-tools/delegate": "6.2.2",
+ "@graphql-tools/delegate": "^6.2.4",
"dataloader": "2.0.0",
"tslib": "~2.0.1"
},
@@ -1313,14 +1324,14 @@
}
},
"@graphql-tools/delegate": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.2.2.tgz",
- "integrity": "sha512-8VycfZYQ+m4HgajewQT6v6BzAEFxc6mh6rO+uqewnvh143nvv3ud4nXEAfOddUm0PrE6iD3Ng2BZtPSWF5mt+w==",
+ "version": "6.2.4",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.2.4.tgz",
+ "integrity": "sha512-mXe6DfoWmq49kPcDrpKHgC2DSWcD5q0YCaHHoXYPAOlnLH8VMTY8BxcE8y/Do2eyg+GLcwAcrpffVszWMwqw0w==",
"dev": true,
"requires": {
"@ardatan/aggregate-error": "0.0.6",
- "@graphql-tools/schema": "6.2.2",
- "@graphql-tools/utils": "6.2.2",
+ "@graphql-tools/schema": "^6.2.4",
+ "@graphql-tools/utils": "^6.2.4",
"dataloader": "2.0.0",
"is-promise": "4.0.0",
"tslib": "~2.0.1"
@@ -1335,12 +1346,12 @@
}
},
"@graphql-tools/links": {
- "version": "6.2.4",
- "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.2.4.tgz",
- "integrity": "sha512-dQH3oWVTkCwzGmfIi1OjyKAjPw1jOexP1f3hv8UajgU7Um/DCjVkvXQHeMGlihXg4bH/wogFheCJ0SwF4oFFUA==",
+ "version": "6.2.5",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.2.5.tgz",
+ "integrity": "sha512-XeGDioW7F+HK6HHD/zCeF0HRC9s12NfOXAKv1HC0J7D50F4qqMvhdS/OkjzLoBqsgh/Gm8icRc36B5s0rOA9ig==",
"dev": true,
"requires": {
- "@graphql-tools/utils": "^6.2.4",
+ "@graphql-tools/utils": "^7.0.0",
"apollo-link": "1.2.14",
"apollo-upload-client": "14.1.2",
"cross-fetch": "3.0.6",
@@ -1350,13 +1361,13 @@
},
"dependencies": {
"@graphql-tools/utils": {
- "version": "6.2.4",
- "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.4.tgz",
- "integrity": "sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg==",
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.1.4.tgz",
+ "integrity": "sha512-4lxmstMpgHSM1ULD+1X5AcPFaizkdBubB7H9Rqr7Wh6L9bxUHBHFB3bhaFXT7FI0xE01Pt0IMsZadOIlhVTXrg==",
"dev": true,
"requires": {
"@ardatan/aggregate-error": "0.0.6",
- "camel-case": "4.1.1",
+ "camel-case": "4.1.2",
"tslib": "~2.0.1"
}
},
@@ -1380,16 +1391,37 @@
}
},
"@graphql-tools/merge": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-6.2.2.tgz",
- "integrity": "sha512-2YyErSvq4hn5mjE6qJ/0Q8r3WU9JB3+obv2xyvb+oW+E/T1iYRJGxSFldi6lqO5IADZz8QASLJeSpRBw40gpBg==",
+ "version": "6.2.6",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-6.2.6.tgz",
+ "integrity": "sha512-G6x0QlIzFHoJ3dyF9a4gxmBtaEYJ+EoAAGqXHsE/drRr58K1jscQdfKZdF1wZWZgxkgakHqgt1+oFMeQg/O6ug==",
"dev": true,
"requires": {
- "@graphql-tools/schema": "6.2.2",
- "@graphql-tools/utils": "6.2.2",
+ "@graphql-tools/schema": "^7.0.0",
+ "@graphql-tools/utils": "^7.0.0",
"tslib": "~2.0.1"
},
"dependencies": {
+ "@graphql-tools/schema": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-7.1.2.tgz",
+ "integrity": "sha512-GabNT51ErVHE2riDH4EQdRusUsI+nMElT8LdFHyuP53v8gwtleAj+LePQ9jif4NYUe/JQVqO8V28vPcHrA7gfQ==",
+ "dev": true,
+ "requires": {
+ "@graphql-tools/utils": "^7.1.2",
+ "tslib": "~2.0.1"
+ }
+ },
+ "@graphql-tools/utils": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.1.4.tgz",
+ "integrity": "sha512-4lxmstMpgHSM1ULD+1X5AcPFaizkdBubB7H9Rqr7Wh6L9bxUHBHFB3bhaFXT7FI0xE01Pt0IMsZadOIlhVTXrg==",
+ "dev": true,
+ "requires": {
+ "@ardatan/aggregate-error": "0.0.6",
+ "camel-case": "4.1.2",
+ "tslib": "~2.0.1"
+ }
+ },
"tslib": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
@@ -1399,12 +1431,12 @@
}
},
"@graphql-tools/schema": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.2.2.tgz",
- "integrity": "sha512-KITlyr//1oKyxIOlGvNZDl4c6bLj2Gc+3eJXyUKWfSmgsmAZPudpQNa/8VbiVujpm7UaX0cyM3FdeCaxWFeBgg==",
+ "version": "6.2.4",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.2.4.tgz",
+ "integrity": "sha512-rh+14lSY1q8IPbEv2J9x8UBFJ5NrDX9W5asXEUlPp+7vraLp/Tiox4GXdgyA92JhwpYco3nTf5Bo2JDMt1KnAQ==",
"dev": true,
"requires": {
- "@graphql-tools/utils": "6.2.2",
+ "@graphql-tools/utils": "^6.2.4",
"tslib": "~2.0.1"
},
"dependencies": {
@@ -1417,17 +1449,17 @@
}
},
"@graphql-tools/stitch": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/stitch/-/stitch-6.2.2.tgz",
- "integrity": "sha512-VysuOBik1ICqsgV3VGXysJfdUl4/ro95rsnREma9BJP3oNqriPd6v8JhrnZqP2LbfzF7G2xndRoSRAQgYOzsUQ==",
+ "version": "6.2.4",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/stitch/-/stitch-6.2.4.tgz",
+ "integrity": "sha512-0C7PNkS7v7iAc001m7c1LPm5FUB0/DYw+s3OyCii6YYYHY8NwdI0roeOyeDGFJkFubWBQfjc3hoSyueKtU73mw==",
"dev": true,
"requires": {
- "@graphql-tools/batch-delegate": "6.2.2",
- "@graphql-tools/delegate": "6.2.2",
- "@graphql-tools/merge": "6.2.2",
- "@graphql-tools/schema": "6.2.2",
- "@graphql-tools/utils": "6.2.2",
- "@graphql-tools/wrap": "6.2.2",
+ "@graphql-tools/batch-delegate": "^6.2.4",
+ "@graphql-tools/delegate": "^6.2.4",
+ "@graphql-tools/merge": "^6.2.4",
+ "@graphql-tools/schema": "^6.2.4",
+ "@graphql-tools/utils": "^6.2.4",
+ "@graphql-tools/wrap": "^6.2.4",
"is-promise": "4.0.0",
"tslib": "~2.0.1"
},
@@ -1441,9 +1473,9 @@
}
},
"@graphql-tools/utils": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.2.tgz",
- "integrity": "sha512-a0SSYF76dnKHs8te4Igfnrrq1VOO4sFG8yx3ehO7464eGUfUUYo2QmNRjhxny2HRMvqzX40xuQikyg6LBXDNLQ==",
+ "version": "6.2.4",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.4.tgz",
+ "integrity": "sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg==",
"dev": true,
"requires": {
"@ardatan/aggregate-error": "0.0.6",
@@ -1451,6 +1483,24 @@
"tslib": "~2.0.1"
},
"dependencies": {
+ "camel-case": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz",
+ "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==",
+ "dev": true,
+ "requires": {
+ "pascal-case": "^3.1.1",
+ "tslib": "^1.10.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ }
+ }
+ },
"tslib": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
@@ -1460,14 +1510,14 @@
}
},
"@graphql-tools/wrap": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-6.2.2.tgz",
- "integrity": "sha512-FjCE+NvMwcCiAlt9EAw9uDi2zblE4Z5CEkY+z4NRO1AmCB5THoWJKG+csPh8tGuU80mAJI51Wy9FQGyUo/EU0g==",
+ "version": "6.2.4",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-6.2.4.tgz",
+ "integrity": "sha512-cyQgpybolF9DjL2QNOvTS1WDCT/epgYoiA8/8b3nwv5xmMBQ6/6nYnZwityCZ7njb7MMyk7HBEDNNlP9qNJDcA==",
"dev": true,
"requires": {
- "@graphql-tools/delegate": "6.2.2",
- "@graphql-tools/schema": "6.2.2",
- "@graphql-tools/utils": "6.2.2",
+ "@graphql-tools/delegate": "^6.2.4",
+ "@graphql-tools/schema": "^6.2.4",
+ "@graphql-tools/utils": "^6.2.4",
"is-promise": "4.0.0",
"tslib": "~2.0.1"
},
@@ -1715,10 +1765,52 @@
}
}
},
+ "@otplib/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA=="
+ },
+ "@otplib/plugin-crypto": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/plugin-crypto/-/plugin-crypto-12.0.1.tgz",
+ "integrity": "sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==",
+ "requires": {
+ "@otplib/core": "^12.0.1"
+ }
+ },
+ "@otplib/plugin-thirty-two": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/plugin-thirty-two/-/plugin-thirty-two-12.0.1.tgz",
+ "integrity": "sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==",
+ "requires": {
+ "@otplib/core": "^12.0.1",
+ "thirty-two": "^1.0.2"
+ }
+ },
+ "@otplib/preset-default": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/preset-default/-/preset-default-12.0.1.tgz",
+ "integrity": "sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==",
+ "requires": {
+ "@otplib/core": "^12.0.1",
+ "@otplib/plugin-crypto": "^12.0.1",
+ "@otplib/plugin-thirty-two": "^12.0.1"
+ }
+ },
+ "@otplib/preset-v11": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/preset-v11/-/preset-v11-12.0.1.tgz",
+ "integrity": "sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==",
+ "requires": {
+ "@otplib/core": "^12.0.1",
+ "@otplib/plugin-crypto": "^12.0.1",
+ "@otplib/plugin-thirty-two": "^12.0.1"
+ }
+ },
"@parse/fs-files-adapter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-1.0.1.tgz",
- "integrity": "sha1-do94QIPo+Wc+9GPhmaG+X4N7QWU=",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@parse/fs-files-adapter/-/fs-files-adapter-1.2.0.tgz",
+ "integrity": "sha512-kr7Ti2eYOm14p05S86yriJdMtawL6qln3Dn5eekrwY14ih4jrjH/E+QlEpBUSBzN64fluFxciFOyjdbwDGWsGw==",
"dev": true
},
"@parse/minami": {
@@ -1728,9 +1820,9 @@
"dev": true
},
"@parse/node-apn": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@parse/node-apn/-/node-apn-3.2.0.tgz",
- "integrity": "sha512-Xa2paSzLY18k0ekvVAa9YbwwxGjzFnnAu7fqwlrFhaWCv1IaQ9u7r/TGuLml1zWbvhFTdy4XXB4soDS1pek3uA==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@parse/node-apn/-/node-apn-4.0.0.tgz",
+ "integrity": "sha512-/Zhz7+AfwuMeBn9kpENF5qbWDG1+0xLBOlAb7O34BhR9R5BSjAKkMxqWmTz3R3nvlsod4XrZ8NuRMUOXVrCCFQ==",
"dev": true,
"requires": {
"debug": "3.1.0",
@@ -1786,9 +1878,9 @@
},
"dependencies": {
"debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
@@ -1841,21 +1933,40 @@
}
},
"@parse/push-adapter": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-3.3.0.tgz",
- "integrity": "sha512-PQlgP5ydplSZlC2jCx79j/5A8FVD1i7yl3796RL/zC4dj9TZ4Hocc/IVjru4aFHB129zwXQeyJBmtByySP95uw==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-3.4.0.tgz",
+ "integrity": "sha512-ZYf6DKQHpUoi806SIDiuVhstL3BRQC4brcCyTnoLih/u08Cg60Pbkz2B95JU+6xMcM211A2AvPDudEmsMahq7w==",
"dev": true,
"requires": {
- "@parse/node-apn": "3.2.0",
+ "@parse/node-apn": "4.0.0",
"@parse/node-gcm": "1.0.2",
- "npmlog": "4.0.2",
- "parse": "2.16.0"
+ "npmlog": "4.1.2",
+ "parse": "2.17.0"
},
"dependencies": {
+ "@babel/runtime": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+ "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz",
+ "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==",
+ "dev": true,
+ "requires": {
+ "core-js-pure": "^3.0.0",
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
"parse": {
- "version": "2.16.0",
- "resolved": "https://registry.npmjs.org/parse/-/parse-2.16.0.tgz",
- "integrity": "sha512-MJRGCYZGawOs9FOn/i/ag7IFF9NHe5OG+XvNta45pSMzre6nvqUqcvQpTDj0tC+h0C4eMuLoI39SQ07PIwnRTw==",
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/parse/-/parse-2.17.0.tgz",
+ "integrity": "sha512-1hWoMNW39LH5YV3xCds9LyD8SsKD6FUwlD1Kn8ZlXNosg6WgF+s3ZSQUzT5AJ/9YPUoC/y1PoCO79FumrBYftA==",
"dev": true,
"requires": {
"@babel/runtime": "7.11.2",
@@ -1865,51 +1976,49 @@
"uuid": "3.4.0",
"ws": "7.3.1",
"xmlhttprequest": "1.8.0"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.11.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
- "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
- "dev": true,
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/runtime-corejs3": {
- "version": "7.11.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz",
- "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==",
- "dev": true,
- "requires": {
- "core-js-pure": "^3.0.0",
- "regenerator-runtime": "^0.13.4"
- }
- },
- "ws": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
- "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
- "dev": true
- }
}
+ },
+ "ws": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+ "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+ "dev": true
}
}
},
"@parse/s3-files-adapter": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@parse/s3-files-adapter/-/s3-files-adapter-1.5.0.tgz",
- "integrity": "sha512-dF4IkGgP2o1iiuTsrHz2Y4hASE/QMMXIcOLf0hxA1e1fBYQ1oLphquoaFldO0Li0wUIE0zg5vuIAkp1M4ODqjQ==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@parse/s3-files-adapter/-/s3-files-adapter-1.6.0.tgz",
+ "integrity": "sha512-t/91hlZ4+GIA68zmJIX9lkIAxPZVRJROPYWGGyxE9CLGsSvBr/eaIHs6LnKyM012lBHzwJwoLxMkN4RvJADgbg==",
"dev": true,
"requires": {
"aws-sdk": "2.761.0",
- "parse": "2.16.0"
+ "parse": "2.17.0"
},
"dependencies": {
+ "@babel/runtime": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+ "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz",
+ "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==",
+ "dev": true,
+ "requires": {
+ "core-js-pure": "^3.0.0",
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
"parse": {
- "version": "2.16.0",
- "resolved": "https://registry.npmjs.org/parse/-/parse-2.16.0.tgz",
- "integrity": "sha512-MJRGCYZGawOs9FOn/i/ag7IFF9NHe5OG+XvNta45pSMzre6nvqUqcvQpTDj0tC+h0C4eMuLoI39SQ07PIwnRTw==",
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/parse/-/parse-2.17.0.tgz",
+ "integrity": "sha512-1hWoMNW39LH5YV3xCds9LyD8SsKD6FUwlD1Kn8ZlXNosg6WgF+s3ZSQUzT5AJ/9YPUoC/y1PoCO79FumrBYftA==",
"dev": true,
"requires": {
"@babel/runtime": "7.11.2",
@@ -1919,34 +2028,13 @@
"uuid": "3.4.0",
"ws": "7.3.1",
"xmlhttprequest": "1.8.0"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.11.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
- "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
- "dev": true,
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/runtime-corejs3": {
- "version": "7.11.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz",
- "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==",
- "dev": true,
- "requires": {
- "core-js-pure": "^3.0.0",
- "regenerator-runtime": "^0.13.4"
- }
- },
- "ws": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
- "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
- "dev": true
- }
}
+ },
+ "ws": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+ "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+ "dev": true
}
}
},
@@ -2105,9 +2193,9 @@
"dev": true
},
"@types/cookies": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.4.tgz",
- "integrity": "sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw==",
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.5.tgz",
+ "integrity": "sha512-3+TAFSm78O7/bAeYdB8FoYGntuT87vVP9JKuQRL8sRhv9313LP2SpHHL50VeFtnyjIcb3UELddMk5Yt0eOSOkg==",
"dev": true,
"requires": {
"@types/connect": "*",
@@ -2232,9 +2320,9 @@
"dev": true
},
"@types/koa": {
- "version": "2.11.5",
- "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.5.tgz",
- "integrity": "sha512-egP+ceD3+v9PnFW+DLTFO8mt6wa5sDqfGOBIwOAZ61Wzsq4bGZc5kMpJgcCwq7ARGIBfHBY+KkK/1RsMftV/qQ==",
+ "version": "2.11.6",
+ "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.6.tgz",
+ "integrity": "sha512-BhyrMj06eQkk04C97fovEDQMpLpd2IxCB4ecitaXwOKGq78Wi2tooaDOWOFGajPk8IkQOAtMppApgSVkYe1F/A==",
"dev": true,
"requires": {
"@types/accepts": "*",
@@ -2269,9 +2357,9 @@
"dev": true
},
"@types/node": {
- "version": "14.11.10",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.10.tgz",
- "integrity": "sha512-yV1nWZPlMFpoXyoknm4S56y2nlTAuFYaJuQtYRAOU7xA/FJ9RY0Xm7QOkaYMMmr8ESdHIuUb6oQgR/0+2NqlyA==",
+ "version": "14.14.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz",
+ "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==",
"dev": true
},
"@types/node-fetch": {
@@ -2310,9 +2398,9 @@
"dev": true
},
"@types/serve-static": {
- "version": "1.13.6",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.6.tgz",
- "integrity": "sha512-nuRJmv7jW7VmCVTn+IgYDkkbbDGyIINOeu/G0d74X3lm6E5KfMeQPJhxIt1ayQeQB3cSxvYs1RA/wipYoFB4EA==",
+ "version": "1.13.8",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz",
+ "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==",
"dev": true,
"requires": {
"@types/mime": "*",
@@ -2325,10 +2413,16 @@
"integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
"dev": true
},
+ "@types/ungap__global-this": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/ungap__global-this/-/ungap__global-this-0.3.1.tgz",
+ "integrity": "sha512-+/DsiV4CxXl6ZWefwHZDXSe1Slitz21tom38qPCaG0DYCS1NnDPIQDTKcmQ/tvK/edJUKkmuIDBJbmKDiB0r/g==",
+ "dev": true
+ },
"@types/ws": {
- "version": "7.2.7",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.7.tgz",
- "integrity": "sha512-UUFC/xxqFLP17hTva8/lVT0SybLUrfSD9c+iapKb0fEiC8uoDbA+xuZ3pAN603eW+bY8ebSMLm9jXdIPnD0ZgA==",
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.0.tgz",
+ "integrity": "sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw==",
"dev": true,
"requires": {
"@types/node": "*"
@@ -2355,6 +2449,12 @@
"integrity": "sha512-wmk0xQI6Yy7Fs/il4EpOcflG4uonUpYGqvZARESLc2oy4u69fkatFLbJOeW4Q6awO15P4rduAe6xkwHevpXcUQ==",
"dev": true
},
+ "@ungap/global-this": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@ungap/global-this/-/global-this-0.4.2.tgz",
+ "integrity": "sha512-uFg7Kz+E12RBlgBLMlWVjmn2OIeE2J1Lzij0RseNcCVsrJX+LEB4fQ9MnoPXkXJmO5cHtTEzI5ATtb3IJfQ9tQ==",
+ "dev": true
+ },
"@wry/context": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@wry/context/-/context-0.5.2.tgz",
@@ -2546,13 +2646,13 @@
}
},
"apollo-cache-control": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.3.tgz",
- "integrity": "sha512-21GCeC9AIIa22uD0Vtqn/N0D5kOB4rY/Pa9aQhxVeLN+4f8Eu4nmteXhFypUD0LL1/58dmm8lS5embsfoIGjEA==",
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.4.tgz",
+ "integrity": "sha512-FUKE8ASr8GxVq5rmky/tY8bsf++cleGT591lfLiqnPsP1fo3kAfgRfWA2QRHTCKFNlQxzUhVOEDv+PaysqiOjw==",
"dev": true,
"requires": {
"apollo-server-env": "^2.4.5",
- "apollo-server-plugin-base": "^0.10.1"
+ "apollo-server-plugin-base": "^0.10.2"
}
},
"apollo-datasource": {
@@ -2565,15 +2665,6 @@
"apollo-server-env": "^2.4.5"
}
},
- "apollo-engine-reporting-protobuf": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.2.tgz",
- "integrity": "sha512-4wm9FR3B7UvJxcK/69rOiS5CAJPEYKufeRWb257ZLfX7NGFTMqvbc1hu4q8Ch7swB26rTpkzfsftLED9DqH9qg==",
- "dev": true,
- "requires": {
- "@apollo/protobufjs": "^1.0.3"
- }
- },
"apollo-env": {
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.5.tgz",
@@ -2609,9 +2700,9 @@
}
},
"apollo-reporting-protobuf": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.0.tgz",
- "integrity": "sha512-AFLQIuO0QhkoCF+41Be/B/YU0C33BZ0opfyXorIjM3MNNiEDSyjZqmUozlB3LqgfhT9mn2IR5RSsA+1b4VovDQ==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.1.tgz",
+ "integrity": "sha512-qr4DheFP154PGZsd93SSIS9RkqHnR5b6vT+eCloWjy3UIpY+yZ3cVLlttlIjYvOG4xTJ25XEwcHiAExatQo/7g==",
"dev": true,
"requires": {
"@apollo/protobufjs": "^1.0.3"
@@ -2627,28 +2718,28 @@
}
},
"apollo-server-core": {
- "version": "2.18.2",
- "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.18.2.tgz",
- "integrity": "sha512-phz57BFBukMa3Ta7ZVW7pj1pdUne9KYLbcBdEcITr+I0+nbhy+YM8gcgpOnjrokWYiEZgIe52XeM3m4BMLw5dg==",
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.19.0.tgz",
+ "integrity": "sha512-2aMKUVPyNbomJQaG2tkpfqvp1Tfgxgkdr7nX5zHudYNSzsPrHw+CcYlCbIVFFI/mTZsjoK9czNq1qerFRxZbJw==",
"dev": true,
"requires": {
"@apollographql/apollo-tools": "^0.4.3",
"@apollographql/graphql-playground-html": "1.6.26",
"@types/graphql-upload": "^8.0.0",
"@types/ws": "^7.0.0",
- "apollo-cache-control": "^0.11.3",
+ "apollo-cache-control": "^0.11.4",
"apollo-datasource": "^0.7.2",
"apollo-graphql": "^0.6.0",
- "apollo-reporting-protobuf": "^0.6.0",
+ "apollo-reporting-protobuf": "^0.6.1",
"apollo-server-caching": "^0.5.2",
"apollo-server-env": "^2.4.5",
"apollo-server-errors": "^2.4.2",
- "apollo-server-plugin-base": "^0.10.1",
- "apollo-server-types": "^0.6.0",
- "apollo-tracing": "^0.11.4",
+ "apollo-server-plugin-base": "^0.10.2",
+ "apollo-server-types": "^0.6.1",
+ "apollo-tracing": "^0.12.0",
"async-retry": "^1.2.1",
"fast-json-stable-stringify": "^2.0.0",
- "graphql-extensions": "^0.12.5",
+ "graphql-extensions": "^0.12.6",
"graphql-tag": "^2.9.2",
"graphql-tools": "^4.0.0",
"graphql-upload": "^8.0.2",
@@ -2660,17 +2751,6 @@
"ws": "^6.0.0"
},
"dependencies": {
- "apollo-server-types": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.0.tgz",
- "integrity": "sha512-usqXaz81bHxD2IZvKEQNnLpSbf2Z/BmobXZAjEefJEQv1ItNn+lJNUmSSEfGejHvHlg2A7WuAJKJWyDWcJrNnA==",
- "dev": true,
- "requires": {
- "apollo-reporting-protobuf": "^0.6.0",
- "apollo-server-caching": "^0.5.2",
- "apollo-server-env": "^2.4.5"
- }
- },
"graphql-upload": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz",
@@ -2736,19 +2816,20 @@
"dev": true
},
"apollo-server-express": {
- "version": "2.17.0",
- "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.17.0.tgz",
- "integrity": "sha512-PonpWOuM1DH3Cz0bu56Tusr3GXOnectC6AD/gy2GXK0v84E7tKTuxEY3SgsgxhvfvvhfwJbXTyIogL/wezqnCw==",
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.19.0.tgz",
+ "integrity": "sha512-3rgSrTme1SlLoecAYtSa8ThH6vYvz29QecgZCigq5Vdc6bFP2SZrCk0ls6BAdD8OZbVKUtizzRxd0yd/uREPAw==",
"dev": true,
"requires": {
"@apollographql/graphql-playground-html": "1.6.26",
"@types/accepts": "^1.3.5",
"@types/body-parser": "1.19.0",
- "@types/cors": "^2.8.4",
+ "@types/cors": "2.8.8",
"@types/express": "4.17.7",
+ "@types/express-serve-static-core": "4.17.13",
"accepts": "^1.3.5",
- "apollo-server-core": "^2.17.0",
- "apollo-server-types": "^0.5.1",
+ "apollo-server-core": "^2.19.0",
+ "apollo-server-types": "^0.6.1",
"body-parser": "^1.18.3",
"cors": "^2.8.4",
"express": "^4.17.1",
@@ -2760,46 +2841,33 @@
}
},
"apollo-server-plugin-base": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.1.tgz",
- "integrity": "sha512-XChCBDNyfByWqVXptsjPwrwrCj5cxMmNbchZZi8KXjtJ0hN2C/9BMNlInJd6bVGXvUbkRJYUakfKCfO5dZmwIg==",
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.2.tgz",
+ "integrity": "sha512-uM5uL1lOxbXdgvt/aEIbgs40fV9xA45Y3Mmh0VtQ/ddqq0MXR5aG92nnf8rM+URarBCUfxKJKaYzJJ/CXAnEdA==",
"dev": true,
"requires": {
- "apollo-server-types": "^0.6.0"
- },
- "dependencies": {
- "apollo-server-types": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.0.tgz",
- "integrity": "sha512-usqXaz81bHxD2IZvKEQNnLpSbf2Z/BmobXZAjEefJEQv1ItNn+lJNUmSSEfGejHvHlg2A7WuAJKJWyDWcJrNnA==",
- "dev": true,
- "requires": {
- "apollo-reporting-protobuf": "^0.6.0",
- "apollo-server-caching": "^0.5.2",
- "apollo-server-env": "^2.4.5"
- }
- }
+ "apollo-server-types": "^0.6.1"
}
},
"apollo-server-types": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.1.tgz",
- "integrity": "sha512-my2cPw+DAb2qVnIuBcsRKGyS28uIc2vjFxa1NpRoJZe9gK0BWUBk7wzXnIzWy3HZ5Er11e/40MPTUesNfMYNVA==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.1.tgz",
+ "integrity": "sha512-IEQ37aYvMLiTUzsySVLOSuvvhxuyYdhI05f3cnH6u2aN1HgGp7vX6bg+U3Ue8wbHfdcifcGIk5UEU+Q+QO6InA==",
"dev": true,
"requires": {
- "apollo-engine-reporting-protobuf": "^0.5.2",
+ "apollo-reporting-protobuf": "^0.6.1",
"apollo-server-caching": "^0.5.2",
"apollo-server-env": "^2.4.5"
}
},
"apollo-tracing": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.11.4.tgz",
- "integrity": "sha512-zBu/SwQlXfbdpcKLzWARGVjrEkIZUW3W9Mb4CCIzv07HbBQ8IQpmf9w7HIJJefC7rBiBJYg6JBGyuro3N2lxCA==",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.12.0.tgz",
+ "integrity": "sha512-cMUYGE6mOEwb9HDqhf4fiPEo2JMhjPIqEprAQEC57El76avRpRig5NM0bnqMZcYJZR5QmLlNcttNccOwf9WrNg==",
"dev": true,
"requires": {
"apollo-server-env": "^2.4.5",
- "apollo-server-plugin-base": "^0.10.1"
+ "apollo-server-plugin-base": "^0.10.2"
}
},
"apollo-upload-client": {
@@ -3938,13 +4006,21 @@
"dev": true
},
"camel-case": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz",
- "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
"dev": true,
"requires": {
- "pascal-case": "^3.1.1",
- "tslib": "^1.10.0"
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+ "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==",
+ "dev": true
+ }
}
},
"camelcase": {
@@ -4604,7 +4680,8 @@
"crypto-js": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz",
- "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg=="
+ "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==",
+ "optional": true
},
"cssfilter": {
"version": "0.0.10",
@@ -6645,33 +6722,20 @@
"dev": true
},
"graphql": {
- "version": "15.3.0",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.3.0.tgz",
- "integrity": "sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w==",
+ "version": "15.4.0",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.4.0.tgz",
+ "integrity": "sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA==",
"dev": true
},
"graphql-extensions": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.5.tgz",
- "integrity": "sha512-mGyGaktGpK3TVBtM0ZoyPX6Xk0mN9GYX9DRyFzDU4k4A2w93nLX7Ebcp+9/O5nHRmgrc0WziYYSmoWq2WNIoUQ==",
+ "version": "0.12.6",
+ "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.6.tgz",
+ "integrity": "sha512-EUNw+OIRXYTPxToSoJjhJvS5aGa94KkdkZnL1I9DCZT64/+rzQNeLeGj+goj2RYuYvoQe1Bmcx0CNZ1GqwBhng==",
"dev": true,
"requires": {
"@apollographql/apollo-tools": "^0.4.3",
"apollo-server-env": "^2.4.5",
- "apollo-server-types": "^0.6.0"
- },
- "dependencies": {
- "apollo-server-types": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.0.tgz",
- "integrity": "sha512-usqXaz81bHxD2IZvKEQNnLpSbf2Z/BmobXZAjEefJEQv1ItNn+lJNUmSSEfGejHvHlg2A7WuAJKJWyDWcJrNnA==",
- "dev": true,
- "requires": {
- "apollo-reporting-protobuf": "^0.6.0",
- "apollo-server-caching": "^0.5.2",
- "apollo-server-env": "^2.4.5"
- }
- }
+ "apollo-server-types": "^0.6.1"
}
},
"graphql-list-fields": {
@@ -8884,18 +8948,33 @@
}
},
"jwks-rsa": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.9.0.tgz",
- "integrity": "sha512-UPCfQQg0s2kF2Ju6UFJrQH73f7MaVN/hKBnYBYOp+X9KN4y6TLChhLtaXS5nRKbZqshwVdrZ9OY63m/Q9CLqcg==",
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.11.0.tgz",
+ "integrity": "sha512-G7ZgXZ3dlGbOUBQwgF+U/SVzOlI9KxJ9Uzp61bue2S5TV0h7c+kJRCl3bEPkC5PVmeu7/h82B3uQALVJMjzt/Q==",
"dev": true,
"requires": {
"@types/express-jwt": "0.0.42",
"axios": "^0.19.2",
"debug": "^4.1.0",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
"jsonwebtoken": "^8.5.1",
"limiter": "^1.1.5",
"lru-memoizer": "^2.1.2",
- "ms": "^2.1.2"
+ "ms": "^2.1.2",
+ "proxy-from-env": "^1.1.0"
+ },
+ "dependencies": {
+ "https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "dev": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ }
}
},
"jws": {
@@ -8983,9 +9062,9 @@
}
},
"ldapjs": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.1.1.tgz",
- "integrity": "sha512-XzF2BEGeM/nenYDAJvkDMYovZ07fIGalrYD+suprSqUWPCWpoa+a4vWl5g8o/En85m6NHWBpirDFNClWLAd77w==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.2.1.tgz",
+ "integrity": "sha512-p9gwfIsMPSLCYa7bVOWXZ7PHXAK3NkthxWyzY0bG99sWtIUXnYmB7Fown4JZ44dnhx73qe0+Hx1yXLVCRYG+bg==",
"dev": true,
"requires": {
"abstract-logging": "^2.0.0",
@@ -9171,9 +9250,9 @@
}
},
"loglevel": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz",
- "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==",
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
+ "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==",
"dev": true
},
"long": {
@@ -9192,12 +9271,20 @@
}
},
"lower-case": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz",
- "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
"dev": true,
"requires": {
- "tslib": "^1.10.0"
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+ "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==",
+ "dev": true
+ }
}
},
"lru-cache": {
@@ -9757,13 +9844,21 @@
"dev": true
},
"no-case": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz",
- "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
"dev": true,
"requires": {
- "lower-case": "^2.0.1",
- "tslib": "^1.10.0"
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+ "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==",
+ "dev": true
+ }
}
},
"node-fetch": {
@@ -9849,14 +9944,14 @@
}
},
"npmlog": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz",
- "integrity": "sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518=",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"requires": {
"are-we-there-yet": "~1.1.2",
"console-control-strings": "~1.1.0",
- "gauge": "~2.7.1",
+ "gauge": "~2.7.3",
"set-blocking": "~2.0.0"
}
},
@@ -10090,9 +10185,9 @@
}
},
"optimism": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.13.0.tgz",
- "integrity": "sha512-6JAh3dH+YUE4QUdsgUw8nUQyrNeBKfAEKOHMlLkQ168KhIYFIxzPsHakWrRXDnTO+x61RJrS3/2uEt6W0xlocA==",
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.13.1.tgz",
+ "integrity": "sha512-16RRVYZe8ODcUqpabpY7Gb91vCAbdhn8FHjlUb2Hqnjjow1j8Z1dlppds+yAsLbreNTVylLC+tNX6DuC2vt3Kw==",
"dev": true,
"requires": {
"@wry/context": "^0.5.2"
@@ -10142,6 +10237,16 @@
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
},
+ "otplib": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/otplib/-/otplib-12.0.1.tgz",
+ "integrity": "sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==",
+ "requires": {
+ "@otplib/core": "^12.0.1",
+ "@otplib/preset-default": "^12.0.1",
+ "@otplib/preset-v11": "^12.0.1"
+ }
+ },
"p-each-series": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
@@ -10244,9 +10349,9 @@
},
"dependencies": {
"debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
@@ -10312,33 +10417,33 @@
}
},
"parse": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/parse/-/parse-2.15.0.tgz",
- "integrity": "sha512-Aupg+qd6I4X5uTacpsxROg5GlhkVn2+qOHtyOhlGj/Woi75c5cPD8kn7qhhLKcVVpe2L+HoJ+yGkMdI8IjKBKA==",
+ "version": "2.18.0",
+ "resolved": "https://registry.npmjs.org/parse/-/parse-2.18.0.tgz",
+ "integrity": "sha512-RaSLhcpTZIaITanJY3YzVASyLaCTBh0v4Bq0M3nrKGQXWa9/iscWtidPhV6xpSBzat53aqO4eL3L5J1zwZzsUg==",
"dev": true,
"requires": {
- "@babel/runtime": "7.10.3",
- "@babel/runtime-corejs3": "7.10.3",
+ "@babel/runtime": "7.12.1",
+ "@babel/runtime-corejs3": "7.12.1",
"crypto-js": "4.0.0",
"react-native-crypto-js": "1.0.0",
"uuid": "3.4.0",
- "ws": "7.3.0",
+ "ws": "7.3.1",
"xmlhttprequest": "1.8.0"
},
"dependencies": {
"@babel/runtime": {
- "version": "7.10.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz",
- "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz",
+ "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==",
"dev": true,
"requires": {
"regenerator-runtime": "^0.13.4"
}
},
"@babel/runtime-corejs3": {
- "version": "7.10.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.3.tgz",
- "integrity": "sha512-HA7RPj5xvJxQl429r5Cxr2trJwOfPjKiqhCXcdQPSqO2G0RHPZpXu4fkYmBaTKCp2c/jRaMK9GB/lN+7zvvFPw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.1.tgz",
+ "integrity": "sha512-umhPIcMrlBZ2aTWlWjUseW9LjQKxi1dpFlQS8DzsxB//5K+u6GLTC/JliPKHsd5kJVPIU6X/Hy0YvWOYPcMxBw==",
"dev": true,
"requires": {
"core-js-pure": "^3.0.0",
@@ -10346,9 +10451,9 @@
}
},
"ws": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
- "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+ "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
"dev": true
}
}
@@ -10429,20 +10534,20 @@
"dev": true
},
"parse-server": {
- "version": "github:parse-community/parse-server#06cb79e6a595aefc05f3c4d28f6edcba607f39f5",
+ "version": "github:parse-community/parse-server#de9c7dc12eddc548fb9e911dbc52be616e4c36fa",
"from": "github:parse-community/parse-server#master",
"dev": true,
"requires": {
"@apollographql/graphql-playground-html": "1.6.26",
- "@graphql-tools/links": "^6.2.4",
- "@graphql-tools/stitch": "6.2.2",
- "@graphql-tools/utils": "6.2.2",
+ "@graphql-tools/links": "6.2.5",
+ "@graphql-tools/stitch": "6.2.4",
+ "@graphql-tools/utils": "6.2.4",
"@node-rs/bcrypt": "0.4.1",
- "@parse/fs-files-adapter": "1.0.1",
- "@parse/push-adapter": "3.3.0",
- "@parse/s3-files-adapter": "1.5.0",
+ "@parse/fs-files-adapter": "1.2.0",
+ "@parse/push-adapter": "3.4.0",
+ "@parse/s3-files-adapter": "1.6.0",
"@parse/simple-mailgun-adapter": "1.1.0",
- "apollo-server-express": "2.17.0",
+ "apollo-server-express": "2.19.0",
"bcryptjs": "2.4.3",
"body-parser": "1.19.0",
"commander": "5.1.0",
@@ -10450,29 +10555,29 @@
"deepcopy": "2.1.0",
"express": "4.17.1",
"follow-redirects": "1.13.0",
- "graphql": "15.3.0",
+ "graphql": "15.4.0",
"graphql-list-fields": "2.0.2",
"graphql-relay": "0.6.0",
"graphql-upload": "11.0.0",
"intersect": "1.0.1",
"jsonwebtoken": "8.5.1",
- "jwks-rsa": "1.9.0",
- "ldapjs": "2.1.1",
+ "jwks-rsa": "1.11.0",
+ "ldapjs": "2.2.1",
"lodash": "4.17.20",
"lru-cache": "5.1.1",
"mime": "2.4.6",
"mongodb": "3.6.2",
- "parse": "2.15.0",
- "pg-promise": "10.6.1",
+ "parse": "2.18.0",
+ "pg-promise": "10.8.1",
"pluralize": "8.0.0",
"redis": "3.0.2",
"semver": "7.3.2",
"subscriptions-transport-ws": "0.9.18",
"tv4": "1.3.0",
- "uuid": "8.3.0",
+ "uuid": "8.3.1",
"winston": "3.3.3",
"winston-daily-rotate-file": "4.5.0",
- "ws": "7.3.1"
+ "ws": "7.4.0"
},
"dependencies": {
"mime": {
@@ -10488,15 +10593,9 @@
"dev": true
},
"uuid": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
- "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==",
- "dev": true
- },
- "ws": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
- "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+ "version": "8.3.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz",
+ "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==",
"dev": true
}
}
@@ -10514,13 +10613,21 @@
"dev": true
},
"pascal-case": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz",
- "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
"dev": true,
"requires": {
- "no-case": "^3.0.3",
- "tslib": "^1.10.0"
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+ "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==",
+ "dev": true
+ }
}
},
"pascalcase": {
@@ -10638,27 +10745,18 @@
"dev": true
},
"pg": {
- "version": "8.3.3",
- "resolved": "https://registry.npmjs.org/pg/-/pg-8.3.3.tgz",
- "integrity": "sha512-wmUyoQM/Xzmo62wgOdQAn5tl7u+IA1ZYK7qbuppi+3E+Gj4hlUxVHjInulieWrd0SfHi/ADriTb5ILJ/lsJrSg==",
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.5.1.tgz",
+ "integrity": "sha512-9wm3yX9lCfjvA98ybCyw2pADUivyNWT/yIP4ZcDVpMN0og70BUWYEGXPCTAQdGTAqnytfRADb7NERrY1qxhIqw==",
"dev": true,
"requires": {
"buffer-writer": "2.0.0",
"packet-reader": "1.0.0",
- "pg-connection-string": "^2.3.0",
- "pg-pool": "^3.2.1",
- "pg-protocol": "^1.2.5",
+ "pg-connection-string": "^2.4.0",
+ "pg-pool": "^3.2.2",
+ "pg-protocol": "^1.4.0",
"pg-types": "^2.1.0",
- "pgpass": "1.x",
- "semver": "4.3.2"
- },
- "dependencies": {
- "semver": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
- "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=",
- "dev": true
- }
+ "pgpass": "1.x"
}
},
"pg-connection-string": {
@@ -10680,27 +10778,27 @@
"dev": true
},
"pg-pool": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.1.tgz",
- "integrity": "sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.2.tgz",
+ "integrity": "sha512-ORJoFxAlmmros8igi608iVEbQNNZlp89diFVx6yV5v+ehmpMY9sK6QgpmgoXbmkNaBAx8cOOZh9g80kJv1ooyA==",
"dev": true
},
"pg-promise": {
- "version": "10.6.1",
- "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.6.1.tgz",
- "integrity": "sha512-Ahde0/04RmEPwryMcDV8ya4XXjfNWD44EuckgFPFQOIX/3smZS2ygeSXPEy4DmDxoSkSF6Y6vK8Bc4fN+bYMxg==",
+ "version": "10.8.1",
+ "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.8.1.tgz",
+ "integrity": "sha512-xRW3PBopAAPlSmOutfpxwrd0i1wfiVoJjkRC2xYzwk0PwWGLEOVKoDEHX4VoqjfIJ+SEEiILy5B5nUVvXpFFVA==",
"dev": true,
"requires": {
"assert-options": "0.6.2",
- "pg": "8.3.3",
+ "pg": "8.5.1",
"pg-minify": "1.6.1",
"spex": "3.0.2"
}
},
"pg-protocol": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.3.0.tgz",
- "integrity": "sha512-64/bYByMrhWULUaCd+6/72c9PMWhiVFs3EVxl9Ct6a3v/U8+rKgqP2w+kKg/BIGgMJyB+Bk/eNivT32Al+Jghw==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz",
+ "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==",
"dev": true
},
"pg-types": {
@@ -10717,12 +10815,12 @@
}
},
"pgpass": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz",
- "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz",
+ "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==",
"dev": true,
"requires": {
- "split": "^1.0.0"
+ "split2": "^3.1.1"
}
},
"pify": {
@@ -10955,9 +11053,9 @@
}
},
"debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
@@ -12201,15 +12299,6 @@
"integrity": "sha512-ZNCrOso+oNv5P01HCO4wuxV9Og5rS6ms7gGAqugfBPjx1QwfNXJI3T02ldfaap1O0dlT1sB0Rk+mhDqxt3Z27w==",
"dev": true
},
- "split": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
- "dev": true,
- "requires": {
- "through": "2"
- }
- },
"split-string": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@@ -12219,6 +12308,28 @@
"extend-shallow": "^3.0.0"
}
},
+ "split2": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+ "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^3.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -12759,6 +12870,11 @@
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
+ "thirty-two": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
+ "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno="
+ },
"throat": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
diff --git a/package.json b/package.json
index ad6a04fbd..1999f486c 100644
--- a/package.json
+++ b/package.json
@@ -29,8 +29,9 @@
"react-native": false
},
"dependencies": {
- "@babel/runtime-corejs3": "7.12.5",
"@babel/runtime": "7.12.5",
+ "@babel/runtime-corejs3": "7.12.5",
+ "otplib": "12.0.1",
"react-native-crypto-js": "1.0.0",
"uuid": "3.4.0",
"ws": "7.4.0",
@@ -71,7 +72,7 @@
"jsdoc": "3.6.3",
"jsdoc-babel": "0.5.0",
"metro-react-native-babel-preset": "0.59.0",
- "parse-server": "github:parse-community/parse-server#master",
+ "parse-server": "github:dblythy/parse-server#2FA",
"regenerator-runtime": "0.13.5",
"vinyl-source-stream": "2.0.0"
},
diff --git a/src/ParseObject.js b/src/ParseObject.js
index 989fa81e7..1de58b503 100644
--- a/src/ParseObject.js
+++ b/src/ParseObject.js
@@ -370,6 +370,13 @@ class ParseObject {
}
}
+ _setMfaEnabled() {
+ const serverData = this._getServerData();
+ serverData.mfaEnabled = true;
+ const stateController = CoreManager.getObjectStateController();
+ stateController.setServerData(this._getStateIdentifier(), serverData);
+ }
+
_migrateId(serverId: string) {
if (this._localId && serverId) {
if (singleInstance) {
diff --git a/src/ParseUser.js b/src/ParseUser.js
index 115eeff1b..b7f0f5502 100644
--- a/src/ParseUser.js
+++ b/src/ParseUser.js
@@ -450,11 +450,40 @@ class ParseUser extends ParseObject {
if (options.hasOwnProperty('usePost')) {
loginOptions.usePost = options.usePost;
}
+ if (options.hasOwnProperty('token')) {
+ loginOptions.token = options.token;
+ }
+ if (options.hasOwnProperty('recoveryKeys')) {
+ loginOptions.recoveryKeys = options.recoveryKeys;
+ }
const controller = CoreManager.getUserController();
return controller.logIn(this, loginOptions);
}
+ /**
+ * Enables multi-factor authentication. Returns an qrcodeURL and a secret.
+ * Users need to add secret to their third party authenticator app, and validate after using,
+ * user.verifyMfa(token);
.
+ *
+ * @returns {Promise} When complete, returns a qrcodeURL that can be rendered in QRCode and scanned, or opened if the device supports it.
+ */
+ enableMfa() {
+ const controller = CoreManager.getUserController();
+ return controller.enableMfa(this);
+ }
+
+ /**
+ * Used to confirm that the user has correctly added the multi-factor secret to their third party authenticator app.
+ *
+ * @param {string} token a short code generated from the third party authenticator app used to verify the request
+ * @returns {Promise} When complete, returns recoveryKeys that can be later used to unlock the account.
+ */
+ verifyMfa(token): Promise {
+ const controller = CoreManager.getUserController();
+ return controller.verifyMfa(this, token);
+ }
+
/**
* Wrap the default save behavior with functionality to save to local
* storage if this is current user.
@@ -1109,8 +1138,12 @@ const DefaultController = {
const stateController = CoreManager.getObjectStateController();
const auth = {
username: user.get('username'),
- password: user.get('password')
+ password: user.get('password'),
+ token : options.token,
+ recoveryKeys : options.recoveryKeys
};
+ delete options.token
+ delete options.recoveryKeys
return RESTController.request(
options.usePost ? 'POST' : 'GET', 'login', auth, options
).then((response) => {
@@ -1132,6 +1165,23 @@ const DefaultController = {
});
},
+ enableMfa(user): Promise {
+ const RESTController = CoreManager.getRESTController();
+ return RESTController.request(
+ 'GET', 'users/me/enableMfa', { _SessionToken: user.getSessionToken() }
+ )
+ },
+
+ verifyMfa(user,token): Promise {
+ const RESTController = CoreManager.getRESTController();
+ return RESTController.request(
+ 'POST', 'users/me/verifyMfa', { _SessionToken: user.getSessionToken(), token}
+ ).then((response) => {
+ user._setMfaEnabled();
+ return response;
+ })
+ },
+
become(user: ParseUser, options: RequestOptions): Promise {
const RESTController = CoreManager.getRESTController();
return RESTController.request(