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(