diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cef6db349..ff648c859e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,60 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [v5.69.0](https://github.com/opengovsg/FormSG/compare/v5.68.0...v5.69.0) + +- build: merge release-v5.68.0 back to develop [`#4771`](https://github.com/opengovsg/FormSG/pull/4771) +- fix(deps): bump moment-timezone from 0.5.34 to 0.5.37 [`#4761`](https://github.com/opengovsg/FormSG/pull/4761) +- fix(deps): bump express-rate-limit from 6.5.1 to 6.5.2 [`#4703`](https://github.com/opengovsg/FormSG/pull/4703) +- chore(deps-dev): bump core-js from 3.24.1 to 3.25.0 [`#4704`](https://github.com/opengovsg/FormSG/pull/4704) +- fix(deps): bump libphonenumber-js from 1.10.12 to 1.10.13 [`#4701`](https://github.com/opengovsg/FormSG/pull/4701) +- chore(deps-dev): bump @types/validator from 13.7.5 to 13.7.6 [`#4702`](https://github.com/opengovsg/FormSG/pull/4702) +- fix(deps): bump date-fns from 2.29.1 to 2.29.2 [`#4692`](https://github.com/opengovsg/FormSG/pull/4692) +- fix(deps): bump twilio from 3.80.1 to 3.81.0 [`#4694`](https://github.com/opengovsg/FormSG/pull/4694) +- fix(deps): bump type-fest from 2.18.1 to 2.19.0 in /shared [`#4663`](https://github.com/opengovsg/FormSG/pull/4663) +- chore(deps-dev): bump ngrok from 4.3.2 to 4.3.3 [`#4689`](https://github.com/opengovsg/FormSG/pull/4689) +- chore(deps-dev): bump ts-essentials from 9.2.0 to 9.3.0 [`#4688`](https://github.com/opengovsg/FormSG/pull/4688) +- fix(deps): bump mongoose from 5.13.14 to 5.13.15 [`#4687`](https://github.com/opengovsg/FormSG/pull/4687) +- chore(deps-dev): bump @types/lodash from 4.14.182 to 4.14.184 [`#4680`](https://github.com/opengovsg/FormSG/pull/4680) +- fix(deps): bump openid-client from 5.1.8 to 5.1.9 [`#4681`](https://github.com/opengovsg/FormSG/pull/4681) +- chore(deps-dev): bump type-fest from 2.18.0 to 2.19.0 [`#4675`](https://github.com/opengovsg/FormSG/pull/4675) +- fix(deps): bump @sentry/browser from 7.10.0 to 7.11.1 [`#4678`](https://github.com/opengovsg/FormSG/pull/4678) +- fix(deps): bump jose from 4.8.3 to 4.9.0 [`#4676`](https://github.com/opengovsg/FormSG/pull/4676) +- fix(deps): bump dd-trace from 2.12.2 to 3.0.0 [`#4592`](https://github.com/opengovsg/FormSG/pull/4592) +- chore(deps-dev): bump eslint-plugin-jest from 26.8.3 to 26.8.7 [`#4662`](https://github.com/opengovsg/FormSG/pull/4662) +- fix(deps): bump type-fest from 2.18.0 to 2.18.1 in /shared [`#4613`](https://github.com/opengovsg/FormSG/pull/4613) +- fix(deps): bump libphonenumber-js from 1.10.12 to 1.10.13 in /shared [`#4614`](https://github.com/opengovsg/FormSG/pull/4614) +- chore: upgrade chromium [`#4607`](https://github.com/opengovsg/FormSG/pull/4607) +- fix: return correct statuses on submission routes when sgid errors occur [`#4600`](https://github.com/opengovsg/FormSG/pull/4600) +- fix(deps): bump date-fns from 2.29.1 to 2.29.2 in /shared [`#4602`](https://github.com/opengovsg/FormSG/pull/4602) +- chore(deps-dev): bump ngrok from 4.3.1 to 4.3.2 [`#4594`](https://github.com/opengovsg/FormSG/pull/4594) +- feat: log redirects to login for sp cp myinfo sgid [`#4585`](https://github.com/opengovsg/FormSG/pull/4585) +- Revert "feat: migration corppass to oidc (#4248)" [`#4586`](https://github.com/opengovsg/FormSG/pull/4586) +- fix(deps): bump nodemailer from 6.7.7 to 6.7.8 [`#4589`](https://github.com/opengovsg/FormSG/pull/4589) +- fix(deps): bump aws-sdk from 2.1194.0 to 2.1195.0 [`#4588`](https://github.com/opengovsg/FormSG/pull/4588) +- fix(deps): bump @sentry/browser from 7.9.0 to 7.10.0 [`#4584`](https://github.com/opengovsg/FormSG/pull/4584) +- chore(deps-dev): bump eslint-plugin-jest from 26.8.2 to 26.8.3 [`#4583`](https://github.com/opengovsg/FormSG/pull/4583) + +#### [v5.68.0](https://github.com/opengovsg/FormSG/compare/v5.67.0...v5.68.0) + +> 30 August 2022 + +- build: Release 5.68.0 [`#4575`](https://github.com/opengovsg/FormSG/pull/4575) +- feat: migration corppass to oidc [`#4248`](https://github.com/opengovsg/FormSG/pull/4248) +- chore(deps-dev): bump jest-localstorage-mock from 2.4.21 to 2.4.22 [`#4572`](https://github.com/opengovsg/FormSG/pull/4572) +- fix(deps): bump libphonenumber-js from 1.10.11 to 1.10.12 [`#4570`](https://github.com/opengovsg/FormSG/pull/4570) +- fix(deps): bump aws-sdk from 2.1192.0 to 2.1194.0 [`#4571`](https://github.com/opengovsg/FormSG/pull/4571) +- fix(deps): bump libphonenumber-js from 1.10.11 to 1.10.12 in /shared [`#4559`](https://github.com/opengovsg/FormSG/pull/4559) +- fix(deps): bump twilio from 3.80.0 to 3.80.1 [`#4558`](https://github.com/opengovsg/FormSG/pull/4558) +- fix(deps): bump aws-sdk from 2.1191.0 to 2.1192.0 [`#4557`](https://github.com/opengovsg/FormSG/pull/4557) +- build: merge 5.67.0 into develop [`#4555`](https://github.com/opengovsg/FormSG/pull/4555) +- build: release 5.67.0 [`#4553`](https://github.com/opengovsg/FormSG/pull/4553) +- chore: bump version to 5.68.0 [`b1b88c1`](https://github.com/opengovsg/FormSG/commit/b1b88c1c68f64c1eaf879f46e844231f22c7cb76) + #### [v5.67.0](https://github.com/opengovsg/FormSG/compare/v5.66.0...v5.67.0) +> 11 August 2022 + - chore(deps-dev): bump axios-mock-adapter from 1.21.1 to 1.21.2 [`#4543`](https://github.com/opengovsg/FormSG/pull/4543) - fix(deps): bump zod from 3.17.10 to 3.18.0 in /shared [`#4544`](https://github.com/opengovsg/FormSG/pull/4544) - fix(deps): bump aws-sdk from 2.1188.0 to 2.1191.0 [`#4534`](https://github.com/opengovsg/FormSG/pull/4534) @@ -35,6 +87,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fix(deps): bump neverthrow from 4.4.2 to 5.0.0 [`#4416`](https://github.com/opengovsg/FormSG/pull/4416) - build: merge release-al2 into develop [`#4449`](https://github.com/opengovsg/FormSG/pull/4449) - build: release 5.66.0 [`#4439`](https://github.com/opengovsg/FormSG/pull/4439) +- chore: bump version to 5.67.0 [`0bd59a4`](https://github.com/opengovsg/FormSG/commit/0bd59a4abd1c0dd88cd8605830b8f2a735ceaffd) #### [v5.66.0](https://github.com/opengovsg/FormSG/compare/v5.65.0...v5.66.0) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 16a95c0225..39bfe9f342 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -24816,6 +24816,11 @@ "sshpk": "^1.7.0" } }, + "http-status-codes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz", + "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==" + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", diff --git a/package-lock.json b/package-lock.json index 2d95e1c582..e8b79efb8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "FormSG", - "version": "5.67.0", + "version": "5.69.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4454,34 +4454,9 @@ } }, "@datadog/sketches-js": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@datadog/sketches-js/-/sketches-js-1.0.5.tgz", - "integrity": "sha512-1ZKyHxxgDI+zY0r+7msMUhFdLR7gkRgKGcNLdYjtXVyo5H64q16J/Khfp5+YAXOedKizKzT0Jf0kLwQ/IBU/pA==", - "requires": { - "protobufjs": "^6.11.3" - }, - "dependencies": { - "protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - } - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@datadog/sketches-js/-/sketches-js-2.0.0.tgz", + "integrity": "sha512-cR9r5sGYU64HLUe7vRvWuZO8qFrCPWanB/a2nrPPW5E7JVwt5j9QCEjhtPZo6LoImfVr3SajcbmyGwZfFLsHjw==" }, "@eslint/eslintrc": { "version": "0.4.3", @@ -5917,34 +5892,34 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@sentry/browser": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.10.0.tgz", - "integrity": "sha512-RNOKCRonqzUOqyM/JcjxjCOMosfS0MRmzkBKWewfyXse9AqfqC9+y8BI5J7wFmpYCypQP72JROKPBaxi7rvOFw==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.11.1.tgz", + "integrity": "sha512-k2XHuzPfnm8VJPK5eWd1+Y5VCgN42sLveb8Qxc3prb5PSL416NWMLZaoB7RMIhy430fKrSFiosnm6QDk2M6pbA==", "requires": { - "@sentry/core": "7.10.0", - "@sentry/types": "7.10.0", - "@sentry/utils": "7.10.0", + "@sentry/core": "7.11.1", + "@sentry/types": "7.11.1", + "@sentry/utils": "7.11.1", "tslib": "^1.9.3" } }, "@sentry/core": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.10.0.tgz", - "integrity": "sha512-uq6oUXPH+6cjsEL5/j/xSW91mVrJo7knTqax7E5MDiA5j98BPK4budGiBiPO7GEB856QhA7N+pOO0lccii5QYQ==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.11.1.tgz", + "integrity": "sha512-kaDSZ6VNuO4ZZdqUOOX6XM6x+kjo2bMnDQ3IJG51FPvVjr8lXYhXj1Ccxcot3pBYAIWPPby2+vNDOXllmXqoBA==", "requires": { - "@sentry/hub": "7.10.0", - "@sentry/types": "7.10.0", - "@sentry/utils": "7.10.0", + "@sentry/hub": "7.11.1", + "@sentry/types": "7.11.1", + "@sentry/utils": "7.11.1", "tslib": "^1.9.3" } }, "@sentry/hub": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-7.10.0.tgz", - "integrity": "sha512-9Appy7J87EU7Xu2BDY1cLK79nsuE72geeYmG71lgdttTD3XOMcQBOxET4/2sAI+d/ansurXnURx+DAQ9FOKT+w==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-7.11.1.tgz", + "integrity": "sha512-M6ClgdXdptS0lUBKB5KpXXe2qMQhsoiEN2pEGRI6+auqhfHCUQB1ZXsfjiOYexKC9fwx7TyFyZ9Jcaf2DTxEhw==", "requires": { - "@sentry/types": "7.10.0", - "@sentry/utils": "7.10.0", + "@sentry/types": "7.11.1", + "@sentry/utils": "7.11.1", "tslib": "^1.9.3" } }, @@ -5976,16 +5951,16 @@ } }, "@sentry/types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.10.0.tgz", - "integrity": "sha512-1UBwdbS0xXzANzp63g4eNQly/qKIXp0swP5OTKWoADvKBtL4anroLUA/l8ADMtuwFZYtVANc8WRGxM2+YmaXtg==" + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.11.1.tgz", + "integrity": "sha512-gIEhOPxC2cjrxQ0+K2SFJ1P6e/an5osSxVc9OOtekN28eHtVsXFCLB8XVWeNQnS7N2VkrVrkqORMBz1kvIcvVQ==" }, "@sentry/utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.10.0.tgz", - "integrity": "sha512-/aD2DnfyOhV0Wdbb6VF78vu4fQIZJyuReDpBI7MV/EqcEB6FxUKq2YjinfKZF/exHEPig6Ag/Yt+CRFgvtVFuw==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.11.1.tgz", + "integrity": "sha512-tRVXNT5O9ilkV31pyHeTqA1PcPQfMV/2OR6yUYM4ah+QVISovC0f0ybhByuH5nYg6x/Gsnx1o7pc8L1GE3+O7A==", "requires": { - "@sentry/types": "7.10.0", + "@sentry/types": "7.11.1", "tslib": "^1.9.3" } }, @@ -6008,9 +5983,9 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "@sindresorhus/is": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz", - "integrity": "sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true }, "@sinonjs/commons": { @@ -6540,6 +6515,12 @@ } } }, + "@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", + "dev": true + }, "@types/json-schema": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", @@ -6583,18 +6564,18 @@ "dev": true }, "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "requires": { "@types/node": "*" } }, "@types/lodash": { - "version": "4.14.182", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", + "version": "4.14.184", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", + "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", "dev": true }, "@types/long": { @@ -6782,7 +6763,7 @@ "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", "dev": true }, "@types/strip-json-comments": { @@ -6811,9 +6792,9 @@ } }, "@types/tmp": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.0.tgz", - "integrity": "sha512-flgpHJjntpBAdJD43ShRosQvNC0ME97DCfGvZEDlAThQmnerRXrLbX6YgzRBQCZTthET9eAWFAMaYP0m0Y4HzQ==" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==" }, "@types/triple-beam": { "version": "1.3.2", @@ -6840,9 +6821,9 @@ "dev": true }, "@types/validator": { - "version": "13.7.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.5.tgz", - "integrity": "sha512-9rQHeAqz6Jw3gDhttkmWetoriW5FPbxylv/6h6mXtaj2NKRcOvOmvfcswVdLVpbuy10NrO486K3lCoLgoIhiIA==", + "version": "13.7.6", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.6.tgz", + "integrity": "sha512-uBsnWETsUagQ0n6G2wcXNIufpTNJir0zqzG4p62fhnwzs48d/iuOWEEo0d3iUxN7D+9R/8CSvWGKS+KmaD0mWA==", "dev": true }, "@types/yargs": { @@ -7066,15 +7047,15 @@ } }, "@typescript-eslint/utils": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz", - "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.1.tgz", + "integrity": "sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/typescript-estree": "5.33.0", + "@typescript-eslint/scope-manager": "5.33.1", + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/typescript-estree": "5.33.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -7086,29 +7067,29 @@ "dev": true }, "@typescript-eslint/scope-manager": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", - "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", + "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/visitor-keys": "5.33.0" + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/visitor-keys": "5.33.1" } }, "@typescript-eslint/types": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz", - "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", + "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", - "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", + "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/visitor-keys": "5.33.0", + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/visitor-keys": "5.33.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7117,12 +7098,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", - "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", + "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/types": "5.33.1", "eslint-visitor-keys": "^3.3.0" } }, @@ -7511,7 +7492,7 @@ "addressparser": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg==", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", "dev": true }, "agent-base": { @@ -7762,7 +7743,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { "version": "3.1.4", @@ -7949,7 +7930,7 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asar": { "version": "2.1.0", @@ -8144,9 +8125,9 @@ "integrity": "sha512-24q5Rh3bno7ldoyCq99d6hpnLI+PAMocdeVaaGt/5BTQMprvDwQToHfNnruqN11odCHZZIQbRBw+nZo1lTCH9g==" }, "aws-sdk": { - "version": "2.1193.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1193.0.tgz", - "integrity": "sha512-nSbljBZhxNn+LmENc14md+y1Z+U8BUcS1LLlOxeJvjYAkkGbPf29Bl8FvzbRsZuoxtF6N1Mkel3AI5XIx7mkew==", + "version": "2.1195.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1195.0.tgz", + "integrity": "sha512-xU7177JhKM+4SsLnoA6/r3qGzSXmbLgw/YC1KRHvZyJCbuTY+vdAGLaldbtNXjjwmE3a6EeoCREANv8GY62VdQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -8632,7 +8613,7 @@ "base32.js": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", + "integrity": "sha1-tYLexpPC8R6JPPBk7mrFthMaIgI=", "dev": true }, "base64-js": { @@ -9234,29 +9215,6 @@ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true }, - "cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^2.0.0" - }, - "dependencies": { - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - } - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -9747,9 +9705,9 @@ } }, "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -9943,6 +9901,16 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "dev": true, + "requires": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -10604,9 +10572,9 @@ } }, "core-js": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz", - "integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", + "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==", "dev": true }, "core-js-compat": { @@ -11203,25 +11171,24 @@ } }, "date-fns": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.1.tgz", - "integrity": "sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw==" + "version": "2.29.2", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.2.tgz", + "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==" }, "dayjs": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", - "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", + "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==" }, "dd-trace": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/dd-trace/-/dd-trace-2.12.2.tgz", - "integrity": "sha512-ZRDDjuZl10CMDyJYair6dV87Zaz63NfOoon/r99fYdZi/ISAUtvun64OmOEdE3Kl8A3LOL4wY25nvB3YTDnwjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dd-trace/-/dd-trace-3.0.0.tgz", + "integrity": "sha512-WIph8PS1U/1D+SahEPSAbt6sAdH9lbEzNmhmOBAhkxYdHbuuFlxqgq6YpGHB8BviRqs4oCsYmR1Sr4HkBuglNg==", "requires": { "@datadog/native-appsec": "^1.2.1", "@datadog/native-metrics": "^1.4.2", "@datadog/pprof": "^1.0.2", - "@datadog/sketches-js": "^1.0.5", - "@types/node": ">=12", + "@datadog/sketches-js": "^2.0.0", "crypto-randomuuid": "^1.0.0", "diagnostics_channel": "^1.1.0", "ignore": "^5.2.0", @@ -11256,6 +11223,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" }, @@ -11263,7 +11231,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -11607,7 +11576,7 @@ "dezalgo": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "dev": true, "requires": { "asap": "^2.0.0", @@ -11793,7 +11762,7 @@ "dynamic-dedupe": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", "dev": true, "requires": { "xtend": "^4.0.0" @@ -11887,7 +11856,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { "version": "1.4.4", @@ -12892,9 +12861,9 @@ } }, "eslint-plugin-jest": { - "version": "26.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.8.2.tgz", - "integrity": "sha512-67oh0FKaku9y48OpLzL3uK9ckrgLb83Sp5gxxTbtOGDw9lq6D8jw/Psj/9CipkbK406I2M7mvx1q+pv/MdbvxA==", + "version": "26.8.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.8.7.tgz", + "integrity": "sha512-nJJVv3VY6ZZvJGDMC8h1jN/TIGT4We1JkNn1lvstPURicr/eZPVnlFULQ4W2qL9ByCuCr1hPmlBOc2aZ1ktw4Q==", "dev": true, "requires": { "@typescript-eslint/utils": "^5.10.0" @@ -13043,7 +13012,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { "version": "4.0.7", @@ -13053,7 +13022,7 @@ "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "evp_bytestokey": { "version": "1.0.3", @@ -13387,9 +13356,9 @@ } }, "express-rate-limit": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.5.1.tgz", - "integrity": "sha512-pxO6ioBLd3i8IHL+RmJtL4noYzte5fugoMdaDabtU4hcg53+x0QkTwfPtM7vWD0YUaXQgNj9NRdzmps+CHEHlA==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.5.2.tgz", + "integrity": "sha512-N0cG/5ccbXfNC+FxRu7ujm2HjKkygF2PL7KLAf/hct9uqKB5QkZVizb/hEst6tUBXnfhblYWgOorN2eY+Saerw==" }, "express-request-id": { "version": "1.4.1", @@ -14081,7 +14050,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from2": { "version": "2.3.0", @@ -14707,42 +14676,6 @@ } } }, - "got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -15657,7 +15590,7 @@ "ipv6-normalize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz", - "integrity": "sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==", + "integrity": "sha1-GzJYKQ02X6gyOeiZB93kWS52IKg=", "dev": true }, "is-absolute-url": { @@ -18162,9 +18095,9 @@ } }, "jest-localstorage-mock": { - "version": "2.4.21", - "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.21.tgz", - "integrity": "sha512-IBXPBufnfPyr4VkoQeJ+zlfWlG84P0KbL4ejcV9j3xNI0v6OWznQlH6Ke9xjSarleR11090oSeWADSUow0PmFw==", + "version": "2.4.22", + "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.22.tgz", + "integrity": "sha512-60PWSDFQOS5v7JzSmYLM3dPLg0JLl+2Vc4lIEz/rj2yrXJzegsFLn7anwc5IL0WzJbBa/Las064CHbFg491/DQ==", "dev": true }, "jest-matcher-utils": { @@ -20606,9 +20539,9 @@ } }, "jose": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.8.3.tgz", - "integrity": "sha512-7rySkpW78d8LBp4YU70Wb7+OTgE3OwAALNVZxhoIhp4Kscp+p/fBkdpxGAMKxvCAMV4QfXBU9m6l9nX/vGwd2g==" + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.9.0.tgz", + "integrity": "sha512-RgaqEOZLkVO+ViN3KkN44XJt9g7+wMveUv59sVLaTxONcUPc8ZpfqOCeLphVBZyih2dgkvZ0Ap1CNcokvY7Uyw==" }, "jquery": { "version": "3.5.1", @@ -20843,11 +20776,12 @@ "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" }, "keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.4.1.tgz", + "integrity": "sha512-PzByhNxfBLnSBW2MZi1DF+W5+qB/7BMpOokewqIvqS8GFtP7xHm2oeGU72Y1fhtfOv/FiEnI4+nyViYDmUChnw==", "dev": true, "requires": { + "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -20919,9 +20853,9 @@ } }, "libphonenumber-js": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.11.tgz", - "integrity": "sha512-ehoihx4HpRXO6FH/uJ0EnaEV4dVU+FDny+jv0S6k9JPyPsAIr0eXDAFvGRMBKE1daCtyHAaFSKCiuCxrOjVAzQ==" + "version": "1.10.13", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.13.tgz", + "integrity": "sha512-b74iyWmwb4GprAUPjPkJ11GTC7KX4Pd3onpJfKxYyY8y9Rbb4ERY47LvCMEDM09WD3thiLDMXtkfDK/AX+zT7Q==" }, "lie": { "version": "3.1.1", @@ -21495,7 +21429,8 @@ "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true }, "longest-streak": { "version": "2.0.4", @@ -22464,32 +22399,41 @@ "dev": true }, "moment-timezone": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", - "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", + "version": "0.5.37", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz", + "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", "requires": { "moment": ">= 2.9.0" } }, "mongodb": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", - "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", "optional": true, "requires": { "bl": "^2.2.1", "bson": "^1.1.4", "denque": "^1.4.1", - "require_optional": "^1.0.1", + "optional-require": "^1.1.8", "safe-buffer": "^5.1.2", "saslprep": "^1.0.0" }, "dependencies": { "bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", "optional": true + }, + "optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "optional": true, + "requires": { + "require-at": "^1.0.6" + } } } }, @@ -22517,14 +22461,6 @@ "yauzl": "^2.10.0" }, "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -22536,9 +22472,9 @@ } }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "cross-spawn": { "version": "7.0.3", @@ -22551,57 +22487,23 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -22622,32 +22524,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -22672,9 +22548,9 @@ } }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -22704,14 +22580,6 @@ "readable-stream": "^3.1.1" } }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -22719,11 +22587,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -22733,9 +22596,9 @@ "integrity": "sha1-D3ca0W9IOuZfQoeWlCjp+8SqYYE=" }, "mongoose": { - "version": "5.13.14", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.14.tgz", - "integrity": "sha512-j+BlQjjxgZg0iWn42kLeZTB91OejcxWpY2Z50bsZTiKJ7HHcEtcY21Godw496GMkBqJMTzmW7G/kZ04mW+Cb7Q==", + "version": "5.13.15", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.15.tgz", + "integrity": "sha512-cxp1Gbb8yUWkaEbajdhspSaKzAvsIvOtRlYD87GN/P2QEUhpd6bIvebi36T6M0tIVAMauNaK9SPA055N3PwF8Q==", "requires": { "@types/bson": "1.x || 4.0.x", "@types/mongodb": "^3.5.27", @@ -22871,6 +22734,19 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -22989,14 +22865,14 @@ } }, "ngrok": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ngrok/-/ngrok-4.3.1.tgz", - "integrity": "sha512-s0joO2liKYiGTVARyzL8hfLIXAZT03GDK3oJqsZK6d61Es+HCx77j8E9ysUbtkMEyvBgYmIMr8taQNsvQt4/DQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/ngrok/-/ngrok-4.3.3.tgz", + "integrity": "sha512-a2KApnkiG5urRxBPdDf76nNBQTnNNWXU0nXw0SsqsPI+Kmt2lGf9TdVYpYrHMnC+T9KhcNSWjCpWqBgC6QcFvw==", "dev": true, "requires": { "@types/node": "^8.10.50", "extract-zip": "^2.0.1", - "got": "^11.5.1", + "got": "^11.8.5", "hpagent": "^0.1.2", "lodash.clonedeep": "^4.5.0", "uuid": "^7.0.0 || ^8.0.0", @@ -23008,6 +22884,61 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true } } }, @@ -23264,9 +23195,9 @@ } }, "nodemailer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.7.tgz", - "integrity": "sha512-pOLC/s+2I1EXuSqO5Wa34i3kXZG3gugDssH+ZNCevHad65tc8vQlCQpOLaUjopvkRQKm2Cki2aME7fEOPRy3bA==" + "version": "6.7.8", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.8.tgz", + "integrity": "sha512-2zaTFGqZixVmTxpJRCFC+Vk5eGRd/fYtvIR+dl5u9QXLTQWGIf48x/JXvo58g9sa0bU6To04XUv554Paykum3g==" }, "noms": { "version": "0.0.0", @@ -23559,9 +23490,9 @@ } }, "openid-client": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.1.8.tgz", - "integrity": "sha512-EPxJY6bT7YIYQEXSGxRC5flQ3GUhLy98ufdto6+BVBrFGPmwjUpy4xBcYuU/Wt9nPkO/3EgljBrr6Ezx4lp1RQ==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.1.9.tgz", + "integrity": "sha512-o/11Xos2fRPpK1zQrPfSIhIusFrAkqGSPwkD0UlUB+CCuRzd7zrrBJwIjgnVv3VUSif9ZGXh2d3GSJNH2Koh5g==", "requires": { "jose": "^4.1.4", "lru-cache": "^6.0.0", @@ -24072,7 +24003,7 @@ "pop-iterate": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", - "integrity": "sha512-HRCx4+KJE30JhX84wBN4+vja9bNfysxg1y28l0DuJmkoaICiv2ZSilKddbS48pq50P8d2erAhqDLbp47yv3MbQ==" + "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=" }, "posix-character-classes": { "version": "0.1.1", @@ -25014,7 +24945,7 @@ "q": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", - "integrity": "sha512-gv6vLGcmAOg96/fgo3d9tvA4dJNZL3fMyBqVRrGxQ+Q/o4k9QzbJ3NQF9cOO/71wRodoXhaPgphvMFU68qVAJQ==", + "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=", "requires": { "asap": "^2.0.0", "pop-iterate": "^1.0.1", @@ -25027,12 +24958,6 @@ "integrity": "sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM=", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -25447,7 +25372,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } } @@ -25559,6 +25484,12 @@ "mime-types": "^2.1.12" } }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -25628,7 +25559,7 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "reselect": { "version": "4.0.0", @@ -25722,9 +25653,9 @@ "dev": true }, "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, "requires": { "lowercase-keys": "^2.0.0" @@ -25796,7 +25727,7 @@ "rootpath": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/rootpath/-/rootpath-0.1.2.tgz", - "integrity": "sha512-R3wLbuAYejpxQjL/SjXo1Cjv4wcJECnMRT/FlcCfTwCBhaji9rWaRCoVEQ1SPiTJ4kKK+yh+bZLAV7SCafoDDw==" + "integrity": "sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms=" }, "rsvp": { "version": "4.8.5", @@ -26028,7 +25959,7 @@ "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "saxes": { "version": "5.0.1", @@ -26716,7 +26647,7 @@ "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", "dev": true }, "spdx-correct": { @@ -26849,7 +26780,7 @@ "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, "stack-utils": { "version": "2.0.3", @@ -28795,6 +28726,14 @@ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, "tmp-promise": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", @@ -28955,9 +28894,9 @@ } }, "ts-essentials": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.2.0.tgz", - "integrity": "sha512-HLl+am6q+ulOWcjUFghpIQXXyaH0hVTnFTVWNqwz1iDxyN+t+lwDfqPB5FmPUTFw3J+y26UR3hNGmK/1jehokA==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.0.tgz", + "integrity": "sha512-XeiCboEyBG8UqXZtXl59bWEi4ZgOqRsogFDI6WDGIF1LmzbYiAkIwjkXN6zZWWl4re/lsOqMlYfe8KA0XiiEPw==" }, "ts-jest": { "version": "26.5.6", @@ -29201,9 +29140,9 @@ "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" }, "twilio": { - "version": "3.80.0", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.80.0.tgz", - "integrity": "sha512-ACzeSFqyMViOXDYBQr4CoPoscNWDbHt/gGqU2YpVyVQ/5fsFo/fe+ZAeZBKvrMllP81bhCtPS7H5Lfi9n2cOFw==", + "version": "3.81.0", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.81.0.tgz", + "integrity": "sha512-ipeYAhAxD0ql/1Jq0DfTm1SvU+kdGcS+JJEbfWuCOG5vyyiB6C4nlLGR/tdojZDwuP7Dxf4TZ+oFE+6FL8c3Aw==", "requires": { "axios": "^0.26.1", "dayjs": "^1.8.29", @@ -29261,9 +29200,9 @@ "dev": true }, "type-fest": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.18.0.tgz", - "integrity": "sha512-pRS+/yrW5TjPPHNOvxhbNZexr2bS63WjrMU8a+VzEBhUi9Tz1pZeD+vQz3ut0svZ46P+SRqMEPnJmk2XnvNzTw==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true }, "type-is": { @@ -29593,7 +29532,7 @@ "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -29702,7 +29641,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uue": { "version": "3.1.2", @@ -31137,7 +31076,7 @@ "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xmlchars": { "version": "2.2.0", diff --git a/package.json b/package.json index 1ee9b0409a..7c9402650c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "FormSG", "description": "Form Manager for Government", - "version": "5.67.0", + "version": "5.69.0", "homepage": "https://form.gov.sg", "authors": [ "FormSG " @@ -69,7 +69,7 @@ "@opengovsg/ng-file-upload": "^12.2.15", "@opengovsg/sgid-client": "1.0.3", "@opengovsg/spcp-auth-client": "^1.4.17", - "@sentry/browser": "^7.9.0", + "@sentry/browser": "^7.11.1", "@sentry/integrations": "^6.19.7", "@stablelib/base64": "^1.0.1", "JSONStream": "^1.3.5", @@ -88,7 +88,7 @@ "angular-ui-bootstrap": "~2.5.6", "angular-ui-router": "~1.0.30", "aws-info": "^1.2.0", - "aws-sdk": "^2.1191.0", + "aws-sdk": "^2.1195.0", "axios": "^0.27.2", "bcrypt": "^5.0.1", "bluebird": "^3.5.2", @@ -107,13 +107,13 @@ "css-toggle-switch": "^4.1.0", "csv-string": "^4.1.0", "cuid": "^2.1.8", - "date-fns": "^2.29.1", - "dd-trace": "^2.12.2", + "date-fns": "^2.29.2", + "dd-trace": "^3.0.0", "dedent-js": "~1.0.1", "dotenv": "^16.0.1", "ejs": "^3.1.8", "express": "^4.18.1", - "express-rate-limit": "^6.5.1", + "express-rate-limit": "^6.5.2", "express-request-id": "^1.4.1", "express-session": "^1.17.3", "express-winston": "^4.2.0", @@ -125,18 +125,18 @@ "hot-shots": "^9.2.0", "http-status-codes": "^2.2.0", "intl-tel-input": "~12.4.0", - "jose": "^4.8.1", + "jose": "^4.9.0", "json-stringify-safe": "^5.0.1", "jsonwebtoken": "^8.5.1", "jszip": "^3.10.1", "jwk-to-pem": "^2.0.5", "jwt-decode": "^3.1.2", - "libphonenumber-js": "^1.10.11", + "libphonenumber-js": "^1.10.13", "lodash": "^4.17.21", - "moment-timezone": "0.5.34", + "moment-timezone": "0.5.37", "mongodb-memory-server-core": "^6.9.6", "mongodb-uri": "^0.9.7", - "mongoose": "^5.13.14", + "mongoose": "^5.13.15", "multiparty": ">=4.2.3", "nan": "^2.15.0", "neverthrow": "^5.0.0", @@ -145,8 +145,8 @@ "ngclipboard": "^2.0.0", "nocache": "^3.0.4", "node-cache": "^5.1.2", - "nodemailer": "^6.7.7", - "openid-client": "^5.1.8", + "nodemailer": "^6.7.8", + "openid-client": "^5.1.9", "opossum": "^6.4.0", "p-queue": "^6.6.2", "promise-retry": "^2.0.1", @@ -164,7 +164,7 @@ "triple-beam": "^1.3.0", "ts-essentials": "^9.2.0", "tweetnacl": "^1.0.1", - "twilio": "^3.80.0", + "twilio": "^3.81.0", "ui-select": "^0.19.8", "uid-generator": "^2.0.0", "ulid": "^2.3.0", @@ -201,7 +201,7 @@ "@types/jsonfile": "^6.1.0", "@types/jsonwebtoken": "^8.5.8", "@types/jwk-to-pem": "^2.0.1", - "@types/lodash": "^4.14.182", + "@types/lodash": "^4.14.184", "@types/mongodb": "^3.6.20", "@types/mongodb-uri": "^0.9.1", "@types/node": "^14.18.23", @@ -216,7 +216,7 @@ "@types/triple-beam": "^1.3.2", "@types/uid-generator": "^2.0.3", "@types/uuid": "^8.3.4", - "@types/validator": "^13.7.5", + "@types/validator": "^13.7.6", "@typescript-eslint/eslint-plugin": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", "auto-changelog": "^2.4.0", @@ -225,7 +225,7 @@ "concurrently": "^7.3.0", "copy-webpack-plugin": "^6.0.2", "copyfiles": "^2.4.1", - "core-js": "^3.24.1", + "core-js": "^3.25.0", "coveralls": "^3.1.1", "css-loader": "^2.1.1", "csv-parse": "^5.3.0", @@ -234,7 +234,7 @@ "eslint-config-prettier": "^8.5.0", "eslint-plugin-angular": "^4.1.0", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "^26.8.2", + "eslint-plugin-jest": "^26.8.7", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-simple-import-sort": "^7.0.0", "eslint-plugin-typesafe": "^0.5.2", @@ -246,13 +246,13 @@ "husky": "^8.0.1", "jest": "^26.6.3", "jest-extended": "^1.2.1", - "jest-localstorage-mock": "^2.4.21", + "jest-localstorage-mock": "^2.4.22", "jest-mock-axios": "^4.6.1", "lint-staged": "^13.0.3", "maildev": "^2.0.5", "mini-css-extract-plugin": "^0.5.0", "mockdate": "^3.0.5", - "ngrok": "^4.3.1", + "ngrok": "^4.3.3", "optimize-css-assets-webpack-plugin": "^5.0.8", "prettier": "^2.7.1", "proxyquire": "^2.1.3", @@ -266,11 +266,12 @@ "supertest-session": "^4.1.0", "terser-webpack-plugin": "^1.2.3", "testcafe": "=1.15.1", + "ts-essentials": "^9.3.0", "ts-jest": "^26.5.6", "ts-loader": "^7.0.5", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", - "type-fest": "^2.18.0", + "type-fest": "^2.19.0", "typescript": "^4.6.4", "url-loader": "^1.1.2", "webpack": "^4.46.0", diff --git a/shared/package-lock.json b/shared/package-lock.json index 722bd0d5bd..7324673c26 100644 --- a/shared/package-lock.json +++ b/shared/package-lock.json @@ -139,9 +139,9 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "date-fns": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.1.tgz", - "integrity": "sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw==" + "version": "2.29.2", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.2.tgz", + "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==" }, "debug": { "version": "4.3.2", @@ -349,9 +349,9 @@ } }, "libphonenumber-js": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.11.tgz", - "integrity": "sha512-ehoihx4HpRXO6FH/uJ0EnaEV4dVU+FDny+jv0S6k9JPyPsAIr0eXDAFvGRMBKE1daCtyHAaFSKCiuCxrOjVAzQ==" + "version": "1.10.13", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.13.tgz", + "integrity": "sha512-b74iyWmwb4GprAUPjPkJ11GTC7KX4Pd3onpJfKxYyY8y9Rbb4ERY47LvCMEDM09WD3thiLDMXtkfDK/AX+zT7Q==" }, "lie": { "version": "3.3.0", @@ -527,9 +527,9 @@ } }, "type-fest": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.18.0.tgz", - "integrity": "sha512-pRS+/yrW5TjPPHNOvxhbNZexr2bS63WjrMU8a+VzEBhUi9Tz1pZeD+vQz3ut0svZ46P+SRqMEPnJmk2XnvNzTw==" + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" }, "util-deprecate": { "version": "1.0.2", diff --git a/src/app/modules/form/public-form/public-form.controller.ts b/src/app/modules/form/public-form/public-form.controller.ts index 2d9f2868d9..f9c29fb041 100644 --- a/src/app/modules/form/public-form/public-form.controller.ts +++ b/src/app/modules/form/public-form/public-form.controller.ts @@ -494,6 +494,13 @@ export const _handleFormAuthRedirect: ControllerHandler< } }) .map((redirectURL) => { + logger.info({ + message: 'Redirecting user to login page', + meta: { + redirectURL, + ...logMeta, + }, + }) return res.status(StatusCodes.OK).json({ redirectURL }) }) .mapErr((error) => { diff --git a/src/app/modules/submission/email-submission/__tests__/email-submission.routes.spec.ts b/src/app/modules/submission/email-submission/__tests__/email-submission.routes.spec.ts index 404f342416..a069b2df2b 100644 --- a/src/app/modules/submission/email-submission/__tests__/email-submission.routes.spec.ts +++ b/src/app/modules/submission/email-submission/__tests__/email-submission.routes.spec.ts @@ -2,22 +2,29 @@ import MyInfoClient, { IMyInfoConfig } from '@opengovsg/myinfo-gov-client' import SPCPAuthClient from '@opengovsg/spcp-auth-client' import { omit } from 'lodash' import mongoose from 'mongoose' +import { err, ok } from 'neverthrow' import session, { Session } from 'supertest-session' import { mocked } from 'ts-jest/utils' -import { - MOCK_COOKIE_AGE, - MOCK_UINFIN, -} from 'src/app/modules/myinfo/__tests__/myinfo.test.constants' -import { MyInfoCookieState } from 'src/app/modules/myinfo/myinfo.types' -import getMyInfoHashModel from 'src/app/modules/myinfo/myinfo_hash.model' import { FormFieldSchema } from 'src/types' import { setupApp } from 'tests/integration/helpers/express-setup' import dbHandler from 'tests/unit/backend/helpers/jest-db' import { FormAuthType, FormStatus } from '../../../../../../shared/types' +import { + MOCK_COOKIE_AGE, + MOCK_UINFIN, +} from '../../../myinfo/__tests__/myinfo.test.constants' import { MYINFO_COOKIE_NAME } from '../../../myinfo/myinfo.constants' +import { MyInfoCookieState } from '../../../myinfo/myinfo.types' +import getMyInfoHashModel from '../../../myinfo/myinfo_hash.model' +import { SGID_COOKIE_NAME } from '../../../sgid/sgid.constants' +import { + SgidInvalidJwtError, + SgidMissingJwtError, +} from '../../../sgid/sgid.errors' +import { SgidService } from '../../../sgid/sgid.service' import { SpOidcClient } from '../../../spcp/sp.oidc.client' // Import last so mocks are imported correctly // eslint-disable-next-line import/first @@ -43,6 +50,9 @@ jest.mock('@opengovsg/spcp-auth-client') const MockAuthClient = mocked(SPCPAuthClient, true) jest.mock('../../../spcp/sp.oidc.client') +jest.mock('../../../sgid/sgid.service') + +const MockSgidService = mocked(SgidService, true) jest.mock('nodemailer', () => ({ createTransport: jest.fn().mockReturnValue({ @@ -429,7 +439,7 @@ describe('email-submission.routes', () => { }) }) - describe('SP, CP and MyInfo authentication', () => { + describe('SP, CP, SGID and MyInfo authentication', () => { describe('SingPass', () => { it('should return 200 when submission is valid', async () => { jest.spyOn(SpOidcClient.prototype, 'verifyJwt').mockResolvedValueOnce({ @@ -727,7 +737,7 @@ describe('email-submission.routes', () => { describe('CorpPass', () => { it('should return 200 when submission is valid', async () => { mockCpClient.verifyJWT.mockImplementationOnce((_jwt, cb) => - cb(null, { + cb?.(null, { userName: 'S1234567A', userInfo: 'MyCorpPassUEN', }), @@ -806,7 +816,9 @@ describe('email-submission.routes', () => { it('should return 401 when submission has invalid JWT', async () => { // Mock auth client to return error when decoding JWT mockCpClient.verifyJWT.mockImplementationOnce((_jwt, cb) => - cb(new Error()), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + cb?.(new Error()), ) const { form } = await dbHandler.insertEmailForm({ formOptions: { @@ -834,7 +846,7 @@ describe('email-submission.routes', () => { it('should return 401 when submission has JWT with the wrong shape', async () => { // Mock auth client to return wrong decoded JWT shape mockCpClient.verifyJWT.mockImplementationOnce((_jwt, cb) => - cb(null, { + cb?.(null, { wrongKey: 'S1234567A', }), ) @@ -861,5 +873,152 @@ describe('email-submission.routes', () => { }) }) }) + + describe('SGID', () => { + it('should return 200 when submission is valid', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + ok({ + userName: 'S1234567A', + }), + ) + const { form } = await dbHandler.insertEmailForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .field('body', JSON.stringify(MOCK_NO_RESPONSES_BODY)) + .query({ captchaResponse: 'null' }) + .set('Cookie', [`${SGID_COOKIE_NAME}=mockJwt`]) + + expect(response.status).toBe(200) + expect(response.body).toEqual({ + message: 'Form submission successful.', + submissionId: expect.any(String), + }) + }) + + it('should return 401 when submission does not have JWT', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + err(new SgidMissingJwtError()), + ) + const { form } = await dbHandler.insertEmailForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .field('body', JSON.stringify(MOCK_NO_RESPONSES_BODY)) + .query({ captchaResponse: 'null' }) + // Note cookie is not set + + expect(response.status).toBe(401) + expect(response.body).toEqual({ + message: + 'Something went wrong with your login. Please try logging in and submitting again.', + spcpSubmissionFailure: true, + }) + // Should be undefined, since there was no SGID cookie + expect(MockSgidService.extractSgidJwtPayload).toHaveBeenLastCalledWith( + undefined, + ) + }) + + it('should return 401 when submission has the wrong JWT type', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + err(new SgidMissingJwtError()), + ) + const { form } = await dbHandler.insertEmailForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .field('body', JSON.stringify(MOCK_NO_RESPONSES_BODY)) + .query({ captchaResponse: 'null' }) + // Note cookie is for SingPass, not SGID + .set('Cookie', ['jwtSp=mockJwt']) + + expect(response.status).toBe(401) + expect(response.body).toEqual({ + message: + 'Something went wrong with your login. Please try logging in and submitting again.', + spcpSubmissionFailure: true, + }) + // Should be undefined, since there was no SGID cookie + expect(MockSgidService.extractSgidJwtPayload).toHaveBeenLastCalledWith( + undefined, + ) + }) + + it('should return 401 when submission has invalid JWT', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + err(new SgidInvalidJwtError()), + ) + const { form } = await dbHandler.insertEmailForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .field('body', JSON.stringify(MOCK_NO_RESPONSES_BODY)) + .query({ captchaResponse: 'null' }) + .set('Cookie', [`${SGID_COOKIE_NAME}=mockJwt`]) + + expect(response.status).toBe(401) + expect(response.body).toEqual({ + message: + 'Something went wrong with your login. Please try logging in and submitting again.', + spcpSubmissionFailure: true, + }) + }) + + it('should return 401 when submission has JWT with the wrong shape', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + err(new SgidInvalidJwtError()), + ) + const { form } = await dbHandler.insertEmailForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .field('body', JSON.stringify(MOCK_NO_RESPONSES_BODY)) + .query({ captchaResponse: 'null' }) + .set('Cookie', [`${SGID_COOKIE_NAME}=mockJwt`]) + + expect(response.status).toBe(401) + expect(response.body).toEqual({ + message: + 'Something went wrong with your login. Please try logging in and submitting again.', + spcpSubmissionFailure: true, + }) + }) + }) }) }) diff --git a/src/app/modules/submission/email-submission/email-submission.util.ts b/src/app/modules/submission/email-submission/email-submission.util.ts index 66cea3fc1e..2cf049c016 100644 --- a/src/app/modules/submission/email-submission/email-submission.util.ts +++ b/src/app/modules/submission/email-submission/email-submission.util.ts @@ -51,6 +51,11 @@ import { MyInfoMissingAccessTokenError, MyInfoMissingHashError, } from '../../myinfo/myinfo.errors' +import { + SgidInvalidJwtError, + SgidMissingJwtError, + SgidVerifyJwtError, +} from '../../sgid/sgid.errors' import { InvalidJwtError, MissingJwtError, @@ -420,6 +425,9 @@ export const mapRouteError: MapRouteError = (error) => { statusCode: StatusCodes.BAD_REQUEST, errorMessage: 'Captcha was missing. Please refresh and submit again.', } + case SgidMissingJwtError: + case SgidVerifyJwtError: + case SgidInvalidJwtError: case MissingJwtError: case VerifyJwtError: case InvalidJwtError: diff --git a/src/app/modules/submission/encrypt-submission/__tests__/encrypt-submission.routes.spec.ts b/src/app/modules/submission/encrypt-submission/__tests__/encrypt-submission.routes.spec.ts index 0a3e9bf6aa..2b3e31df3f 100644 --- a/src/app/modules/submission/encrypt-submission/__tests__/encrypt-submission.routes.spec.ts +++ b/src/app/modules/submission/encrypt-submission/__tests__/encrypt-submission.routes.spec.ts @@ -1,4 +1,5 @@ import SPCPAuthClient from '@opengovsg/spcp-auth-client' +import { err, ok } from 'neverthrow' import session, { Session } from 'supertest-session' import { mocked } from 'ts-jest/utils' @@ -6,13 +7,21 @@ import { setupApp } from 'tests/integration/helpers/express-setup' import dbHandler from 'tests/unit/backend/helpers/jest-db' import { FormAuthType, FormStatus } from '../../../../../../shared/types' +import { SGID_COOKIE_NAME } from '../../../sgid/sgid.constants' +import { + SgidInvalidJwtError, + SgidMissingJwtError, +} from '../../../sgid/sgid.errors' +import { SgidService } from '../../../sgid/sgid.service' import { SpOidcClient } from '../../../spcp/sp.oidc.client' import { EncryptSubmissionRouter } from '../encrypt-submission.routes' jest.mock('../../../spcp/sp.oidc.client') +jest.mock('../../../sgid/sgid.service') jest.mock('@opengovsg/spcp-auth-client') const MockAuthClient = mocked(SPCPAuthClient, true) +const MockSgidService = mocked(SgidService, true) const SUBMISSIONS_ENDPT_BASE = '/v2/submissions/encrypt' @@ -185,7 +194,7 @@ describe('encrypt-submission.routes', () => { describe('CorpPass', () => { it('should return 200 when submission is valid', async () => { mockCpClient.verifyJWT.mockImplementationOnce((_jwt, cb) => - cb(null, { + cb?.(null, { userName: 'S1234567A', userInfo: 'MyCorpPassUEN', }), @@ -264,7 +273,9 @@ describe('encrypt-submission.routes', () => { it('should return 401 when submission has invalid JWT', async () => { // Mock auth client to return error when decoding JWT mockCpClient.verifyJWT.mockImplementationOnce((_jwt, cb) => - cb(new Error()), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + cb?.(new Error()), ) const { form } = await dbHandler.insertEncryptForm({ formOptions: { @@ -292,7 +303,7 @@ describe('encrypt-submission.routes', () => { it('should return 401 when submission has JWT with the wrong shape', async () => { // Mock auth client to return wrong decoded JWT shape mockCpClient.verifyJWT.mockImplementationOnce((_jwt, cb) => - cb(null, { + cb?.(null, { wrongKey: 'S1234567A', }), ) @@ -319,5 +330,156 @@ describe('encrypt-submission.routes', () => { }) }) }) + + describe('SGID', () => { + beforeEach(() => { + // Reset mocks + jest.resetAllMocks() + }) + it('should return 200 when submission is valid', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + ok({ + userName: 'S1234567A', + }), + ) + const { form } = await dbHandler.insertEncryptForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .send(MOCK_SUBMISSION_BODY) + .query({ captchaResponse: 'null' }) + .set('Cookie', [`${SGID_COOKIE_NAME}=mockJwt`]) + + expect(response.status).toBe(200) + expect(response.body).toEqual({ + message: 'Form submission successful.', + submissionId: expect.any(String), + }) + }) + + it('should return 401 when submission does not have JWT', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + err(new SgidMissingJwtError()), + ) + const { form } = await dbHandler.insertEncryptForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .send(MOCK_SUBMISSION_BODY) + .query({ captchaResponse: 'null' }) + // Note cookie is not set + + expect(response.status).toBe(401) + expect(response.body).toEqual({ + message: + 'Something went wrong with your login. Please try logging in and submitting again.', + spcpSubmissionFailure: true, + }) + // Should be undefined, since there was no SGID cookie + expect(MockSgidService.extractSgidJwtPayload).toHaveBeenLastCalledWith( + undefined, + ) + }) + + it('should return 401 when submission has the wrong JWT type', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + err(new SgidMissingJwtError()), + ) + const { form } = await dbHandler.insertEncryptForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .send(MOCK_SUBMISSION_BODY) + .query({ captchaResponse: 'null' }) + // Note cookie is for SingPass, not SGID + .set('Cookie', ['jwtSp=mockJwt']) + + expect(response.status).toBe(401) + expect(response.body).toEqual({ + message: + 'Something went wrong with your login. Please try logging in and submitting again.', + spcpSubmissionFailure: true, + }) + // Should be undefined, since there was no SGID cookie + expect(MockSgidService.extractSgidJwtPayload).toHaveBeenLastCalledWith( + undefined, + ) + }) + + it('should return 401 when submission has invalid JWT', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + err(new SgidInvalidJwtError()), + ) + const { form } = await dbHandler.insertEncryptForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .send(MOCK_SUBMISSION_BODY) + .query({ captchaResponse: 'null' }) + .set('Cookie', [`${SGID_COOKIE_NAME}=mockJwt`]) + + expect(response.status).toBe(401) + expect(response.body).toEqual({ + message: + 'Something went wrong with your login. Please try logging in and submitting again.', + spcpSubmissionFailure: true, + }) + }) + + it('should return 401 when submission has JWT with the wrong shape', async () => { + MockSgidService.extractSgidJwtPayload.mockReturnValueOnce( + err(new SgidInvalidJwtError()), + ) + const { form } = await dbHandler.insertEncryptForm({ + formOptions: { + esrvcId: 'mockEsrvcId', + authType: FormAuthType.SGID, + hasCaptcha: false, + status: FormStatus.Public, + }, + }) + + const response = await request + .post(`${SUBMISSIONS_ENDPT_BASE}/${form._id}`) + .send(MOCK_SUBMISSION_BODY) + .query({ captchaResponse: 'null' }) + .set('Cookie', [`${SGID_COOKIE_NAME}=mockJwt`]) + + expect(response.status).toBe(401) + expect(response.body).toEqual({ + message: + 'Something went wrong with your login. Please try logging in and submitting again.', + spcpSubmissionFailure: true, + }) + }) + }) }) }) diff --git a/src/app/modules/submission/encrypt-submission/encrypt-submission.controller.ts b/src/app/modules/submission/encrypt-submission/encrypt-submission.controller.ts index 572ff4c19c..cf40b96308 100644 --- a/src/app/modules/submission/encrypt-submission/encrypt-submission.controller.ts +++ b/src/app/modules/submission/encrypt-submission/encrypt-submission.controller.ts @@ -247,7 +247,7 @@ const submitEncryptModeForm: ControllerHandler< break } case FormAuthType.SGID: { - const jwtPayloadResult = await SgidService.extractSgidJwtPayload( + const jwtPayloadResult = SgidService.extractSgidJwtPayload( req.cookies.jwtSgid, ) if (jwtPayloadResult.isErr()) { diff --git a/src/app/modules/submission/encrypt-submission/encrypt-submission.utils.ts b/src/app/modules/submission/encrypt-submission/encrypt-submission.utils.ts index bc0bfe902c..c94ad52303 100644 --- a/src/app/modules/submission/encrypt-submission/encrypt-submission.utils.ts +++ b/src/app/modules/submission/encrypt-submission/encrypt-submission.utils.ts @@ -28,6 +28,11 @@ import { FormNotFoundError, PrivateFormError, } from '../../form/form.errors' +import { + SgidInvalidJwtError, + SgidMissingJwtError, + SgidVerifyJwtError, +} from '../../sgid/sgid.errors' import { CreateRedirectUrlError, FetchLoginPageError, @@ -79,6 +84,9 @@ const errorMapper: MapRouteError = ( statusCode: StatusCodes.BAD_GATEWAY, errorMessage: 'Error while contacting SingPass. Please try again.', } + case SgidMissingJwtError: + case SgidVerifyJwtError: + case SgidInvalidJwtError: case MissingJwtError: case VerifyJwtError: case InvalidJwtError: