diff --git a/backend/package-lock.json b/backend/package-lock.json index 4d4b9fd23..302ade10b 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -49,7 +49,6 @@ "posthog-node": "^2.6.0", "query-string": "^7.1.3", "rate-limit-mongo": "^2.3.2", - "request-ip": "^3.3.0", "rimraf": "^3.0.2", "stripe": "^10.7.0", "swagger-autogen": "^2.22.0", @@ -105,6 +104,21 @@ "node": ">=6.0.0" } }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", @@ -182,11 +196,11 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.341.0.tgz", - "integrity": "sha512-D27hLlUPJTM4rNtMBPduD1vdPSmbUs0Eat8DZWCv3bg+v60loairha87oYL5x6Kj4IhbK93shI1OfzbxDqG1Yw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.347.0.tgz", + "integrity": "sha512-P/2qE6ntYEmYG4Ez535nJWZbXqgbkJx8CMz7ChEuEg3Gp3dvVYEKg+iEUEvlqQ2U5dWP5J3ehw5po9t86IsVPQ==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -194,43 +208,43 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.341.0.tgz", - "integrity": "sha512-lE/2gwxijDSxtspzgiByzCqqmtkYzU1AEO5mb9pMfyZE9Bce+bnzcIm0ib4qD6JHnAaYQmHIt1AF3zkIx6dmHA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.347.0.tgz", + "integrity": "sha512-Z92GT2SC1y1r0bl3XI6ZH6QMsL2AaG3IR6ORXeiA94OY9/eF/tQT0zDbwn/MZUwJuBnR0CfO8bq7IQgCAguQ4A==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.341.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/credential-provider-node": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-signing": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/client-sts": "3.347.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -241,42 +255,42 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.341.0.tgz", - "integrity": "sha512-zGjDMfBVRDj0MDd9uBG6QnQ4oGYn3Oe6bjeoatJfDT9wjbat/89HpEDrztn0d6CBmvui9Y9jq0NYCiFLrN4nCA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.347.0.tgz", + "integrity": "sha512-lqBBJobdpVGx5OJpI3P52SaOilPkVW9zKVwPndoou8hpPYMMUVbVZ/Q0rSmjXC7wi9VzMB4SlENDM519Hu/tdQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.341.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/credential-provider-node": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-signing": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/client-sts": "3.347.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -288,39 +302,39 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.341.0.tgz", - "integrity": "sha512-RWFKz3DBgEy92mce3TTgcq/UOKr/LKNyC189M8UXhWRyyoaQpE9gIyHUQwuh7a2bbnI7XKgpa2rO54Ns0rFJzw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.347.0.tgz", + "integrity": "sha512-AZehWCNLUXTrDavsZYRi7d84Uef20ppYJ2FY0KxqrKB3lx89mO29SfSJSC4woeW5+6ooBokq8HtKxw5ImPfRhA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -331,39 +345,39 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.341.0.tgz", - "integrity": "sha512-BjG4E7E1StsHCM0Mex7EZA6oPMQ+PLZY5axr554ErYxlzYlzE8b/Aq3N/mCCqeUSIdz4zAGr8di7XYCUB3CRdg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.347.0.tgz", + "integrity": "sha512-IBxRfPqb8f9FqpmDbzcRDfoiasj/Y47C4Gj+j3kA5T1XWyGwbDI9QnPW/rnkZTWxLUUG1LSbBNwbPD6TLoff8A==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -374,42 +388,42 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.341.0.tgz", - "integrity": "sha512-Ec8lzyPkd7N6VE4O73RuY04hgxMSXCD+uyWmYCoCCuamAx+xEP4ifVL0spApr8tttm51QLBgc01pVKNL62Oprw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.347.0.tgz", + "integrity": "sha512-QcJCUlzJZLAFTFSuELKd4BF5I5W38TR/m7NX2y1tn2la9JIrWSrz+tj598zfp2V4pJPzRJ1i8RglTZxSRIvsxQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/credential-provider-node": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-sdk-sts": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-signing": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-sdk-sts": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -421,13 +435,13 @@ } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.341.0.tgz", - "integrity": "sha512-BpU6JTvT2SJLrsKxe4hjDDVbFnLc5iRcD+dwF/uV4rltFlXPOhqrx1S4NtRLpRaT3oYwA3DnBGC5CkV6QHWW5Q==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.347.0.tgz", + "integrity": "sha512-2ja+Sf/VnUO7IQ3nKbDQ5aumYKKJUaTm/BuVJ29wNho8wYHfuf7wHZV0pDTkB8RF5SH7IpHap7zpZAj39Iq+EA==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-config-provider": "3.310.0", - "@aws-sdk/util-middleware": "3.341.0", + "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -435,14 +449,14 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.341.0.tgz", - "integrity": "sha512-yUmcM/NmWvHG25uMeC1A2aDO5yiitz0w5fzPgP6DkVV36xKWdYX99V6oE5UnLYKVXgUA0nciuYzv0A57ZqP/0g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.347.0.tgz", + "integrity": "sha512-7NiVVQC51HvomI44OyD+UekZ7qxauJeFGwQILbQ0beAxNuPZL7Ect/jB6A5MeleyqP+sVn8cB7qBMZjFJRhoJA==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/client-cognito-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -450,12 +464,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.341.0.tgz", - "integrity": "sha512-oqFMmGvtKjqcY6Io4CweHz0blgyyZtlfxWJbttPK7dSLk9EtRUuvVilcRtzXWXuAB2hk9zUN9wavd8nyaTcidA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.347.0.tgz", + "integrity": "sha512-UnEM+LKGpXKzw/1WvYEQsC6Wj9PupYZdQOE+e2Dgy2dqk/pVFy4WueRtFXYDT2B41ppv3drdXUuKZRIDVqIgNQ==", "dependencies": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -463,14 +477,14 @@ } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.341.0.tgz", - "integrity": "sha512-dkvc7WcKxFR0KgAScbRQ16wg0qH8tKxaVS3hfgHDYJR4UIKqV/sM6r5H2OvAdegY9/T180O2srtq2N4pyywPSQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.347.0.tgz", + "integrity": "sha512-7scCy/DCDRLIhlqTxff97LQWDnRwRXji3bxxMg+xWOTTaJe7PWx+etGSbBWaL42vsBHFShQjSLvJryEgoBktpw==", "dependencies": { - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -478,18 +492,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.341.0.tgz", - "integrity": "sha512-o+44n3VFErRNOHZi4Psbu0JQWB7RT15QJzRtYquAPohgKNDT9jQ/VN0JesEVyktpIklsPJBNAbDb68fExsjKUg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.347.0.tgz", + "integrity": "sha512-84TNF34ryabmVbILOq7f+/Jy8tJaskvHdax3X90qxFtXRU11kX0bf5NYL616KT0epR0VGpy50ThfIqvBwxeJfQ==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.341.0", - "@aws-sdk/credential-provider-imds": "3.341.0", - "@aws-sdk/credential-provider-process": "3.341.0", - "@aws-sdk/credential-provider-sso": "3.341.0", - "@aws-sdk/credential-provider-web-identity": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -497,19 +511,19 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.341.0.tgz", - "integrity": "sha512-O4gxP5PLu86361sGgnyxcwP5L2Ek7N65KM3MYJNgDpXRig+FP/pxBmdOtYkTYJYymPspGxnsNM6p2tbARJ1WMw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.347.0.tgz", + "integrity": "sha512-ds2uxE0krl94RdQ7bstwafUXdlMeEOPgedhaheVVlj8kH+XqlZdwUUaUv1uoEI9iBzuSjKftUkIHo0xsTiwtaw==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.341.0", - "@aws-sdk/credential-provider-imds": "3.341.0", - "@aws-sdk/credential-provider-ini": "3.341.0", - "@aws-sdk/credential-provider-process": "3.341.0", - "@aws-sdk/credential-provider-sso": "3.341.0", - "@aws-sdk/credential-provider-web-identity": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -517,13 +531,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.341.0.tgz", - "integrity": "sha512-t+12surwkdZO7dAdtA7xz+O6Hk0H3yOVqXH+Y8UINXbFc9/uUgstPZq5qhpQIeDPRes/lqYUiZ4tho5mhpGItw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.347.0.tgz", + "integrity": "sha512-yl1z4MsaBdXd4GQ2halIvYds23S67kElyOwz7g8kaQ4kHj+UoYWxz3JVW/DGusM6XmQ9/F67utBrUVA0uhQYyw==", "dependencies": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -531,15 +545,15 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.341.0.tgz", - "integrity": "sha512-ooOntFPVwawHO8WwwTSDFysno+nZFt1+GPlAr9N9QxIWQSRZYLaNFeplnxT/58jJoMcyHH5JjY4Zu4g46htmkw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.347.0.tgz", + "integrity": "sha512-M1d7EnUaJbSNCmNalEbINmtFkc9wJufx7UhKtEeFwSq9KEzOMroH1MEOeiqIw9f/zE8NI/iPkVeEhw123vmBrQ==", "dependencies": { - "@aws-sdk/client-sso": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/token-providers": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/client-sso": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/token-providers": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -547,12 +561,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.341.0.tgz", - "integrity": "sha512-NxoyxnxiycO1IG3FG7/soE3CYLLwuc4pv5PWoMHwy6VjH5yiUIeC8CQHHCF5ndCvB/p5XW1TT5z3YmWKknGqaw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.347.0.tgz", + "integrity": "sha512-DxoTlVK8lXjS1zVphtz/Ab+jkN/IZor9d6pP2GjJHNoAIIzXfRwwj5C8vr4eTayx/5VJ7GRP91J8GJ2cKly8Qw==", "dependencies": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -560,48 +574,59 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.341.0.tgz", - "integrity": "sha512-5AxouRjLA1Jq52JJHZPgpgA04p2R6T0LzIIRIVEyZjK2wB5sIRmv2isoih546tHerrFf01MboaGfJEBMdUWXjw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.347.0.tgz", + "integrity": "sha512-ny8tnuLToQIYbS+ztRh4/fViDDV1xk+WuapSK2T1MAIuPvhyD1IDulTyqv6P9ROoNIqt1NAoLctkWxdkLvqyQA==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.341.0", - "@aws-sdk/client-sso": "3.341.0", - "@aws-sdk/client-sts": "3.341.0", - "@aws-sdk/credential-provider-cognito-identity": "3.341.0", - "@aws-sdk/credential-provider-env": "3.341.0", - "@aws-sdk/credential-provider-imds": "3.341.0", - "@aws-sdk/credential-provider-ini": "3.341.0", - "@aws-sdk/credential-provider-node": "3.341.0", - "@aws-sdk/credential-provider-process": "3.341.0", - "@aws-sdk/credential-provider-sso": "3.341.0", - "@aws-sdk/credential-provider-web-identity": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/client-cognito-identity": "3.347.0", + "@aws-sdk/client-sso": "3.347.0", + "@aws-sdk/client-sts": "3.347.0", + "@aws-sdk/credential-provider-cognito-identity": "3.347.0", + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.341.0.tgz", - "integrity": "sha512-GclHYOFKmhft9Bp+wX4CgVv4q48P/md/xiKN7kJpGUvazCRhBN7DqfcvMoMCPhobh+llYSefyiqJBxEccEq/TA==", + "node_modules/@aws-sdk/eventstream-codec": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.347.0.tgz", + "integrity": "sha512-61q+SyspjsaQ4sdgjizMyRgVph2CiW4aAtfpoH69EJFJfTxTR/OqnZ9Jx/3YiYi0ksrvDenJddYodfWWJqD8/w==", "dependencies": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/querystring-builder": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-crypto/crc32": "3.0.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.347.0.tgz", + "integrity": "sha512-sQ5P7ivY8//7wdxfA76LT1sF6V2Tyyz1qF6xXf9sihPN5Q1Y65c+SKpMzXyFSPqWZ82+SQQuDliYZouVyS6kQQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/querystring-builder": "3.347.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/hash-node": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.341.0.tgz", - "integrity": "sha512-legGgjmhQnA8veIuVjJEVNE18YIhWj6JaLNm47xgiBbEoZ1BApoBY1GsX1AunV6FrA18fRpCeTynW3u4MVIIow==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.347.0.tgz", + "integrity": "sha512-96+ml/4EaUaVpzBdOLGOxdoXOjkPgkoJp/0i1fxOJEvl8wdAQSwc3IugVK9wZkCxy2DlENtgOe6DfIOhfffm/g==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-buffer-from": "3.310.0", "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" @@ -611,11 +636,11 @@ } }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.341.0.tgz", - "integrity": "sha512-1GNk+J/Q76bzuj27OqPOqTmFGEYXtyB02afn0cIeadDf0qbjo3G7qkRd3jrJrBIdHNg+DYbBYEHfFB5EuK1s8g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.347.0.tgz", + "integrity": "sha512-8imQcwLwqZ/wTJXZqzXT9pGLIksTRckhGLZaXT60tiBOPKuerTsus2L59UstLs5LP8TKaVZKFFSsjRIn9dQdmQ==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, @@ -631,12 +656,12 @@ } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.341.0.tgz", - "integrity": "sha512-m663QyL1qvMnXOsXUtLvQz5B5l1kulQMTOwVxxhefPxO0nZbIlXdMQurEOwI1FHfaMnR8UQ1FfPLY6GIkJkX/g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.347.0.tgz", + "integrity": "sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -644,14 +669,14 @@ } }, "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.341.0.tgz", - "integrity": "sha512-IucQO8JjAjxnA+7RI1tkxOjUtpuUpkS3v56u5vk6Oypq1iovVBvD8yiFBR2wPh9X/O+3Ts7eWsZ4jhuf4JQQUQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.347.0.tgz", + "integrity": "sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==", "dependencies": { - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", - "@aws-sdk/util-middleware": "3.341.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -659,12 +684,12 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.341.0.tgz", - "integrity": "sha512-1AidcDDtGd7LUGtDV+F+FuLb6NmBlpupY2FpuqasUDH5f7ExcEbPaGYjOp4ozktQ6Qb0c0oJ4qxhv5sDos5Qww==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", + "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", "dependencies": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -672,11 +697,11 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.341.0.tgz", - "integrity": "sha512-JQgnPQMlNs542SL/ANbQSWbPMeWeY4+GW/fEfSRgM9uVBZaKPO5dZW7F761odxoK7f3qPSujEZb0ECmTYaEqgg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", + "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -684,12 +709,12 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.341.0.tgz", - "integrity": "sha512-DAfZgW7Bb4MB4ZHsjAhiaCXKqTeUFWazrgmNHAa8FkSE8MmgJv/4k8tvnWDtxkAO2GBOwqg7wG9LspeBG/RGMw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", + "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -697,15 +722,15 @@ } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.341.0.tgz", - "integrity": "sha512-EyL2N4ohUQc4CdlccydPuybd4ngVx12MTSIGQVc0PcMZ39ayPbgYOZyCkAGb1rRCEIMayMrF9hF4GfNo4BvV5g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.347.0.tgz", + "integrity": "sha512-CpdM+8dCSbX96agy4FCzOfzDmhNnGBM/pxrgIVLm5nkYTLuXp/d7ubpFEUHULr+4hCd5wakHotMt7yO29NFaVw==", "dependencies": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/service-error-classification": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/util-middleware": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/service-error-classification": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -714,12 +739,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.341.0.tgz", - "integrity": "sha512-A7sXKhL9wzVqeq7sy3eWx7D5FPWdzrJTVpRRBYez/qBY4UjfLcxF9zpB0mw/xhQ7PUta7iJ5tSlPmZZQ4MBnmg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.347.0.tgz", + "integrity": "sha512-38LJ0bkIoVF3W97x6Jyyou72YV9Cfbml4OaDEdnrCOo0EssNZM5d7RhjMvQDwww7/3OBY/BzeOcZKfJlkYUXGw==", "dependencies": { - "@aws-sdk/middleware-signing": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -727,11 +752,11 @@ } }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.341.0.tgz", - "integrity": "sha512-FaPpbEGo/OETxnexg+TYet71fP6dM+y3NPXRUrd5dAulVhmr+CkdzOxqkqtMC1HinKAqHdUpjlsuf7gYg14deQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.347.0.tgz", + "integrity": "sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -739,15 +764,15 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.341.0.tgz", - "integrity": "sha512-KbyBIblgrGRizFJF3sLvx+ON84qOBHrDztNc++Xg2/UmdjLuEtm1sVvpQ2SxrKcfumx+ztVOuDpbD5pd0lBkOA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.347.0.tgz", + "integrity": "sha512-zVBF/4MGKnvhAE/J+oAL/VAehiyv+trs2dqSQXwHou9j8eA8Vm8HS2NdOwpkZQchIxTuwFlqSusDuPEdYFbvGw==", "dependencies": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/signature-v4": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/util-middleware": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/signature-v4": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -755,9 +780,9 @@ } }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.341.0.tgz", - "integrity": "sha512-pBAN9T4tBSHp7gJKu0Ma0MepZqP3GvecEh7eZWwTrJrRMgY1k8M1zpUOXBFG6EVRzVdyy7A4DWSuD4kcXE+BIw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.347.0.tgz", + "integrity": "sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==", "dependencies": { "tslib": "^2.5.0" }, @@ -766,13 +791,13 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.341.0.tgz", - "integrity": "sha512-9gpVXPMkgwv0yV1Lbuc9bvb3MHLEjj5whgbM1WNrtRiogeFwWB0cxOQQgb2cY+xgQLMLnH7VvfRGN79TNVnI7w==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.347.0.tgz", + "integrity": "sha512-wJbGN3OE1/daVCrwk49whhIr9E0j1N4gWwN/wi4WuyYIA+5lMUfVp0aGIOvZR+878DxuFz2hQ4XcZVT4K2WvQw==", "dependencies": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -780,13 +805,13 @@ } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.341.0.tgz", - "integrity": "sha512-Le/WSf9t0ItrHuGhOlEPiA+J/nYpYJaC1WgLefRG9j17xKF/fp7X+XSylF1xQ+cOMbHFMi7SNcXRhyfwFreU0w==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.347.0.tgz", + "integrity": "sha512-faU93d3+5uTTUcotGgMXF+sJVFjrKh+ufW+CzYKT4yUHammyaIab/IbTPWy2hIolcEGtuPeVoxXw8TXbkh/tuw==", "dependencies": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -794,14 +819,14 @@ } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.341.0.tgz", - "integrity": "sha512-pXkX1amhWhkgffs76bf+pR814JnBUa199Nb6Wm2l20LLPgSsQrRX0IwucM/KtAdEhFeJTR8bLhRJBzrm3ONMwQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.347.0.tgz", + "integrity": "sha512-eluPf3CeeEaPbETsPw7ee0Rb0FP79amu8vdLMrQmkrD+KP4owupUXOEI4drxWJgBSd+3PRowPWCDA8wUtraHKg==", "dependencies": { - "@aws-sdk/abort-controller": "3.341.0", - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/querystring-builder": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/abort-controller": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/querystring-builder": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -809,11 +834,11 @@ } }, "node_modules/@aws-sdk/property-provider": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.341.0.tgz", - "integrity": "sha512-5Ynks9iUS/VJcZa/J3c5G+XAaUw4SkWltQp4Y7dzWpJXS3AaUm9gby7DsWYopbH5dLeeSmvKENHTsKpsM5pQoQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.347.0.tgz", + "integrity": "sha512-t3nJ8CYPLKAF2v9nIHOHOlF0CviQbTvbFc2L4a+A+EVd/rM4PzL3+3n8ZJsr0h7f6uD04+b5YRFgKgnaqLXlEg==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -821,11 +846,11 @@ } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.341.0.tgz", - "integrity": "sha512-Av+qcOA+gYXWgYYtzbTn2goHGlNdt+nbrzhUI6dWczYPzBe8aNnMR5d/ACNt0mD7O41muULmSTQBHOKBmOmNJA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.347.0.tgz", + "integrity": "sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -833,11 +858,11 @@ } }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.341.0.tgz", - "integrity": "sha512-71RNU1VB8tSfqeu9t61YWDmMS/5C9NH8ua6LXb5HGzlnq68BSLq3lGa4zx/h2K0OpZ6ERUORFdw6pmqA17pDmg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.347.0.tgz", + "integrity": "sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-uri-escape": "3.310.0", "tslib": "^2.5.0" }, @@ -846,11 +871,11 @@ } }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.341.0.tgz", - "integrity": "sha512-7O61bRUdo2x73TTeyyriibLpx9tUPO13gBdI9oHpJTZEkOiUYxoxjMdo5s7ofis12MdmzelqIUjPmAvJNtB5wA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.347.0.tgz", + "integrity": "sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -858,19 +883,19 @@ } }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.341.0.tgz", - "integrity": "sha512-mqf9rV/j8Ry2RWDQsaJDPyDm/VDQ4ZDdmi8rzm/AeSgEDaNWublt31zlWtgUWfjISfTtbBgzI48n6ZBJqyYmUA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.347.0.tgz", + "integrity": "sha512-xZ3MqSY81Oy2gh5g0fCtooAbahqh9VhsF8vcKjVX8+XPbGC8y+kej82+MsMg4gYL8gRFB9u4hgYbNgIS6JTAvg==", "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.341.0.tgz", - "integrity": "sha512-/ikCc2XRL8zG//EB2g6SXFvMMa7KD2T8RpM4dYEisdvHDoF9khVX3/SLLUs2Y32rr1x9tnh7X9DdV8lX9MP/ZA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.347.0.tgz", + "integrity": "sha512-Xw+zAZQVLb+xMNHChXQ29tzzLqm3AEHsD8JJnlkeFjeMnWQtXdUfOARl5s8NzAppcKQNlVe2gPzjaKjoy2jz1Q==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -878,14 +903,15 @@ } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.341.0.tgz", - "integrity": "sha512-4nWgDiw68lEFBwrQY1JsKBvcMmcRhClpWzi3iKHwU1PJogId6g4XRU89Zo0QzBQihmFZIKklRSF/150pbNGdcg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.347.0.tgz", + "integrity": "sha512-58Uq1do+VsTHYkP11dTK+DF53fguoNNJL9rHRWhzP+OcYv3/mBMLoS2WPz/x9FO5mBg4ESFsug0I6mXbd36tjw==", "dependencies": { + "@aws-sdk/eventstream-codec": "3.347.0", "@aws-sdk/is-array-buffer": "3.310.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-hex-encoding": "3.310.0", - "@aws-sdk/util-middleware": "3.341.0", + "@aws-sdk/util-middleware": "3.347.0", "@aws-sdk/util-uri-escape": "3.310.0", "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" @@ -895,12 +921,12 @@ } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.341.0.tgz", - "integrity": "sha512-4ReKR+UciZ012W8OimFZfGy1LRZeWcl/i7h6lTIiXasni4Q+5k1rqneCRtJpBgfB5YbJg4EawmWxsxChrX9pwQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.347.0.tgz", + "integrity": "sha512-PaGTDsJLGK0sTjA6YdYQzILRlPRN3uVFyqeBUkfltXssvUzkm8z2t1lz2H4VyJLAhwnG5ZuZTNEV/2mcWrU7JQ==", "dependencies": { - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -908,14 +934,14 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.341.0.tgz", - "integrity": "sha512-PNskQMWVV6hUTPZmwcfAU0nknY0+Ge60ZVdNx6B4bpor6oEXl/jUCDOmymyHJl85LiIN7AZDrwq1gpdsDDVhZw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.347.0.tgz", + "integrity": "sha512-DZS9UWEy105zsaBJTgcvv1U+0jl7j1OzfMpnLf/lEYjEvx/4FqY2Ue/OZUACJorZgm/dWNqrhY17tZXtS/S3ew==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/client-sso-oidc": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -923,9 +949,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.341.0.tgz", - "integrity": "sha512-2KJf64BhJly/Ty35oWKlCElIqUP4kQ0LA+meSrgAmwl7oE0AYuO7V0ar1nsTGlsubYkLRvOuEhMcuNuumaUdoQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", "dependencies": { "tslib": "^2.5.0" }, @@ -934,12 +960,12 @@ } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.341.0.tgz", - "integrity": "sha512-pAT+4Yp3NkHKnLhYjbFj9DGKTRavBIVoe0fbQLm1G/MD11FAlUOlswf5EYFjgz0wfdgnbyFE3ai837/eO0fGjw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.347.0.tgz", + "integrity": "sha512-lhrnVjxdV7hl+yCnJfDZOaVLSqKjxN20MIOiijRiqaWGLGEAiSqBreMhL89X1WKCifxAs4zZf9YB9SbdziRpAA==", "dependencies": { - "@aws-sdk/querystring-parser": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/querystring-parser": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, @@ -998,12 +1024,12 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.341.0.tgz", - "integrity": "sha512-FjZg0T/7lcEgeMTdC8iMaNcHlHwqVzS0FlyUdJrMZqXEo70h3KlByijv8N9VlV8XQUfiCPuTNlhpLpDEDMdtbw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.347.0.tgz", + "integrity": "sha512-+JHFA4reWnW/nMWwrLKqL2Lm/biw/Dzi/Ix54DAkRZ08C462jMKVnUlzAI+TfxQE3YLm99EIa0G7jiEA+p81Qw==", "dependencies": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1012,15 +1038,15 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.341.0.tgz", - "integrity": "sha512-I943vmtUHqOdHvWCCnO3Vv/XXKCZ4O3XPNl9jvIC8m0n6CXqf7qjs9R72t3PQCTBAbsbIRGfkKMKfH2ab5ci/g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.347.0.tgz", + "integrity": "sha512-A8BzIVhAAZE5WEukoAN2kYebzTc99ZgncbwOmgCCbvdaYlk5tzguR/s+uoT4G0JgQGol/4hAMuJEl7elNgU6RQ==", "dependencies": { - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/credential-provider-imds": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -1028,11 +1054,11 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.341.0.tgz", - "integrity": "sha512-J15adxRV+YwWasOcCHDZoxXXQS7l8yBgWbId2ozGond/GwHifKhElF0RX9QKB4R/Vq1Cj7WVTyQsugYJAlLWrw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.347.0.tgz", + "integrity": "sha512-/WUkirizeNAqwVj0zkcrqdQ9pUm1HY5kU+qy7xTR0OebkuJauglkmSTMD+56L1JPunWqHhlwCMVRaz5eaJdSEQ==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -1062,9 +1088,9 @@ } }, "node_modules/@aws-sdk/util-middleware": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.341.0.tgz", - "integrity": "sha512-JsuZGZw9pMYMHzaJW31Y3Zl1Dh/R2PNVxnlQPsPy37RhHoSLPZ6wR9G828Y1ZY2thBpR+DU3D/VfNJOxBmWGkw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.347.0.tgz", + "integrity": "sha512-8owqUA3ePufeYTUvlzdJ7Z0miLorTwx+rNol5lourGQZ9JXsVMo23+yGA7nOlFuXSGkoKpMOtn6S0BT2bcfeiw==", "dependencies": { "tslib": "^2.5.0" }, @@ -1073,11 +1099,11 @@ } }, "node_modules/@aws-sdk/util-retry": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.341.0.tgz", - "integrity": "sha512-UxAZiajjj65Zi9Q8PJ53vGydsa6dv9ZJC+bfO70czGGTWjB+L7kb2UoRdtGo9NBzRTFYXV6OjP6yBw5yFb39kw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.347.0.tgz", + "integrity": "sha512-NxnQA0/FHFxriQAeEgBonA43Q9/VPFQa8cfJDuT2A1YZruMasgjcltoZszi1dvoIRWSZsFTW42eY2gdOd0nffQ==", "dependencies": { - "@aws-sdk/service-error-classification": "3.341.0", + "@aws-sdk/service-error-classification": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -1096,22 +1122,22 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.341.0.tgz", - "integrity": "sha512-VCgWM03lbcfjBQFhJJcF7Gs+XKxdtSYuK5txFiXy/glin5eCY+9VB3vqMrYwvEgIlwZynUYXvh9+OkU2AeRaBg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", + "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", "dependencies": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.341.0.tgz", - "integrity": "sha512-ac1VcSQOn4fhif51hoSZtrfkFGZHNqXXv2mWzNo1xgsyDwCJh2/H6fPBBGtjT3TNc/o5yOuyBFRP4BIjJ5GkPA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.347.0.tgz", + "integrity": "sha512-6X0b9qGsbD1s80PmbaB6v1/ZtLfSx6fjRX8caM7NN0y/ObuLoX8LhYnW6WlB2f1+xb4EjaCNgpP/zCf98MXosw==", "dependencies": { - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { @@ -10932,11 +10958,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, - "node_modules/request-ip": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", - "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==" - }, "node_modules/require-at": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", @@ -12440,6 +12461,23 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, + "@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, "@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", @@ -12527,52 +12565,52 @@ } }, "@aws-sdk/abort-controller": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.341.0.tgz", - "integrity": "sha512-D27hLlUPJTM4rNtMBPduD1vdPSmbUs0Eat8DZWCv3bg+v60loairha87oYL5x6Kj4IhbK93shI1OfzbxDqG1Yw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.347.0.tgz", + "integrity": "sha512-P/2qE6ntYEmYG4Ez535nJWZbXqgbkJx8CMz7ChEuEg3Gp3dvVYEKg+iEUEvlqQ2U5dWP5J3ehw5po9t86IsVPQ==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/client-cognito-identity": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.341.0.tgz", - "integrity": "sha512-lE/2gwxijDSxtspzgiByzCqqmtkYzU1AEO5mb9pMfyZE9Bce+bnzcIm0ib4qD6JHnAaYQmHIt1AF3zkIx6dmHA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.347.0.tgz", + "integrity": "sha512-Z92GT2SC1y1r0bl3XI6ZH6QMsL2AaG3IR6ORXeiA94OY9/eF/tQT0zDbwn/MZUwJuBnR0CfO8bq7IQgCAguQ4A==", "optional": true, "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.341.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/credential-provider-node": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-signing": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/client-sts": "3.347.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -12580,42 +12618,42 @@ } }, "@aws-sdk/client-secrets-manager": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.341.0.tgz", - "integrity": "sha512-zGjDMfBVRDj0MDd9uBG6QnQ4oGYn3Oe6bjeoatJfDT9wjbat/89HpEDrztn0d6CBmvui9Y9jq0NYCiFLrN4nCA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.347.0.tgz", + "integrity": "sha512-lqBBJobdpVGx5OJpI3P52SaOilPkVW9zKVwPndoou8hpPYMMUVbVZ/Q0rSmjXC7wi9VzMB4SlENDM519Hu/tdQ==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.341.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/credential-provider-node": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-signing": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/client-sts": "3.347.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -12624,39 +12662,39 @@ } }, "@aws-sdk/client-sso": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.341.0.tgz", - "integrity": "sha512-RWFKz3DBgEy92mce3TTgcq/UOKr/LKNyC189M8UXhWRyyoaQpE9gIyHUQwuh7a2bbnI7XKgpa2rO54Ns0rFJzw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.347.0.tgz", + "integrity": "sha512-AZehWCNLUXTrDavsZYRi7d84Uef20ppYJ2FY0KxqrKB3lx89mO29SfSJSC4woeW5+6ooBokq8HtKxw5ImPfRhA==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -12664,39 +12702,39 @@ } }, "@aws-sdk/client-sso-oidc": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.341.0.tgz", - "integrity": "sha512-BjG4E7E1StsHCM0Mex7EZA6oPMQ+PLZY5axr554ErYxlzYlzE8b/Aq3N/mCCqeUSIdz4zAGr8di7XYCUB3CRdg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.347.0.tgz", + "integrity": "sha512-IBxRfPqb8f9FqpmDbzcRDfoiasj/Y47C4Gj+j3kA5T1XWyGwbDI9QnPW/rnkZTWxLUUG1LSbBNwbPD6TLoff8A==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -12704,42 +12742,42 @@ } }, "@aws-sdk/client-sts": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.341.0.tgz", - "integrity": "sha512-Ec8lzyPkd7N6VE4O73RuY04hgxMSXCD+uyWmYCoCCuamAx+xEP4ifVL0spApr8tttm51QLBgc01pVKNL62Oprw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.347.0.tgz", + "integrity": "sha512-QcJCUlzJZLAFTFSuELKd4BF5I5W38TR/m7NX2y1tn2la9JIrWSrz+tj598zfp2V4pJPzRJ1i8RglTZxSRIvsxQ==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/credential-provider-node": "3.341.0", - "@aws-sdk/fetch-http-handler": "3.341.0", - "@aws-sdk/hash-node": "3.341.0", - "@aws-sdk/invalid-dependency": "3.341.0", - "@aws-sdk/middleware-content-length": "3.341.0", - "@aws-sdk/middleware-endpoint": "3.341.0", - "@aws-sdk/middleware-host-header": "3.341.0", - "@aws-sdk/middleware-logger": "3.341.0", - "@aws-sdk/middleware-recursion-detection": "3.341.0", - "@aws-sdk/middleware-retry": "3.341.0", - "@aws-sdk/middleware-sdk-sts": "3.341.0", - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/middleware-signing": "3.341.0", - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/middleware-user-agent": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/node-http-handler": "3.341.0", - "@aws-sdk/smithy-client": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-sdk-sts": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.347.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.341.0", - "@aws-sdk/util-defaults-mode-node": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", - "@aws-sdk/util-user-agent-browser": "3.341.0", - "@aws-sdk/util-user-agent-node": "3.341.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -12748,168 +12786,179 @@ } }, "@aws-sdk/config-resolver": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.341.0.tgz", - "integrity": "sha512-BpU6JTvT2SJLrsKxe4hjDDVbFnLc5iRcD+dwF/uV4rltFlXPOhqrx1S4NtRLpRaT3oYwA3DnBGC5CkV6QHWW5Q==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.347.0.tgz", + "integrity": "sha512-2ja+Sf/VnUO7IQ3nKbDQ5aumYKKJUaTm/BuVJ29wNho8wYHfuf7wHZV0pDTkB8RF5SH7IpHap7zpZAj39Iq+EA==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-config-provider": "3.310.0", - "@aws-sdk/util-middleware": "3.341.0", + "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.341.0.tgz", - "integrity": "sha512-yUmcM/NmWvHG25uMeC1A2aDO5yiitz0w5fzPgP6DkVV36xKWdYX99V6oE5UnLYKVXgUA0nciuYzv0A57ZqP/0g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.347.0.tgz", + "integrity": "sha512-7NiVVQC51HvomI44OyD+UekZ7qxauJeFGwQILbQ0beAxNuPZL7Ect/jB6A5MeleyqP+sVn8cB7qBMZjFJRhoJA==", "optional": true, "requires": { - "@aws-sdk/client-cognito-identity": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/client-cognito-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-env": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.341.0.tgz", - "integrity": "sha512-oqFMmGvtKjqcY6Io4CweHz0blgyyZtlfxWJbttPK7dSLk9EtRUuvVilcRtzXWXuAB2hk9zUN9wavd8nyaTcidA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.347.0.tgz", + "integrity": "sha512-UnEM+LKGpXKzw/1WvYEQsC6Wj9PupYZdQOE+e2Dgy2dqk/pVFy4WueRtFXYDT2B41ppv3drdXUuKZRIDVqIgNQ==", "requires": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-imds": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.341.0.tgz", - "integrity": "sha512-dkvc7WcKxFR0KgAScbRQ16wg0qH8tKxaVS3hfgHDYJR4UIKqV/sM6r5H2OvAdegY9/T180O2srtq2N4pyywPSQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.347.0.tgz", + "integrity": "sha512-7scCy/DCDRLIhlqTxff97LQWDnRwRXji3bxxMg+xWOTTaJe7PWx+etGSbBWaL42vsBHFShQjSLvJryEgoBktpw==", "requires": { - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-ini": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.341.0.tgz", - "integrity": "sha512-o+44n3VFErRNOHZi4Psbu0JQWB7RT15QJzRtYquAPohgKNDT9jQ/VN0JesEVyktpIklsPJBNAbDb68fExsjKUg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.347.0.tgz", + "integrity": "sha512-84TNF34ryabmVbILOq7f+/Jy8tJaskvHdax3X90qxFtXRU11kX0bf5NYL616KT0epR0VGpy50ThfIqvBwxeJfQ==", "requires": { - "@aws-sdk/credential-provider-env": "3.341.0", - "@aws-sdk/credential-provider-imds": "3.341.0", - "@aws-sdk/credential-provider-process": "3.341.0", - "@aws-sdk/credential-provider-sso": "3.341.0", - "@aws-sdk/credential-provider-web-identity": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-node": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.341.0.tgz", - "integrity": "sha512-O4gxP5PLu86361sGgnyxcwP5L2Ek7N65KM3MYJNgDpXRig+FP/pxBmdOtYkTYJYymPspGxnsNM6p2tbARJ1WMw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.347.0.tgz", + "integrity": "sha512-ds2uxE0krl94RdQ7bstwafUXdlMeEOPgedhaheVVlj8kH+XqlZdwUUaUv1uoEI9iBzuSjKftUkIHo0xsTiwtaw==", "requires": { - "@aws-sdk/credential-provider-env": "3.341.0", - "@aws-sdk/credential-provider-imds": "3.341.0", - "@aws-sdk/credential-provider-ini": "3.341.0", - "@aws-sdk/credential-provider-process": "3.341.0", - "@aws-sdk/credential-provider-sso": "3.341.0", - "@aws-sdk/credential-provider-web-identity": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-process": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.341.0.tgz", - "integrity": "sha512-t+12surwkdZO7dAdtA7xz+O6Hk0H3yOVqXH+Y8UINXbFc9/uUgstPZq5qhpQIeDPRes/lqYUiZ4tho5mhpGItw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.347.0.tgz", + "integrity": "sha512-yl1z4MsaBdXd4GQ2halIvYds23S67kElyOwz7g8kaQ4kHj+UoYWxz3JVW/DGusM6XmQ9/F67utBrUVA0uhQYyw==", "requires": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-sso": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.341.0.tgz", - "integrity": "sha512-ooOntFPVwawHO8WwwTSDFysno+nZFt1+GPlAr9N9QxIWQSRZYLaNFeplnxT/58jJoMcyHH5JjY4Zu4g46htmkw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.347.0.tgz", + "integrity": "sha512-M1d7EnUaJbSNCmNalEbINmtFkc9wJufx7UhKtEeFwSq9KEzOMroH1MEOeiqIw9f/zE8NI/iPkVeEhw123vmBrQ==", "requires": { - "@aws-sdk/client-sso": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/token-providers": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/client-sso": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/token-providers": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-web-identity": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.341.0.tgz", - "integrity": "sha512-NxoyxnxiycO1IG3FG7/soE3CYLLwuc4pv5PWoMHwy6VjH5yiUIeC8CQHHCF5ndCvB/p5XW1TT5z3YmWKknGqaw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.347.0.tgz", + "integrity": "sha512-DxoTlVK8lXjS1zVphtz/Ab+jkN/IZor9d6pP2GjJHNoAIIzXfRwwj5C8vr4eTayx/5VJ7GRP91J8GJ2cKly8Qw==", "requires": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-providers": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.341.0.tgz", - "integrity": "sha512-5AxouRjLA1Jq52JJHZPgpgA04p2R6T0LzIIRIVEyZjK2wB5sIRmv2isoih546tHerrFf01MboaGfJEBMdUWXjw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.347.0.tgz", + "integrity": "sha512-ny8tnuLToQIYbS+ztRh4/fViDDV1xk+WuapSK2T1MAIuPvhyD1IDulTyqv6P9ROoNIqt1NAoLctkWxdkLvqyQA==", "optional": true, "requires": { - "@aws-sdk/client-cognito-identity": "3.341.0", - "@aws-sdk/client-sso": "3.341.0", - "@aws-sdk/client-sts": "3.341.0", - "@aws-sdk/credential-provider-cognito-identity": "3.341.0", - "@aws-sdk/credential-provider-env": "3.341.0", - "@aws-sdk/credential-provider-imds": "3.341.0", - "@aws-sdk/credential-provider-ini": "3.341.0", - "@aws-sdk/credential-provider-node": "3.341.0", - "@aws-sdk/credential-provider-process": "3.341.0", - "@aws-sdk/credential-provider-sso": "3.341.0", - "@aws-sdk/credential-provider-web-identity": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/client-cognito-identity": "3.347.0", + "@aws-sdk/client-sso": "3.347.0", + "@aws-sdk/client-sts": "3.347.0", + "@aws-sdk/credential-provider-cognito-identity": "3.347.0", + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.347.0", + "@aws-sdk/credential-provider-node": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.347.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/eventstream-codec": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.347.0.tgz", + "integrity": "sha512-61q+SyspjsaQ4sdgjizMyRgVph2CiW4aAtfpoH69EJFJfTxTR/OqnZ9Jx/3YiYi0ksrvDenJddYodfWWJqD8/w==", + "requires": { + "@aws-crypto/crc32": "3.0.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-hex-encoding": "3.310.0", "tslib": "^2.5.0" } }, "@aws-sdk/fetch-http-handler": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.341.0.tgz", - "integrity": "sha512-GclHYOFKmhft9Bp+wX4CgVv4q48P/md/xiKN7kJpGUvazCRhBN7DqfcvMoMCPhobh+llYSefyiqJBxEccEq/TA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.347.0.tgz", + "integrity": "sha512-sQ5P7ivY8//7wdxfA76LT1sF6V2Tyyz1qF6xXf9sihPN5Q1Y65c+SKpMzXyFSPqWZ82+SQQuDliYZouVyS6kQQ==", "requires": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/querystring-builder": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/querystring-builder": "3.347.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-base64": "3.310.0", "tslib": "^2.5.0" } }, "@aws-sdk/hash-node": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.341.0.tgz", - "integrity": "sha512-legGgjmhQnA8veIuVjJEVNE18YIhWj6JaLNm47xgiBbEoZ1BApoBY1GsX1AunV6FrA18fRpCeTynW3u4MVIIow==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.347.0.tgz", + "integrity": "sha512-96+ml/4EaUaVpzBdOLGOxdoXOjkPgkoJp/0i1fxOJEvl8wdAQSwc3IugVK9wZkCxy2DlENtgOe6DfIOhfffm/g==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-buffer-from": "3.310.0", "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" } }, "@aws-sdk/invalid-dependency": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.341.0.tgz", - "integrity": "sha512-1GNk+J/Q76bzuj27OqPOqTmFGEYXtyB02afn0cIeadDf0qbjo3G7qkRd3jrJrBIdHNg+DYbBYEHfFB5EuK1s8g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.347.0.tgz", + "integrity": "sha512-8imQcwLwqZ/wTJXZqzXT9pGLIksTRckhGLZaXT60tiBOPKuerTsus2L59UstLs5LP8TKaVZKFFSsjRIn9dQdmQ==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, @@ -12922,246 +12971,247 @@ } }, "@aws-sdk/middleware-content-length": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.341.0.tgz", - "integrity": "sha512-m663QyL1qvMnXOsXUtLvQz5B5l1kulQMTOwVxxhefPxO0nZbIlXdMQurEOwI1FHfaMnR8UQ1FfPLY6GIkJkX/g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.347.0.tgz", + "integrity": "sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==", "requires": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-endpoint": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.341.0.tgz", - "integrity": "sha512-IucQO8JjAjxnA+7RI1tkxOjUtpuUpkS3v56u5vk6Oypq1iovVBvD8yiFBR2wPh9X/O+3Ts7eWsZ4jhuf4JQQUQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.347.0.tgz", + "integrity": "sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==", "requires": { - "@aws-sdk/middleware-serde": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/url-parser": "3.341.0", - "@aws-sdk/util-middleware": "3.341.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-host-header": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.341.0.tgz", - "integrity": "sha512-1AidcDDtGd7LUGtDV+F+FuLb6NmBlpupY2FpuqasUDH5f7ExcEbPaGYjOp4ozktQ6Qb0c0oJ4qxhv5sDos5Qww==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", + "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", "requires": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-logger": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.341.0.tgz", - "integrity": "sha512-JQgnPQMlNs542SL/ANbQSWbPMeWeY4+GW/fEfSRgM9uVBZaKPO5dZW7F761odxoK7f3qPSujEZb0ECmTYaEqgg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", + "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-recursion-detection": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.341.0.tgz", - "integrity": "sha512-DAfZgW7Bb4MB4ZHsjAhiaCXKqTeUFWazrgmNHAa8FkSE8MmgJv/4k8tvnWDtxkAO2GBOwqg7wG9LspeBG/RGMw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", + "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", "requires": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-retry": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.341.0.tgz", - "integrity": "sha512-EyL2N4ohUQc4CdlccydPuybd4ngVx12MTSIGQVc0PcMZ39ayPbgYOZyCkAGb1rRCEIMayMrF9hF4GfNo4BvV5g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.347.0.tgz", + "integrity": "sha512-CpdM+8dCSbX96agy4FCzOfzDmhNnGBM/pxrgIVLm5nkYTLuXp/d7ubpFEUHULr+4hCd5wakHotMt7yO29NFaVw==", "requires": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/service-error-classification": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/util-middleware": "3.341.0", - "@aws-sdk/util-retry": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/service-error-classification": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", "tslib": "^2.5.0", "uuid": "^8.3.2" } }, "@aws-sdk/middleware-sdk-sts": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.341.0.tgz", - "integrity": "sha512-A7sXKhL9wzVqeq7sy3eWx7D5FPWdzrJTVpRRBYez/qBY4UjfLcxF9zpB0mw/xhQ7PUta7iJ5tSlPmZZQ4MBnmg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.347.0.tgz", + "integrity": "sha512-38LJ0bkIoVF3W97x6Jyyou72YV9Cfbml4OaDEdnrCOo0EssNZM5d7RhjMvQDwww7/3OBY/BzeOcZKfJlkYUXGw==", "requires": { - "@aws-sdk/middleware-signing": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-serde": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.341.0.tgz", - "integrity": "sha512-FaPpbEGo/OETxnexg+TYet71fP6dM+y3NPXRUrd5dAulVhmr+CkdzOxqkqtMC1HinKAqHdUpjlsuf7gYg14deQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.347.0.tgz", + "integrity": "sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-signing": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.341.0.tgz", - "integrity": "sha512-KbyBIblgrGRizFJF3sLvx+ON84qOBHrDztNc++Xg2/UmdjLuEtm1sVvpQ2SxrKcfumx+ztVOuDpbD5pd0lBkOA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.347.0.tgz", + "integrity": "sha512-zVBF/4MGKnvhAE/J+oAL/VAehiyv+trs2dqSQXwHou9j8eA8Vm8HS2NdOwpkZQchIxTuwFlqSusDuPEdYFbvGw==", "requires": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/signature-v4": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/util-middleware": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/signature-v4": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-stack": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.341.0.tgz", - "integrity": "sha512-pBAN9T4tBSHp7gJKu0Ma0MepZqP3GvecEh7eZWwTrJrRMgY1k8M1zpUOXBFG6EVRzVdyy7A4DWSuD4kcXE+BIw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.347.0.tgz", + "integrity": "sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==", "requires": { "tslib": "^2.5.0" } }, "@aws-sdk/middleware-user-agent": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.341.0.tgz", - "integrity": "sha512-9gpVXPMkgwv0yV1Lbuc9bvb3MHLEjj5whgbM1WNrtRiogeFwWB0cxOQQgb2cY+xgQLMLnH7VvfRGN79TNVnI7w==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.347.0.tgz", + "integrity": "sha512-wJbGN3OE1/daVCrwk49whhIr9E0j1N4gWwN/wi4WuyYIA+5lMUfVp0aGIOvZR+878DxuFz2hQ4XcZVT4K2WvQw==", "requires": { - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/types": "3.341.0", - "@aws-sdk/util-endpoints": "3.341.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/node-config-provider": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.341.0.tgz", - "integrity": "sha512-Le/WSf9t0ItrHuGhOlEPiA+J/nYpYJaC1WgLefRG9j17xKF/fp7X+XSylF1xQ+cOMbHFMi7SNcXRhyfwFreU0w==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.347.0.tgz", + "integrity": "sha512-faU93d3+5uTTUcotGgMXF+sJVFjrKh+ufW+CzYKT4yUHammyaIab/IbTPWy2hIolcEGtuPeVoxXw8TXbkh/tuw==", "requires": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/node-http-handler": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.341.0.tgz", - "integrity": "sha512-pXkX1amhWhkgffs76bf+pR814JnBUa199Nb6Wm2l20LLPgSsQrRX0IwucM/KtAdEhFeJTR8bLhRJBzrm3ONMwQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.347.0.tgz", + "integrity": "sha512-eluPf3CeeEaPbETsPw7ee0Rb0FP79amu8vdLMrQmkrD+KP4owupUXOEI4drxWJgBSd+3PRowPWCDA8wUtraHKg==", "requires": { - "@aws-sdk/abort-controller": "3.341.0", - "@aws-sdk/protocol-http": "3.341.0", - "@aws-sdk/querystring-builder": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/abort-controller": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/querystring-builder": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/property-provider": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.341.0.tgz", - "integrity": "sha512-5Ynks9iUS/VJcZa/J3c5G+XAaUw4SkWltQp4Y7dzWpJXS3AaUm9gby7DsWYopbH5dLeeSmvKENHTsKpsM5pQoQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.347.0.tgz", + "integrity": "sha512-t3nJ8CYPLKAF2v9nIHOHOlF0CviQbTvbFc2L4a+A+EVd/rM4PzL3+3n8ZJsr0h7f6uD04+b5YRFgKgnaqLXlEg==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/protocol-http": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.341.0.tgz", - "integrity": "sha512-Av+qcOA+gYXWgYYtzbTn2goHGlNdt+nbrzhUI6dWczYPzBe8aNnMR5d/ACNt0mD7O41muULmSTQBHOKBmOmNJA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.347.0.tgz", + "integrity": "sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/querystring-builder": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.341.0.tgz", - "integrity": "sha512-71RNU1VB8tSfqeu9t61YWDmMS/5C9NH8ua6LXb5HGzlnq68BSLq3lGa4zx/h2K0OpZ6ERUORFdw6pmqA17pDmg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.347.0.tgz", + "integrity": "sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-uri-escape": "3.310.0", "tslib": "^2.5.0" } }, "@aws-sdk/querystring-parser": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.341.0.tgz", - "integrity": "sha512-7O61bRUdo2x73TTeyyriibLpx9tUPO13gBdI9oHpJTZEkOiUYxoxjMdo5s7ofis12MdmzelqIUjPmAvJNtB5wA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.347.0.tgz", + "integrity": "sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/service-error-classification": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.341.0.tgz", - "integrity": "sha512-mqf9rV/j8Ry2RWDQsaJDPyDm/VDQ4ZDdmi8rzm/AeSgEDaNWublt31zlWtgUWfjISfTtbBgzI48n6ZBJqyYmUA==" + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.347.0.tgz", + "integrity": "sha512-xZ3MqSY81Oy2gh5g0fCtooAbahqh9VhsF8vcKjVX8+XPbGC8y+kej82+MsMg4gYL8gRFB9u4hgYbNgIS6JTAvg==" }, "@aws-sdk/shared-ini-file-loader": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.341.0.tgz", - "integrity": "sha512-/ikCc2XRL8zG//EB2g6SXFvMMa7KD2T8RpM4dYEisdvHDoF9khVX3/SLLUs2Y32rr1x9tnh7X9DdV8lX9MP/ZA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.347.0.tgz", + "integrity": "sha512-Xw+zAZQVLb+xMNHChXQ29tzzLqm3AEHsD8JJnlkeFjeMnWQtXdUfOARl5s8NzAppcKQNlVe2gPzjaKjoy2jz1Q==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/signature-v4": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.341.0.tgz", - "integrity": "sha512-4nWgDiw68lEFBwrQY1JsKBvcMmcRhClpWzi3iKHwU1PJogId6g4XRU89Zo0QzBQihmFZIKklRSF/150pbNGdcg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.347.0.tgz", + "integrity": "sha512-58Uq1do+VsTHYkP11dTK+DF53fguoNNJL9rHRWhzP+OcYv3/mBMLoS2WPz/x9FO5mBg4ESFsug0I6mXbd36tjw==", "requires": { + "@aws-sdk/eventstream-codec": "3.347.0", "@aws-sdk/is-array-buffer": "3.310.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "@aws-sdk/util-hex-encoding": "3.310.0", - "@aws-sdk/util-middleware": "3.341.0", + "@aws-sdk/util-middleware": "3.347.0", "@aws-sdk/util-uri-escape": "3.310.0", "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" } }, "@aws-sdk/smithy-client": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.341.0.tgz", - "integrity": "sha512-4ReKR+UciZ012W8OimFZfGy1LRZeWcl/i7h6lTIiXasni4Q+5k1rqneCRtJpBgfB5YbJg4EawmWxsxChrX9pwQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.347.0.tgz", + "integrity": "sha512-PaGTDsJLGK0sTjA6YdYQzILRlPRN3uVFyqeBUkfltXssvUzkm8z2t1lz2H4VyJLAhwnG5ZuZTNEV/2mcWrU7JQ==", "requires": { - "@aws-sdk/middleware-stack": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/token-providers": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.341.0.tgz", - "integrity": "sha512-PNskQMWVV6hUTPZmwcfAU0nknY0+Ge60ZVdNx6B4bpor6oEXl/jUCDOmymyHJl85LiIN7AZDrwq1gpdsDDVhZw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.347.0.tgz", + "integrity": "sha512-DZS9UWEy105zsaBJTgcvv1U+0jl7j1OzfMpnLf/lEYjEvx/4FqY2Ue/OZUACJorZgm/dWNqrhY17tZXtS/S3ew==", "requires": { - "@aws-sdk/client-sso-oidc": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/shared-ini-file-loader": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/client-sso-oidc": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/types": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.341.0.tgz", - "integrity": "sha512-2KJf64BhJly/Ty35oWKlCElIqUP4kQ0LA+meSrgAmwl7oE0AYuO7V0ar1nsTGlsubYkLRvOuEhMcuNuumaUdoQ==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", "requires": { "tslib": "^2.5.0" } }, "@aws-sdk/url-parser": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.341.0.tgz", - "integrity": "sha512-pAT+4Yp3NkHKnLhYjbFj9DGKTRavBIVoe0fbQLm1G/MD11FAlUOlswf5EYFjgz0wfdgnbyFE3ai837/eO0fGjw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.347.0.tgz", + "integrity": "sha512-lhrnVjxdV7hl+yCnJfDZOaVLSqKjxN20MIOiijRiqaWGLGEAiSqBreMhL89X1WKCifxAs4zZf9YB9SbdziRpAA==", "requires": { - "@aws-sdk/querystring-parser": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/querystring-parser": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, @@ -13208,35 +13258,35 @@ } }, "@aws-sdk/util-defaults-mode-browser": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.341.0.tgz", - "integrity": "sha512-FjZg0T/7lcEgeMTdC8iMaNcHlHwqVzS0FlyUdJrMZqXEo70h3KlByijv8N9VlV8XQUfiCPuTNlhpLpDEDMdtbw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.347.0.tgz", + "integrity": "sha512-+JHFA4reWnW/nMWwrLKqL2Lm/biw/Dzi/Ix54DAkRZ08C462jMKVnUlzAI+TfxQE3YLm99EIa0G7jiEA+p81Qw==", "requires": { - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "@aws-sdk/util-defaults-mode-node": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.341.0.tgz", - "integrity": "sha512-I943vmtUHqOdHvWCCnO3Vv/XXKCZ4O3XPNl9jvIC8m0n6CXqf7qjs9R72t3PQCTBAbsbIRGfkKMKfH2ab5ci/g==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.347.0.tgz", + "integrity": "sha512-A8BzIVhAAZE5WEukoAN2kYebzTc99ZgncbwOmgCCbvdaYlk5tzguR/s+uoT4G0JgQGol/4hAMuJEl7elNgU6RQ==", "requires": { - "@aws-sdk/config-resolver": "3.341.0", - "@aws-sdk/credential-provider-imds": "3.341.0", - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/property-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, "@aws-sdk/util-endpoints": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.341.0.tgz", - "integrity": "sha512-J15adxRV+YwWasOcCHDZoxXXQS7l8yBgWbId2ozGond/GwHifKhElF0RX9QKB4R/Vq1Cj7WVTyQsugYJAlLWrw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.347.0.tgz", + "integrity": "sha512-/WUkirizeNAqwVj0zkcrqdQ9pUm1HY5kU+qy7xTR0OebkuJauglkmSTMD+56L1JPunWqHhlwCMVRaz5eaJdSEQ==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, @@ -13257,19 +13307,19 @@ } }, "@aws-sdk/util-middleware": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.341.0.tgz", - "integrity": "sha512-JsuZGZw9pMYMHzaJW31Y3Zl1Dh/R2PNVxnlQPsPy37RhHoSLPZ6wR9G828Y1ZY2thBpR+DU3D/VfNJOxBmWGkw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.347.0.tgz", + "integrity": "sha512-8owqUA3ePufeYTUvlzdJ7Z0miLorTwx+rNol5lourGQZ9JXsVMo23+yGA7nOlFuXSGkoKpMOtn6S0BT2bcfeiw==", "requires": { "tslib": "^2.5.0" } }, "@aws-sdk/util-retry": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.341.0.tgz", - "integrity": "sha512-UxAZiajjj65Zi9Q8PJ53vGydsa6dv9ZJC+bfO70czGGTWjB+L7kb2UoRdtGo9NBzRTFYXV6OjP6yBw5yFb39kw==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.347.0.tgz", + "integrity": "sha512-NxnQA0/FHFxriQAeEgBonA43Q9/VPFQa8cfJDuT2A1YZruMasgjcltoZszi1dvoIRWSZsFTW42eY2gdOd0nffQ==", "requires": { - "@aws-sdk/service-error-classification": "3.341.0", + "@aws-sdk/service-error-classification": "3.347.0", "tslib": "^2.5.0" } }, @@ -13282,22 +13332,22 @@ } }, "@aws-sdk/util-user-agent-browser": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.341.0.tgz", - "integrity": "sha512-VCgWM03lbcfjBQFhJJcF7Gs+XKxdtSYuK5txFiXy/glin5eCY+9VB3vqMrYwvEgIlwZynUYXvh9+OkU2AeRaBg==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", + "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", "requires": { - "@aws-sdk/types": "3.341.0", + "@aws-sdk/types": "3.347.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "@aws-sdk/util-user-agent-node": { - "version": "3.341.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.341.0.tgz", - "integrity": "sha512-ac1VcSQOn4fhif51hoSZtrfkFGZHNqXXv2mWzNo1xgsyDwCJh2/H6fPBBGtjT3TNc/o5yOuyBFRP4BIjJ5GkPA==", + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.347.0.tgz", + "integrity": "sha512-6X0b9qGsbD1s80PmbaB6v1/ZtLfSx6fjRX8caM7NN0y/ObuLoX8LhYnW6WlB2f1+xb4EjaCNgpP/zCf98MXosw==", "requires": { - "@aws-sdk/node-config-provider": "3.341.0", - "@aws-sdk/types": "3.341.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" } }, @@ -20552,11 +20602,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, - "request-ip": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", - "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==" - }, "require-at": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", diff --git a/backend/package.json b/backend/package.json index 26d953356..3e11cd8cd 100644 --- a/backend/package.json +++ b/backend/package.json @@ -40,7 +40,6 @@ "posthog-node": "^2.6.0", "query-string": "^7.1.3", "rate-limit-mongo": "^2.3.2", - "request-ip": "^3.3.0", "rimraf": "^3.0.2", "stripe": "^10.7.0", "swagger-autogen": "^2.22.0", diff --git a/backend/src/controllers/v1/authController.ts b/backend/src/controllers/v1/authController.ts index eef1c9ad3..8a70e016e 100644 --- a/backend/src/controllers/v1/authController.ts +++ b/backend/src/controllers/v1/authController.ts @@ -1,18 +1,28 @@ import { Request, Response } from 'express'; +import fs from 'fs'; +import path from 'path'; import jwt from 'jsonwebtoken'; import * as bigintConversion from 'bigint-conversion'; // eslint-disable-next-line @typescript-eslint/no-var-requires const jsrp = require('jsrp'); -import { User, LoginSRPDetail } from '../../models'; +import { + User, + LoginSRPDetail, + TokenVersion +} from '../../models'; import { createToken, issueAuthTokens, clearTokens } from '../../helpers/auth'; import { checkUserDevice } from '../../helpers/user'; import { ACTION_LOGIN, - ACTION_LOGOUT + ACTION_LOGOUT, + AUTH_MODE_JWT } from '../../variables'; -import { BadRequestError } from '../../utils/errors'; +import { + BadRequestError, + UnauthorizedRequestError +} from '../../utils/errors'; import { EELogService } from '../../ee/services'; -import { getChannelFromUserAgent } from '../../utils/posthog'; // TODO: move this +import { getChannelFromUserAgent } from '../../utils/posthog'; import { getJwtRefreshSecret, getJwtAuthLifetime, @@ -23,6 +33,7 @@ import { declare module 'jsonwebtoken' { export interface UserIDJwtPayload extends jwt.JwtPayload { userId: string; + refreshVersion?: number; } } @@ -105,11 +116,15 @@ export const login2 = async (req: Request, res: Response) => { await checkUserDevice({ user, - ip: req.ip, + ip: req.realIP, userAgent: req.headers['user-agent'] ?? '' }); - const tokens = await issueAuthTokens({ userId: user._id.toString() }); + const tokens = await issueAuthTokens({ + userId: user._id, + ip: req.realIP, + userAgent: req.headers['user-agent'] ?? '' + }); // store (refresh) token in httpOnly cookie res.cookie('jid', tokens.refreshToken, { @@ -128,7 +143,7 @@ export const login2 = async (req: Request, res: Response) => { userId: user._id, actions: [loginAction], channel: getChannelFromUserAgent(req.headers['user-agent']), - ipAddress: req.ip + ipAddress: req.realIP }); // return (access) token in response @@ -155,9 +170,9 @@ export const login2 = async (req: Request, res: Response) => { * @returns */ export const logout = async (req: Request, res: Response) => { - await clearTokens({ - userId: req.user._id.toString() - }); + if (req.authData.authMode === AUTH_MODE_JWT && req.authData.authPayload instanceof User && req.authData.tokenVersionId) { + await clearTokens(req.authData.tokenVersionId) + } // clear httpOnly cookie res.cookie('jid', '', { @@ -176,7 +191,7 @@ export const logout = async (req: Request, res: Response) => { userId: req.user._id, actions: [logoutAction], channel: getChannelFromUserAgent(req.headers['user-agent']), - ipAddress: req.ip + ipAddress: req.realIP }); return res.status(200).send({ @@ -184,6 +199,30 @@ export const logout = async (req: Request, res: Response) => { }); }; +export const getCommonPasswords = async (req: Request, res: Response) => { + const commonPasswords = fs.readFileSync( + path.resolve(__dirname, '../../data/' + 'common_passwords.txt'), + 'utf8' + ).split('\n'); + + return res.status(200).send(commonPasswords); +} + +export const revokeAllSessions = async (req: Request, res: Response) => { + await TokenVersion.updateMany({ + user: req.user._id + }, { + $inc: { + refreshVersion: 1, + accessVersion: 1 + } + }); + + return res.status(200).send({ + message: 'Successfully revoked all sessions.' + }); +} + /** * Return user is authenticated * @param req @@ -197,7 +236,7 @@ export const checkAuth = async (req: Request, res: Response) => { } /** - * Return new token by redeeming refresh token + * Return new JWT access token by first validating the refresh token * @param req * @param res * @returns @@ -206,7 +245,7 @@ export const getNewToken = async (req: Request, res: Response) => { const refreshToken = req.cookies.jid; if (!refreshToken) { - throw new Error('Failed to find token in request cookies'); + throw new Error('Failed to find refresh token in request cookies'); } const decodedToken = ( @@ -215,15 +254,27 @@ export const getNewToken = async (req: Request, res: Response) => { const user = await User.findOne({ _id: decodedToken.userId - }).select('+publicKey'); + }).select('+publicKey +refreshVersion +accessVersion'); if (!user) throw new Error('Failed to authenticate unfound user'); if (!user?.publicKey) throw new Error('Failed to authenticate not fully set up account'); + + const tokenVersion = await TokenVersion.findById(decodedToken.tokenVersionId); + + if (!tokenVersion) throw UnauthorizedRequestError({ + message: 'Failed to validate refresh token' + }); + + if (decodedToken.refreshVersion !== tokenVersion.refreshVersion) throw BadRequestError({ + message: 'Failed to validate refresh token' + }); const token = createToken({ payload: { - userId: decodedToken.userId + userId: decodedToken.userId, + tokenVersionId: tokenVersion._id.toString(), + accessVersion: tokenVersion.refreshVersion }, expiresIn: await getJwtAuthLifetime(), secret: await getJwtAuthSecret() diff --git a/backend/src/controllers/v1/membershipOrgController.ts b/backend/src/controllers/v1/membershipOrgController.ts index f6b0ee3cc..eafd7fae2 100644 --- a/backend/src/controllers/v1/membershipOrgController.ts +++ b/backend/src/controllers/v1/membershipOrgController.ts @@ -6,8 +6,10 @@ import { createToken } from '../../helpers/auth'; import { updateSubscriptionOrgQuantity } from '../../helpers/organization'; import { sendMail } from '../../helpers/nodemailer'; import { TokenService } from '../../services'; +import { EELicenseService } from '../../ee/services'; import { OWNER, ADMIN, MEMBER, ACCEPTED, INVITED, TOKEN_EMAIL_ORG_INVITATION } from '../../variables'; import { getSiteURL, getJwtSignupLifetime, getJwtSignupSecret, getSmtpConfigured } from '../../config'; +import { validateUserEmail } from '../../validation'; /** * Delete organization membership with id [membershipOrgId] from organization @@ -96,6 +98,19 @@ export const inviteUserToOrganization = async (req: Request, res: Response) => { if (!membershipOrg) { throw new Error('Failed to validate organization membership'); } + + const plan = await EELicenseService.getOrganizationPlan(organizationId); + + if (plan.memberLimit !== null) { + // case: limit imposed on number of members allowed + + if (plan.membersUsed >= plan.memberLimit) { + // case: number of members used exceeds the number of members allowed + return res.status(400).send({ + message: 'Failed to invite member due to member limit reached. Upgrade plan to invite more members.' + }); + } + } invitee = await User.findOne({ email: inviteeEmail @@ -134,6 +149,9 @@ export const inviteUserToOrganization = async (req: Request, res: Response) => { if (!inviteeMembershipOrg) { // case: invitee has never been invited before + + // validate that email is not disposable + validateUserEmail(inviteeEmail); await new MembershipOrg({ inviteEmail: inviteeEmail, diff --git a/backend/src/controllers/v1/passwordController.ts b/backend/src/controllers/v1/passwordController.ts index 5ce092038..bdeae0fd4 100644 --- a/backend/src/controllers/v1/passwordController.ts +++ b/backend/src/controllers/v1/passwordController.ts @@ -3,12 +3,23 @@ import { Request, Response } from 'express'; const jsrp = require('jsrp'); import * as bigintConversion from 'bigint-conversion'; import { User, BackupPrivateKey, LoginSRPDetail } from '../../models'; -import { createToken } from '../../helpers/auth'; -import { sendMail } from '../../helpers/nodemailer'; +import { + createToken, + sendMail, + clearTokens +} from '../../helpers'; import { TokenService } from '../../services'; -import { TOKEN_EMAIL_PASSWORD_RESET } from '../../variables'; +import { + TOKEN_EMAIL_PASSWORD_RESET, + AUTH_MODE_JWT +} from '../../variables'; import { BadRequestError } from '../../utils/errors'; -import { getSiteURL, getJwtSignupLifetime, getJwtSignupSecret } from '../../config'; +import { + getSiteURL, + getJwtSignupLifetime, + getJwtSignupSecret, + getHttpsEnabled +} from '../../config'; /** * Password reset step 1: Send email verification link to email [email] @@ -18,14 +29,15 @@ import { getSiteURL, getJwtSignupLifetime, getJwtSignupSecret } from '../../conf * @returns */ export const emailPasswordReset = async (req: Request, res: Response) => { - const email = req.body.email; + let email: string; + email = req.body.email; const user = await User.findOne({ email }).select('+publicKey'); if (!user || !user?.publicKey) { // case: user has already completed account return res.status(403).send({ - error: 'Failed to send email verification for password reset' + message: "If an account exists with this email, a password reset link has been sent" }); } @@ -46,7 +58,7 @@ export const emailPasswordReset = async (req: Request, res: Response) => { }); return res.status(200).send({ - message: `Sent an email for account recovery to ${email}` + message:"If an account exists with this email, a password reset link has been sent" }); } @@ -98,6 +110,7 @@ export const emailPasswordResetVerify = async (req: Request, res: Response) => { */ export const srp1 = async (req: Request, res: Response) => { // return salt, serverPublicKey as part of first step of SRP protocol + const { clientPublicKey } = req.body; const user = await User.findOne({ email: req.user.email @@ -127,7 +140,8 @@ export const srp1 = async (req: Request, res: Response) => { }); } ); -}; +} + /** * Change account SRP authentication information for user @@ -193,6 +207,19 @@ export const changePassword = async (req: Request, res: Response) => { new: true } ); + + if (req.authData.authMode === AUTH_MODE_JWT && req.authData.authPayload instanceof User && req.authData.tokenVersionId) { + await clearTokens(req.authData.tokenVersionId) + } + + // clear httpOnly cookie + + res.cookie('jid', '', { + httpOnly: true, + path: '/', + sameSite: 'strict', + secure: (await getHttpsEnabled()) as boolean + }); return res.status(200).send({ message: 'Successfully changed password' diff --git a/backend/src/controllers/v1/secretController.ts b/backend/src/controllers/v1/secretController.ts index e3d6818ae..074e29454 100644 --- a/backend/src/controllers/v1/secretController.ts +++ b/backend/src/controllers/v1/secretController.ts @@ -100,50 +100,52 @@ export const pushSecrets = async (req: Request, res: Response) => { * @returns */ export const pullSecrets = async (req: Request, res: Response) => { - const postHogClient = await TelemetryService.getPostHogClient(); - const environment: string = req.query.environment as string; - const channel: string = req.query.channel as string; - const { workspaceId } = req.params; + let secrets; + let key; - // validate environment - const workspaceEnvs = req.membership.workspace.environments; - if (!workspaceEnvs.find(({ slug }: { slug: string }) => slug === environment)) { - throw new Error('Failed to validate environment'); - } + const postHogClient = await TelemetryService.getPostHogClient(); + const environment: string = req.query.environment as string; + const channel: string = req.query.channel as string; + const { workspaceId } = req.params; - let secrets = await pull({ - userId: req.user._id.toString(), - workspaceId, - environment, - channel: channel ? channel : 'cli', - ipAddress: req.ip - }); + // validate environment + const workspaceEnvs = req.membership.workspace.environments; + if (!workspaceEnvs.find(({ slug }: { slug: string }) => slug === environment)) { + throw new Error('Failed to validate environment'); + } - const key = await Key.findOne({ - workspace: workspaceId, - receiver: req.user._id - }) - .sort({ createdAt: -1 }) - .populate('sender', '+publicKey'); - - if (channel !== 'cli') { - // FIX: Fix this any - secrets = reformatPullSecrets({ secrets }) as any; - } + secrets = await pull({ + userId: req.user._id.toString(), + workspaceId, + environment, + channel: channel ? channel : 'cli', + ipAddress: req.realIP + }); - if (postHogClient) { - // capture secrets pushed event in production - postHogClient.capture({ - distinctId: req.user.email, - event: 'secrets pulled', - properties: { - numberOfSecrets: secrets.length, - environment, - workspaceId, - channel: channel ? channel : 'cli' - } - }); - } + key = await Key.findOne({ + workspace: workspaceId, + receiver: req.user._id + }) + .sort({ createdAt: -1 }) + .populate('sender', '+publicKey'); + + if (channel !== 'cli') { + secrets = reformatPullSecrets({ secrets }); + } + + if (postHogClient) { + // capture secrets pushed event in production + postHogClient.capture({ + distinctId: req.user.email, + event: 'secrets pulled', + properties: { + numberOfSecrets: secrets.length, + environment, + workspaceId, + channel: channel ? channel : 'cli' + } + }); + } return res.status(200).send({ secrets, @@ -160,48 +162,51 @@ export const pullSecrets = async (req: Request, res: Response) => { * @returns */ export const pullSecretsServiceToken = async (req: Request, res: Response) => { - const postHogClient = await TelemetryService.getPostHogClient(); - const environment: string = req.query.environment as string; - const channel: string = req.query.channel as string; - const { workspaceId } = req.params; + let secrets; + let key; - // validate environment - const workspaceEnvs = req.membership.workspace.environments; - if (!workspaceEnvs.find(({ slug }: { slug: string }) => slug === environment)) { - throw new Error('Failed to validate environment'); - } + const postHogClient = await TelemetryService.getPostHogClient(); + const environment: string = req.query.environment as string; + const channel: string = req.query.channel as string; + const { workspaceId } = req.params; - const secrets = await pull({ - userId: req.serviceToken.user._id.toString(), - workspaceId, - environment, - channel: 'cli', - ipAddress: req.ip - }); + // validate environment + const workspaceEnvs = req.membership.workspace.environments; + if (!workspaceEnvs.find(({ slug }: { slug: string }) => slug === environment)) { + throw new Error('Failed to validate environment'); + } - const key = { - encryptedKey: req.serviceToken.encryptedKey, - nonce: req.serviceToken.nonce, - sender: { - publicKey: req.serviceToken.publicKey - }, - receiver: req.serviceToken.user, - workspace: req.serviceToken.workspace - }; + secrets = await pull({ + userId: req.serviceToken.user._id.toString(), + workspaceId, + environment, + channel: 'cli', + ipAddress: req.realIP + }); - if (postHogClient) { - // capture secrets pulled event in production - postHogClient.capture({ - distinctId: req.serviceToken.user.email, - event: 'secrets pulled', - properties: { - numberOfSecrets: secrets.length, - environment, - workspaceId, - channel: channel ? channel : 'cli' - } - }); - } + key = { + encryptedKey: req.serviceToken.encryptedKey, + nonce: req.serviceToken.nonce, + sender: { + publicKey: req.serviceToken.publicKey + }, + receiver: req.serviceToken.user, + workspace: req.serviceToken.workspace + }; + + if (postHogClient) { + // capture secrets pulled event in production + postHogClient.capture({ + distinctId: req.serviceToken.user.email, + event: 'secrets pulled', + properties: { + numberOfSecrets: secrets.length, + environment, + workspaceId, + channel: channel ? channel : 'cli' + } + }); + } return res.status(200).send({ secrets: reformatPullSecrets({ secrets }), diff --git a/backend/src/controllers/v1/signupController.ts b/backend/src/controllers/v1/signupController.ts index 9fede9b1a..19bf94e61 100644 --- a/backend/src/controllers/v1/signupController.ts +++ b/backend/src/controllers/v1/signupController.ts @@ -7,6 +7,7 @@ import { import { createToken } from '../../helpers/auth'; import { BadRequestError } from '../../utils/errors'; import { getInviteOnlySignup, getJwtSignupLifetime, getJwtSignupSecret, getSmtpConfigured } from '../../config'; +import { validateUserEmail } from '../../validation'; /** * Signup step 1: Initialize account for user under email [email] and send a verification code @@ -16,7 +17,11 @@ import { getInviteOnlySignup, getJwtSignupLifetime, getJwtSignupSecret, getSmtpC * @returns */ export const beginEmailSignup = async (req: Request, res: Response) => { - const email = req.body.email; + let email: string; + email = req.body.email; + + // validate that email is not disposable + validateUserEmail(email); const user = await User.findOne({ email }).select('+publicKey'); if (user && user?.publicKey) { diff --git a/backend/src/controllers/v1/workspaceController.ts b/backend/src/controllers/v1/workspaceController.ts index 92ae52b11..796a7bebc 100644 --- a/backend/src/controllers/v1/workspaceController.ts +++ b/backend/src/controllers/v1/workspaceController.ts @@ -13,6 +13,7 @@ import { createWorkspace as create, deleteWorkspace as deleteWork, } from "../../helpers/workspace"; +import { EELicenseService } from '../../ee/services'; import { addMemberships } from "../../helpers/membership"; import { ADMIN } from "../../variables"; @@ -115,6 +116,18 @@ export const createWorkspace = async (req: Request, res: Response) => { throw new Error("Failed to validate organization membership"); } + const plan = await EELicenseService.getOrganizationPlan(organizationId); + + if (plan.workspaceLimit !== null) { + // case: limit imposed on number of workspaces allowed + if (plan.workspacesUsed >= plan.workspaceLimit) { + // case: number of workspaces used exceeds the number of workspaces allowed + return res.status(400).send({ + message: 'Failed to create workspace due to plan limit reached. Upgrade plan to add more workspaces.' + }); + } + } + if (workspaceName.length < 1) { throw new Error("Workspace names must be at least 1-character long"); } diff --git a/backend/src/controllers/v2/authController.ts b/backend/src/controllers/v2/authController.ts index 62735d05c..4b66622a2 100644 --- a/backend/src/controllers/v2/authController.ts +++ b/backend/src/controllers/v2/authController.ts @@ -83,7 +83,7 @@ export const login2 = async (req: Request, res: Response) => { const { email, clientProof } = req.body; const user = await User.findOne({ email - }).select('+salt +verifier +encryptionVersion +protectedKey +protectedKeyIV +protectedKeyTag +publicKey +encryptedPrivateKey +iv +tag'); + }).select('+salt +verifier +encryptionVersion +protectedKey +protectedKeyIV +protectedKeyTag +publicKey +encryptedPrivateKey +iv +tag +devices'); if (!user) throw new Error('Failed to find user'); @@ -105,7 +105,6 @@ export const login2 = async (req: Request, res: Response) => { // compare server and client shared keys if (server.checkClientProof(clientProof)) { - if (user.isMfaEnabled) { // case: user has MFA enabled @@ -141,12 +140,16 @@ export const login2 = async (req: Request, res: Response) => { await checkUserDevice({ user, - ip: req.ip, + ip: req.realIP, userAgent: req.headers['user-agent'] ?? '' }); // issue tokens - const tokens = await issueAuthTokens({ userId: user._id.toString() }); + const tokens = await issueAuthTokens({ + userId: user._id, + ip: req.realIP, + userAgent: req.headers['user-agent'] ?? '' + }); // store (refresh) token in httpOnly cookie res.cookie('jid', tokens.refreshToken, { @@ -156,7 +159,7 @@ export const login2 = async (req: Request, res: Response) => { secure: await getHttpsEnabled() }); - // case: user does not have MFA enablgged + // case: user does not have MFA enabled // return (access) token in response interface ResponseData { @@ -267,12 +270,16 @@ export const verifyMfaToken = async (req: Request, res: Response) => { await checkUserDevice({ user, - ip: req.ip, + ip: req.realIP, userAgent: req.headers['user-agent'] ?? '' }); // issue tokens - const tokens = await issueAuthTokens({ userId: user._id.toString() }); + const tokens = await issueAuthTokens({ + userId: user._id, + ip: req.realIP, + userAgent: req.headers['user-agent'] ?? '' + }); // store (refresh) token in httpOnly cookie res.cookie('jid', tokens.refreshToken, { @@ -330,7 +337,7 @@ export const verifyMfaToken = async (req: Request, res: Response) => { userId: user._id, actions: [loginAction], channel: getChannelFromUserAgent(req.headers['user-agent']), - ipAddress: req.ip + ipAddress: req.realIP }); return res.status(200).send(resObj); diff --git a/backend/src/controllers/v2/secretsController.ts b/backend/src/controllers/v2/secretsController.ts index 76295967e..26c9cc7a8 100644 --- a/backend/src/controllers/v2/secretsController.ts +++ b/backend/src/controllers/v2/secretsController.ts @@ -297,7 +297,7 @@ export const batchSecrets = async (req: Request, res: Response) => { workspaceId: new Types.ObjectId(workspaceId), actions, channel, - ipAddress: req.ip, + ipAddress: req.realIP, }); } @@ -563,7 +563,7 @@ export const createSecrets = async (req: Request, res: Response) => { workspaceId: new Types.ObjectId(workspaceId), actions: [addAction], channel, - ipAddress: req.ip, + ipAddress: req.realIP, })); // (EE) take a secret snapshot @@ -785,7 +785,7 @@ export const getSecrets = async (req: Request, res: Response) => { workspaceId: new Types.ObjectId(workspaceId as string), actions: [readAction], channel, - ipAddress: req.ip, + ipAddress: req.realIP, })); const postHogClient = await TelemetryService.getPostHogClient(); @@ -1020,7 +1020,7 @@ export const updateSecrets = async (req: Request, res: Response) => { workspaceId: new Types.ObjectId(key), actions: [updateAction], channel, - ipAddress: req.ip, + ipAddress: req.realIP, })); // (EE) take a secret snapshot @@ -1158,7 +1158,7 @@ export const deleteSecrets = async (req: Request, res: Response) => { workspaceId: new Types.ObjectId(key), actions: [deleteAction], channel, - ipAddress: req.ip, + ipAddress: req.realIP, })); // (EE) take a secret snapshot diff --git a/backend/src/controllers/v2/signupController.ts b/backend/src/controllers/v2/signupController.ts index cbaa7a6b6..ada119ee9 100644 --- a/backend/src/controllers/v2/signupController.ts +++ b/backend/src/controllers/v2/signupController.ts @@ -114,7 +114,9 @@ export const completeAccountSignup = async (req: Request, res: Response) => { // issue tokens const tokens = await issueAuthTokens({ - userId: user._id.toString() + userId: user._id, + ip: req.realIP, + userAgent: req.headers['user-agent'] ?? '' }); token = tokens.token; @@ -237,7 +239,9 @@ export const completeAccountInvite = async (req: Request, res: Response) => { // issue tokens const tokens = await issueAuthTokens({ - userId: user._id.toString() + userId: user._id, + ip: req.realIP, + userAgent: req.headers['user-agent'] ?? '' }); token = tokens.token; diff --git a/backend/src/controllers/v2/workspaceController.ts b/backend/src/controllers/v2/workspaceController.ts index 2f67bea86..20778491d 100644 --- a/backend/src/controllers/v2/workspaceController.ts +++ b/backend/src/controllers/v2/workspaceController.ts @@ -68,7 +68,7 @@ export const pushWorkspaceSecrets = async (req: Request, res: Response) => { environment, secrets, channel: channel ? channel : 'cli', - ipAddress: req.ip + ipAddress: req.realIP }); await pushKeys({ @@ -111,6 +111,7 @@ export const pushWorkspaceSecrets = async (req: Request, res: Response) => { * @returns */ export const pullSecrets = async (req: Request, res: Response) => { + let secrets; const postHogClient = await TelemetryService.getPostHogClient(); const environment: string = req.query.environment as string; const channel: string = req.query.channel as string; @@ -128,17 +129,16 @@ export const pullSecrets = async (req: Request, res: Response) => { throw new Error('Failed to validate environment'); } - let secrets = await pull({ + secrets = await pull({ userId, workspaceId, environment, channel: channel ? channel : 'cli', - ipAddress: req.ip + ipAddress: req.realIP }); if (channel !== 'cli') { - // FIX: Fix this any - secrets = reformatPullSecrets({ secrets }) as any; + secrets = reformatPullSecrets({ secrets }); } if (postHogClient) { diff --git a/backend/src/controllers/v3/authController.ts b/backend/src/controllers/v3/authController.ts index 61edffb42..afb670269 100644 --- a/backend/src/controllers/v3/authController.ts +++ b/backend/src/controllers/v3/authController.ts @@ -113,7 +113,7 @@ export const login2 = async (req: Request, res: Response) => { const user = await User.findOne({ email, - }).select('+salt +verifier +encryptionVersion +protectedKey +protectedKeyIV +protectedKeyTag +publicKey +encryptedPrivateKey +iv +tag'); + }).select('+salt +verifier +encryptionVersion +protectedKey +protectedKeyIV +protectedKeyTag +publicKey +encryptedPrivateKey +iv +tag +devices'); if (!user) throw new Error('Failed to find user'); @@ -179,12 +179,16 @@ export const login2 = async (req: Request, res: Response) => { await checkUserDevice({ user, - ip: req.ip, + ip: req.realIP, userAgent: req.headers['user-agent'] ?? '' }); // issue tokens - const tokens = await issueAuthTokens({ userId: user._id.toString() }); + const tokens = await issueAuthTokens({ + userId: user._id, + ip: req.realIP, + userAgent: req.headers['user-agent'] ?? '' + }); // store (refresh) token in httpOnly cookie res.cookie('jid', tokens.refreshToken, { @@ -239,7 +243,7 @@ export const login2 = async (req: Request, res: Response) => { userId: user._id, actions: [loginAction], channel: getChannelFromUserAgent(req.headers['user-agent']), - ipAddress: req.ip + ipAddress: req.realIP }); return res.status(200).send(response); diff --git a/backend/src/controllers/v3/signupController.ts b/backend/src/controllers/v3/signupController.ts index 61b4612dc..5944e289a 100644 --- a/backend/src/controllers/v3/signupController.ts +++ b/backend/src/controllers/v3/signupController.ts @@ -137,7 +137,9 @@ export const completeAccountSignup = async (req: Request, res: Response) => { // issue tokens const tokens = await issueAuthTokens({ - userId: user._id.toString() + userId: user._id, + ip: req.realIP, + userAgent: req.headers['user-agent'] ?? '' }); token = tokens.token; diff --git a/backend/src/data/common_passwords.txt b/backend/src/data/common_passwords.txt new file mode 100644 index 000000000..01a442b17 --- /dev/null +++ b/backend/src/data/common_passwords.txt @@ -0,0 +1,1497 @@ +123456 +123456789 +111111 +password +qwerty +abc123 +12345678 +password1 +1234567 +123123 +1234567890 +000000 +12345 +iloveyou +1q2w3e4r5t +1234 +123456a +qwertyuiop +monkey +123321 +dragon +654321 +666666 +123 +myspace1 +a123456 +121212 +1qaz2wsx +123qwe +123abc +tinkle +target123 +gwerty +1g2w3e4r +gwerty123 +zag12wsx +7777777 +qwerty1 +1q2w3e4r +987654321 +222222 +qwe123 +qwerty123 +zxcvbnm +555555 +112233 +fuckyou +asdfghjkl +12345a +123123123 +1q2w3e +qazwsx +computer +aaaaaa +159753 +iloveyou1 +fuckyou1 +princess +789456123 +11111111 +123654 +princess1 +888888 +linkedin +michael +sunshine +football +11111 +777777 +1234qwer +999999 +j38ifUbn +monkey1 +football1 +daniel +azerty +a12345 +123456789a +789456 +asdfgh +love123 +abcd1234 +jordan23 +88888888 +5201314 +12qwaszx +FQRG7CS493 +ashley +asdf +asd123 +superman +jessica +love +samsung +shadow +blink182 +333333 +michael1 +babygirl1 +jesus1 +qwert +k.: +baseball +charlie +0 +hello1 +soccer +killer +131313 +master +1111111 +gfhjkm +0123456789 +987654 +iloveyou2 +angel1 +jordan +147258369 +bitch1 +michelle +q1w2e3r4 +jessica1 +qwer1234 +159357 +soccer1 +liverpool +101010 +zxcvbn +thomas +asdasd +fuckyou2 +justin +nicole +1111111111 +1 +1111 +qazwsxedc +baseball1 +andrew +hello +apple +0987654321 +anthony1 +102030 +money1 +parola +abc +147258 +anthony +111222 +jennifer +number1 +naruto +123456q +696969 +00000000 +joshua +golfer +29rsavoy +myspace +andrea +basketball +qwerty12 +charlie1 +passw0rd +asshole1 +hunter +marina +welcome +010203 +superman1 +password12 +xbox360 +sunshine1 +ashley1 +lovely +babygirl +! +trustno1 +666 +asdf1234 +chocolate +buster +summer +tigger +purple +freedom +loveme +matthew +50cent +password2 +maggie +george +chelsea +12341234 +amanda +hannah +q1w2e3 +friends +shadow1 +william +abcdefg +samantha +12344321 +nicole1 +q1w2e3r4t5y6 +robert +mother +jordan1 +secret +letmein +qweasdzxc +212121 +pokemon +$HEX +internet +batman +love12 +a123456789 +VQsaBLPzLa +qweqwe +hello123 +232323 +butterfly +martin +flower +forever +mustang +1qazxsw2 +iloveu +cjmasterinf +orange +harley +user +brandon1 +london +1234567891 +pepper +chris1 +lol123 +abcdef +whatever +1342 +alexander +loveyou +290966 +wall.e +junior +12413 +qweasd +PE#5GZ29PTZMSE +tudelft +dpbk1234 +DIOSESFIEL +U38fa39 +147852 +cookie +family +jasmine +dragon1 +12345q +nikita +pakistan +123654789 +123789 +amanda1 +joseph +happy1 +ginger +: +matthew1 +snoopy +justin1 +lastfm +3rJs1la7qE +пїЅпїЅпїЅпїЅпїЅпїЅ +antonio +barcelona +matrix +computer1 +hottie1 +sophie +sandra +michelle1 +12345678910 +qqqqqq +arsenal +444444 +brandon +daniel1 +jonathan +killer1 +liverpool1 +mickey +ghbdtn +purple1 +mercedes +patrick +11223344 +diamond +456789 +victoria +asshole +taylor +qwertyu +andrew1 +red123 +lucky1 +eminem +12345qwert +111222tianya +yellow +william1 +bailey +angel +chicken1 +richard +0000 +banana +0000000000 +jasmine1 +benjamin +welcome1 +starwars +hunter1 +cheese +melissa +angela +christian +1234554321 +oliver +chocolate1 +butterfly1 +peanut +55555 +hockey +mylove +natasha +NULL +mommy1 +1234561 +q1w2e3r4t5 +america +252525 +monster +school +456123 +james1 +slipknot +hannah1 +zaq12wsx +chicken +147852369 +gabriel +elizabeth +cookie1 +Status +87654321 +robert1 +ferrari +nathan +1password +buddy1 +1314520 +america1 +metallica +chelsea1 +zzzzzz +prince +adidas +jackson +morgan +rainbow +silver +1234567a +angels +iw14Fi9j +loveme1 +juventus +jennifer1 +!~!1 +bubbles +samuel +fuckoff +lovers +cheese1 +0123456 +123asd +999999999 +madison +elizabeth1 +music +buster1 +lauren +david1 +tigger1 +123qweasd +taylor1 +carlos +tinkerbell +samantha1 +Sojdlg123aljg +joshua1 +poop +stella +myspace123 +asdasd5 +freedom1 +whatever1 +xxxxxx +00000 +valentina +a1b2c3 +741852963 +austin +monica +qaz123 +lovely1 +music1 +harley1 +family1 +spongebob1 +steven +nirvana +1234abcd +hellokitty +thomas1 +7654321 +madison1 +daddy1 +summer1 +cocacola +nicholas +zxc123 +123456m +qwertyui +spiderman +vanessa +diamond1 +142536 +danielle +badoo +7758521 +bandit +pokemon1 +mustang1 +1qaz2wsx3edc +alexis +loulou +justinbieb +yamaha +qwert1 +scooter +rachel +tennis +ronaldo +i +mexico1 +friends1 +victor +maggie1 +asdfasdf +qwerty12345 +lover1 +jesus +123hfjdk147 +nicolas +batman1 +weed420 +password123 +loser1 +123456j +iloveyou! +pepper1 +fuckoff1 +555666 +iloveu2 +sabrina +pussy1 +bubbles1 +098765 +master1 +smokey +a1b2c3d4 +123456789q +qwaszx +heather +jasper +booboo +heather1 +4815162342 +peanut1 +chester +123456s +123456b +google +edward +yankees1 +canada +Exigent +destiny +success +nigger1 +135790 +asdfghjkl1 +124578 +casper +lalala +mother1 +sexy123 +qazxsw +naruto1 +1q2w3e4r5t6y +david +money +yellow1 +patrick1 +flower1 +12121212 +alexander1 +raiders1 +Password1 +sebastian +134679 +zxcvbnm1 +dennis +852456 +hahaha +daniela +ginger1 +olivia +melissa1 +010101 +slipknot1 +spiderman1 +cowboys1 +0000000 +rebecca +741852 +jeremy +a1234567 +dakota +123456d +1a2b3c +apple1 +november +alexandra +159951 +iloveu1 +veronica +fuckme1 +baby123 +yankees +stupid1 +cristina +newyork1 +jackson1 +playboy +friend +iloveyou12 +sammy1 +pimpin1 +phoenix +PolniyPizdec0211 +rocky1 +password! +joseph1 +753951 +p +a838hfiD +richard1 +beautiful1 +mickey1 +carolina +j123456 +202020 +newyork +patricia +charles +stephanie +orange1 +m123456 +421uiopy258 +myspace2 +cameron +spider +barbie +woaini +vincent +mexico +scorpion +monster1 +aaaaa +elephant +asdf123 +963852741 +zk.: +guitar +fucker1 +destiny1 +hotmail +johnny +doudou +q123456 +bailey1 +asdfgh1 +fucker +louise +sparky +sweety +123456abc +shorty1 +booboo1 +december +9876543210 +manchester +midnight +246810 +jessie +dallas +austin1 +s123456 +pass +12345678a +claudia +пїЅпїЅпїЅпїЅпїЅпїЅпїЅ +kristina +lakers +lovelove +crazy1 +tiger1 +thunder +dolphin +a +gangsta1 +jackie +151515 +charlotte +scooter1 +caroline +fuck +merlin +junior1 +super123 +scooby +marseille +aaaa +metallica1 +kitty1 +chris +beautiful +black1 +danielle1 +blessed1 +skater1 +1029384756 +qazwsx123 +456456 +b123456 +genius +guitar1 +tyler1 +peaches +california +sakura +tigers +soleil +lauren1 +green1 +smokey1 +cooper +520520 +muffin +christian1 +love13 +fucku2 +arsenal1 +lucky7 +diablo +apples +george1 +babyboy1 +crystal +1122334455 +player1 +aa123456 +vfhbyf +forever1 +Password +winston +chivas1 +sexy +hockey1 +1a2b3c4d +pussy +playboy1 +stalker +cherry +tweety +toyota +creative +gemini +pretty1 +пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ +maverick +brittany1 +nathan1 +letmein1 +cameron1 +secret1 +google1 +heaven +martina +murphy +spongebob +uQA9Ebw445 +fernando +pretty +startfinding +softball +dolphin1 +fuckme +test123 +qwerty1234 +kobe24 +alejandro +adrian +september +aaaaaa1 +bubba1 +isabella +abc123456 +password3 +jason1 +abcdefg123 +loveyou1 +shannon +100200 +manuel +leonardo +molly1 +flowers +123456z +007007 +password. +321321 +miguel +samsung1 +sergey +sweet1 +abc1234 +windows +qwert123 +vfrcbv +poohbear +d123456 +school1 +badboy +951753 +123456c +111 +steven1 +snoopy1 +garfield +YAgjecc826 +compaq +candy1 +sarah1 +qwerty123456 +123456l +eminem1 +141414 +789789 +maria +steelers +iloveme1 +morgan1 +winner +boomer +lolita +nastya +alexis1 +carmen +angelo +nicholas1 +portugal +precious +jackass1 +jonathan1 +yfnfif +bitch +tiffany +rabbit +rainbow1 +angel123 +popcorn +barbara +brandy +fuckyou! +starwars1 +barney +natalia +hiphop +tiffany1 +shorty +poohbear1 +simone +albert +marlboro +hardcore +cowboys +sydney +alex +scorpio +1234512345 +q12345 +qq123456 +onelove +bond007 +abcdefg1 +eagles +crystal1 +azertyuiop +winter +sexy12 +angelina +james +svetlana +fatima +123456k +icecream +popcorn1 +121314 +john316 +qazwsx1 +victoria1 +twilight +iloveme +9379992 +pass123 +dancer +brittany +beauty +bonjour +maxwell +coffee +dexter +454545 +qazqaz +snickers +love11 +samson +aaaaaaaa +swordfish +fyfcnfcbz +abcd123 +aaa111 +natalie +hottie +passion +alyssa +rockstar1 +lovers1 +florida +alicia +happy +blue123 +123456t +ranger +yourmom1 +pumpkin +denise +edward1 +tweety1 +christine +august +54321 +bella1 +marie1 +seven7 +steelers1 +aaaaa1 +shannon1 +amber1 +cutie1 +peaches1 +florida1 +bonnie +stephanie1 +lollipop +cassie +k. +rachel1 +greenday1 +krishna +teresa +october +iverson3 +motorola +rockstar +hahaha1 +police +lakers24 +fylhtq +andrey +loveme2 +turtle +southside1 +baby +bismillah +pa55word +blessed +emmanuel +666999 +012345 +fluffy +5555555555 +stupid +karina +fishing +musica +password11 +love4ever +melanie +greenday +isabelle +nothing +abcd +chicago +cowboy +mnbvcxz +andrea1 +242424 +babygurl1 +santiago +ssssss +kevin1 +lakers1 +chester1 +321654 +kimberly +carlos1 +z123456 +daisy1 +jackass +m +5555555 +zoosk +boston +happy123 +55555555 +satan666 +111111a +pamela +090909 +francesco +horses +456852 +qwer +vanessa1 +redsox +pookie +a12345678 +110110 +tucker +marley +corvette +778899 +realmadrid +raiders +rangers +people +1123581321 +soccer12 +sayang +shelby +christ +12345t +fktrcfylh +kitten +player +c123456 +qwert12345 +baby12 +trinity +1v7Upjw3nT +p@ssw0rd +thunder1 +zxcvbnm123 +midnight1 +lebron23 +golden +strawberry +orlando +love1234 +lucky13 +asdfg1 +marine +soccer10123456 +password +12345678 +1234 +pussy +12345 +dragon +qwerty +696969 +mustang +letmein +baseball +master +michael +football +shadow +monkey +abc123 +pass +fuckme +6969 +jordan +harley +ranger +iwantu +jennifer +hunter +fuck +2000 +test +batman +trustno1 +thomas +tigger +robert +access +love +buster +1234567 +soccer +hockey +killer +george +sexy +andrew +charlie +superman +asshole +fuckyou +dallas +jessica +panties +pepper +1111 +austin +william +daniel +golfer +summer +heather +hammer +yankees +joshua +maggie +biteme +enter +ashley +thunder +cowboy +silver +richard +fucker +orange +merlin +michelle +corvette +bigdog +cheese +matthew +121212 +patrick +martin +freedom +ginger +blowjob +nicole +sparky +yellow +camaro +secret +dick +falcon +taylor +111111 +131313 +123123 +bitch +hello +scooter +please +porsche +guitar +chelsea +black +diamond +nascar +jackson +cameron +654321 +computer +amanda +wizard +xxxxxxxx +money +phoenix +mickey +bailey +knight +iceman +tigers +purple +andrea +horny +dakota +aaaaaa +player +sunshine +morgan +starwars +boomer +cowboys +edward +charles +girls +booboo +coffee +xxxxxx +bulldog +ncc1701 +rabbit +peanut +john +johnny +gandalf +spanky +winter +brandy +compaq +carlos +tennis +james +mike +brandon +fender +anthony +blowme +ferrari +cookie +chicken +maverick +chicago +joseph +diablo +sexsex +hardcore +666666 +willie +welcome +chris +panther +yamaha +justin +banana +driver +marine +angels +fishing +david +maddog +hooters +wilson +butthead +dennis +fucking +captain +bigdick +chester +smokey +xavier +steven +viking +snoopy +blue +eagles +winner +samantha +house +miller +flower +jack +firebird +butter +united +turtle +steelers +tiffany +zxcvbn +tomcat +golf +bond007 +bear +tiger +doctor +gateway +gators +angel +junior +thx1138 +porno +badboy +debbie +spider +melissa +booger +1212 +flyers +fish +porn +matrix +teens +scooby +jason +walter +cumshot +boston +braves +yankee +lover +barney +victor +tucker +princess +mercedes +5150 +doggie +zzzzzz +gunner +horney +bubba +2112 +fred +johnson +xxxxx +tits +member +boobs +donald +bigdaddy +bronco +penis +voyager +rangers +birdie +trouble +white +topgun +bigtits +bitches +green +super +qazwsx +magic +lakers +rachel +slayer +scott +2222 +asdf +video +london +7777 +marlboro +srinivas +internet +action +carter +jasper +monster +teresa +jeremy +11111111 +bill +crystal +peter +pussies +cock +beer +rocket +theman +oliver +prince +beach +amateur +7777777 +muffin +redsox +star +testing +shannon +murphy +frank +hannah +dave +eagle1 +11111 +mother +nathan +raiders +steve +forever +angela +viper +ou812 +jake +lovers +suckit +gregory +buddy +whatever +young +nicholas +lucky +helpme +jackie +monica +midnight +college +baby +cunt +brian +mark +startrek +sierra +leather +232323 +4444 +beavis +bigcock +happy +sophie +ladies +naughty +giants +booty +blonde +fucked +golden +0 +fire +sandra +pookie +packers +einstein +dolphins +chevy +winston +warrior +sammy +slut +8675309 +zxcvbnm +nipples +power +victoria +asdfgh +vagina +toyota +travis +hotdog +paris +rock +xxxx +extreme +redskins +erotic +dirty +ford +freddy +arsenal +access14 +wolf +nipple +iloveyou +alex +florida +eric +legend +movie +success +rosebud +jaguar +great +cool +cooper +1313 +scorpio +mountain +madison +987654 +brazil +lauren +japan +naked +squirt +stars +apple +alexis +aaaa +bonnie +peaches +jasmine +kevin +matt +qwertyui +danielle +beaver +4321 +4128 +runner +swimming +dolphin +gordon +casper +stupid +shit +saturn +gemini +apples +august +3333 +canada +blazer +cumming +hunting +kitty +rainbow +112233 +arthur +cream +calvin +shaved +surfer +samson +kelly +paul +mine +king +racing +5555 +eagle +hentai +newyork +little +redwings +smith +sticky +cocacola +animal +broncos +private +skippy +marvin +blondes +enjoy +girl +apollo +parker +qwert +time +sydney +women +voodoo +magnum +juice +abgrtyu +777777 +dreams +maxwell +music +rush2112 +russia +scorpion +rebecca +tester +mistress +phantom +billy +6666 +albert \ No newline at end of file diff --git a/backend/src/data/disposable_emails.txt b/backend/src/data/disposable_emails.txt new file mode 100644 index 000000000..70e24a460 --- /dev/null +++ b/backend/src/data/disposable_emails.txt @@ -0,0 +1,3519 @@ +0-mail.com +027168.com +0815.ru +0815.ry +0815.su +0845.ru +0box.eu +0clickemail.com +0n0ff.net +0nelce.com +0v.ro +0w.ro +0wnd.net +0wnd.org +0x207.info +1-8.biz +1-tm.com +10-minute-mail.com +1000rebates.stream +100likers.com +105kg.ru +10dk.email +10mail.com +10mail.org +10minut.com.pl +10minut.xyz +10minutemail.be +10minutemail.cf +10minutemail.co.uk +10minutemail.co.za +10minutemail.com +10minutemail.de +10minutemail.ga +10minutemail.gq +10minutemail.ml +10minutemail.net +10minutemail.nl +10minutemail.pro +10minutemail.us +10minutemailbox.com +10minutemails.in +10minutenemail.de +10minutesmail.com +10minutesmail.fr +10minutmail.pl +10x9.com +11163.com +123-m.com +12hosting.net +12houremail.com +12minutemail.com +12minutemail.net +12storage.com +140unichars.com +147.cl +14n.co.uk +15qm.com +1blackmoon.com +1ce.us +1chuan.com +1clck2.com +1fsdfdsfsdf.tk +1mail.ml +1pad.de +1s.fr +1secmail.com +1secmail.net +1secmail.org +1st-forms.com +1to1mail.org +1usemail.com +1webmail.info +1zhuan.com +2012-2016.ru +20email.eu +20email.it +20mail.eu +20mail.in +20mail.it +20minutemail.com +20minutemail.it +20mm.eu +2120001.net +21cn.com +247web.net +24hinbox.com +24hourmail.com +24hourmail.net +2anom.com +2chmail.net +2ether.net +2fdgdfgdfgdf.tk +2odem.com +2prong.com +2wc.info +300book.info +30mail.ir +30minutemail.com +30wave.com +3202.com +36ru.com +3d-painting.com +3l6.com +3mail.ga +3trtretgfrfe.tk +4-n.us +4057.com +418.dk +42o.org +4gfdsgfdgfd.tk +4k5.net +4mail.cf +4mail.ga +4nextmail.com +4nmv.ru +4tb.host +4warding.com +4warding.net +4warding.org +50set.ru +55hosting.net +5ghgfhfghfgh.tk +5gramos.com +5july.org +5mail.cf +5mail.ga +5minutemail.net +5oz.ru +5tb.in +5x25.com +5ymail.com +60minutemail.com +672643.net +675hosting.com +675hosting.net +675hosting.org +6hjgjhgkilkj.tk +6ip.us +6mail.cf +6mail.ga +6mail.ml +6paq.com +6somok.ru +6url.com +75hosting.com +75hosting.net +75hosting.org +7days-printing.com +7mail.ga +7mail.ml +7tags.com +80665.com +8127ep.com +8mail.cf +8mail.ga +8mail.ml +99.com +99cows.com +99experts.com +9mail.cf +9me.site +9mot.ru +9ox.net +9q.ro +a-bc.net +a45.in +a7996.com +aa5zy64.com +abacuswe.us +abakiss.com +abcmail.email +abilitywe.us +abovewe.us +absolutewe.us +abundantwe.us +abusemail.de +abuser.eu +abyssmail.com +ac20mail.in +academiccommunity.com +academywe.us +acceleratewe.us +accentwe.us +acceptwe.us +acclaimwe.us +accordwe.us +accreditedwe.us +acentri.com +achievementwe.us +achievewe.us +acornwe.us +acrossgracealley.com +acrylicwe.us +activatewe.us +activitywe.us +acucre.com +acuitywe.us +acumenwe.us +adaptivewe.us +adaptwe.us +add3000.pp.ua +addictingtrailers.com +adeptwe.us +adfskj.com +adios.email +adiq.eu +aditus.info +admiralwe.us +ado888.biz +adobeccepdm.com +adoniswe.us +adpugh.org +adroh.com +adsd.org +adubiz.info +advantagewe.us +advantimo.com +adventurewe.us +adventwe.us +advisorwe.us +advocatewe.us +adwaterandstir.com +aegde.com +aegia.net +aegiscorp.net +aegiswe.us +aelo.es +aeonpsi.com +afarek.com +affiliate-nebenjob.info +affiliatedwe.us +affilikingz.de +affinitywe.us +affluentwe.us +affordablewe.us +afia.pro +afrobacon.com +afterhourswe.us +agedmail.com +agendawe.us +agger.ro +agilewe.us +agorawe.us +agtx.net +aheadwe.us +ahem.email +ahk.jp +ahmedkhlef.com +air2token.com +airmailbox.website +airsi.de +ajaxapp.net +akapost.com +akerd.com +akgq701.com +akmail.in +al-qaeda.us +albionwe.us +alchemywe.us +alfaceti.com +aliaswe.us +alienware13.com +aligamel.com +alisongamel.com +alivance.com +alivewe.us +all-cats.ru +allaccesswe.us +allamericanwe.us +allaroundwe.us +alldirectbuy.com +allegiancewe.us +allegrowe.us +allemojikeyboard.com +allgoodwe.us +alliancewe.us +allinonewe.us +allofthem.net +alloutwe.us +allowed.org +alloywe.us +allprowe.us +allseasonswe.us +allstarwe.us +allthegoodnamesaretaken.org +allurewe.us +almondwe.us +alph.wtf +alpha-web.net +alphaomegawe.us +alpinewe.us +altairwe.us +altitudewe.us +altuswe.us +ama-trade.de +ama-trans.de +amadeuswe.us +amail.club +amail.com +amail1.com +amail4.me +amazon-aws.org +amberwe.us +ambiancewe.us +ambitiouswe.us +amelabs.com +americanawe.us +americasbestwe.us +americaswe.us +amicuswe.us +amilegit.com +amiri.net +amiriindustries.com +amplewe.us +amplifiedwe.us +amplifywe.us +ampsylike.com +analogwe.us +analysiswe.us +analyticalwe.us +analyticswe.us +analyticwe.us +anappfor.com +anappthat.com +andreihusanu.ro +andthen.us +animesos.com +anit.ro +ano-mail.net +anon-mail.de +anonbox.net +anonmail.top +anonmails.de +anonymail.dk +anonymbox.com +anonymized.org +anonymousness.com +anotherdomaincyka.tk +ansibleemail.com +anthony-junkmail.com +antireg.com +antireg.ru +antispam.de +antispam24.de +antispammail.de +anyalias.com +aoeuhtns.com +apfelkorps.de +aphlog.com +apkmd.com +appc.se +appinventor.nl +appixie.com +apps.dj +appzily.com +arduino.hk +ariaz.jetzt +armyspy.com +aron.us +arroisijewellery.com +art-en-ligne.pro +artman-conception.com +arur01.tk +arurgitu.gq +arvato-community.de +aschenbrandt.net +asdasd.nl +asdasd.ru +ashleyandrew.com +ask-mail.com +asorent.com +ass.pp.ua +astonut.tk +astroempires.info +asu.mx +asu.su +at.hm +at0mik.org +atnextmail.com +attnetwork.com +augmentationtechnology.com +ausgefallen.info +auti.st +autorobotica.com +autosouvenir39.ru +autotwollow.com +autowb.com +aver.com +averdov.com +avia-tonic.fr +avls.pt +awatum.de +awdrt.org +awiki.org +awsoo.com +axiz.org +axon7zte.com +axsup.net +ayakamail.cf +azazazatashkent.tk +azcomputerworks.com +azmeil.tk +b1of96u.com +b2bx.net +b2cmail.de +badgerland.eu +badoop.com +badpotato.tk +balaket.com +banit.club +banit.me +bank-opros1.ru +bareed.ws +barryogorman.com +bartdevos.be +basscode.org +bauwerke-online.com +bazaaboom.com +bbbbyyzz.info +bbhost.us +bbitf.com +bbitj.com +bbitq.com +bcaoo.com +bcast.ws +bcb.ro +bccto.me +bdmuzic.pw +beaconmessenger.com +bearsarefuzzy.com +beddly.com +beefmilk.com +belamail.org +belljonestax.com +beluckygame.com +benipaula.org +bepureme.com +beribase.ru +beribaza.ru +berirabotay.ru +best-john-boats.com +bestchoiceusedcar.com +bestlistbase.com +bestoption25.club +bestparadize.com +bestsoundeffects.com +besttempmail.com +betr.co +bgtmail.com +bgx.ro +bheps.com +bidourlnks.com +big1.us +bigprofessor.so +bigstring.com +bigwhoop.co.za +bij.pl +binka.me +binkmail.com +binnary.com +bio-muesli.info +bio-muesli.net +bione.co +bitwhites.top +bitymails.us +blackgoldagency.ru +blackmarket.to +bladesmail.net +blip.ch +blnkt.net +block521.com +blogmyway.org +blogos.net +blogspam.ro +blondemorkin.com +bluedumpling.info +bluewerks.com +bnote.com +boatmail.us +bobmail.info +bobmurchison.com +bofthew.com +bonobo.email +boofx.com +bookthemmore.com +bootybay.de +borged.com +borged.net +borged.org +bot.nu +boun.cr +bouncr.com +boxformail.in +boximail.com +boxmail.lol +boxomail.live +boxtemp.com.br +bptfp.net +brand-app.biz +brandallday.net +brasx.org +breakthru.com +brefmail.com +brennendesreich.de +briggsmarcus.com +broadbandninja.com +bsnow.net +bspamfree.org +bspooky.com +bst-72.com +btb-notes.com +btc.email +btcmail.pw +btcmod.com +btizet.pl +buccalmassage.ru +budaya-tionghoa.com +budayationghoa.com +buffemail.com +bugfoo.com +bugmenever.com +bugmenot.com +bukhariansiddur.com +bulrushpress.com +bum.net +bumpymail.com +bunchofidiots.com +bund.us +bundes-li.ga +bunsenhoneydew.com +burnthespam.info +burstmail.info +businessbackend.com +businesssuccessislifesuccess.com +buspad.org +bussitussi.com +buymoreplays.com +buyordie.info +buyusdomain.com +buyusedlibrarybooks.org +buzzcluby.com +byebyemail.com +byespm.com +byom.de +c51vsgq.com +cachedot.net +californiafitnessdeals.com +cam4you.cc +camping-grill.info +candymail.de +cane.pw +capitalistdilemma.com +car101.pro +carbtc.net +cars2.club +carsencyclopedia.com +cartelera.org +caseedu.tk +cashflow35.com +casualdx.com +cavi.mx +cbair.com +cbes.net +cc.liamria +ccmail.uk +cdfaq.com +cdpa.cc +ceed.se +cek.pm +cellurl.com +centermail.com +centermail.net +cetpass.com +cfo2go.ro +chacuo.net +chaichuang.com +chalupaurybnicku.cz +chammy.info +chasefreedomactivate.com +chatich.com +cheaphub.net +cheatmail.de +chenbot.email +chibakenma.ml +chickenkiller.com +chielo.com +childsavetrust.org +chilkat.com +chinamkm.com +chithinh.com +chitthi.in +choco.la +chogmail.com +choicemail1.com +chong-mail.com +chong-mail.net +chong-mail.org +chumpstakingdumps.com +cigar-auctions.com +civikli.com +civx.org +ckaazaza.tk +ckiso.com +cl-cl.org +cl0ne.net +claimab.com +clandest.in +classesmail.com +clearwatermail.info +click-email.com +clickdeal.co +clipmail.eu +clixser.com +clonemoi.tk +cloud-mail.top +cloudns.cx +clout.wiki +clrmail.com +cmail.club +cmail.com +cmail.net +cmail.org +cnamed.com +cndps.com +cnew.ir +cnmsg.net +cnsds.de +co.cc +cobarekyo1.ml +cocoro.uk +cocovpn.com +codeandscotch.com +codivide.com +coffeetimer24.com +coieo.com +coin-host.net +coinlink.club +coldemail.info +compareshippingrates.org +completegolfswing.com +comwest.de +conf.work +consumerriot.com +contbay.com +cooh-2.site +coolandwacky.us +coolimpool.org +coreclip.com +cosmorph.com +courrieltemporaire.com +coza.ro +crankhole.com +crapmail.org +crastination.de +crazespaces.pw +crazymailing.com +cream.pink +crepeau12.com +cringemonster.com +cross-law.ga +cross-law.gq +crossmailjet.com +crossroadsmail.com +crunchcompass.com +crusthost.com +cs.email +csh.ro +cszbl.com +ctmailing.us +ctos.ch +cu.cc +cubiclink.com +cuendita.com +cuirushi.org +cuoly.com +cupbest.com +curlhph.tk +curryworld.de +cust.in +cutout.club +cutradition.com +cuvox.de +cyber-innovation.club +cyber-phone.eu +cylab.org +d1yun.com +d3p.dk +daabox.com +dab.ro +dacoolest.com +daemsteam.com +daibond.info +daily-email.com +daintly.com +damai.webcam +dammexe.net +damnthespam.com +dandikmail.com +darkharvestfilms.com +daryxfox.net +dasdasdascyka.tk +dash-pads.com +dataarca.com +datarca.com +datazo.ca +datenschutz.ru +datum2.com +davidkoh.net +davidlcreative.com +dawin.com +daymail.life +daymailonline.com +dayrep.com +dbunker.com +dcctb.com +dcemail.com +ddcrew.com +de-a.org +dea-21olympic.com +deadaddress.com +deadchildren.org +deadfake.cf +deadfake.ga +deadfake.ml +deadfake.tk +deadspam.com +deagot.com +dealja.com +dealrek.com +deekayen.us +defomail.com +degradedfun.net +deinbox.com +delayload.com +delayload.net +delikkt.de +delivrmail.com +demen.ml +dengekibunko.ga +dengekibunko.gq +dengekibunko.ml +der-kombi.de +derkombi.de +derluxuswagen.de +desoz.com +despam.it +despammed.com +dev-null.cf +dev-null.ga +dev-null.gq +dev-null.ml +developermail.com +devnullmail.com +deyom.com +dharmatel.net +dhm.ro +dhy.cc +dialogus.com +diapaulpainting.com +dicopto.com +digdig.org +digital-message.com +digitalesbusiness.info +digitalmail.info +digitalmariachis.com +digitalsanctuary.com +dildosfromspace.com +dim-coin.com +dingbone.com +diolang.com +directmail24.net +disaq.com +disbox.net +disbox.org +discard.cf +discard.email +discard.ga +discard.gq +discard.ml +discard.tk +discardmail.com +discardmail.de +discos4.com +disign-concept.eu +disign-revelation.com +dispo.in +dispomail.eu +disposable-e.ml +disposable-email.ml +disposable.cf +disposable.ga +disposable.ml +disposable.site +disposableaddress.com +disposableemailaddresses.com +disposableinbox.com +disposablemails.com +dispose.it +disposeamail.com +disposemail.com +disposemymail.com +dispostable.com +divad.ga +divermail.com +divismail.ru +diwaq.com +dlemail.ru +dmarc.ro +dndent.com +dnses.ro +doanart.com +dob.jp +dodgeit.com +dodgemail.de +dodgit.com +dodgit.org +dodsi.com +doiea.com +dolphinnet.net +domforfb1.tk +domforfb18.tk +domforfb19.tk +domforfb2.tk +domforfb23.tk +domforfb27.tk +domforfb29.tk +domforfb3.tk +domforfb4.tk +domforfb5.tk +domforfb6.tk +domforfb7.tk +domforfb8.tk +domforfb9.tk +domozmail.com +donemail.ru +dongqing365.com +dontreg.com +dontsendmespam.de +doojazz.com +doquier.tk +dotman.de +dotmsg.com +dotslashrage.com +doublemail.de +douchelounge.com +dozvon-spb.ru +dp76.com +dr69.site +drdrb.com +drdrb.net +dred.ru +drevo.si +drivetagdev.com +drmail.in +droolingfanboy.de +dropcake.de +dropjar.com +droplar.com +dropmail.me +dropsin.net +dsgvo.ru +dsiay.com +dspwebservices.com +duam.net +duck2.club +dudmail.com +duk33.com +dukedish.com +dump-email.info +dumpandjunk.com +dumpmail.de +dumpyemail.com +durandinterstellar.com +duskmail.com +dwse.edu.pl +dyceroprojects.com +dz17.net +e-mail.com +e-mail.org +e-marketstore.ru +e-tomarigi.com +e3z.de +e4ward.com +eanok.com +easy-trash-mail.com +easynetwork.info +easytrashmail.com +eatmea2z.club +eay.jp +ebbob.com +ebeschlussbuch.de +ecallheandi.com +ecolo-online.fr +edgex.ru +edinburgh-airporthotels.com +edv.to +ee1.pl +ee2.pl +eeedv.de +eelmail.com +efxs.ca +egzones.com +einmalmail.de +einrot.com +einrot.de +eintagsmail.de +elearningjournal.org +electro.mn +elitevipatlantamodels.com +elki-mkzn.ru +email-fake.cf +email-fake.com +email-fake.ga +email-fake.gq +email-fake.ml +email-fake.tk +email-jetable.fr +email-lab.com +email-temp.com +email.edu.pl +email.net +email1.pro +email60.com +emailage.cf +emailage.ga +emailage.gq +emailage.ml +emailage.tk +emailate.com +emailcu.icu +emaildienst.de +emaildrop.io +emailfake.com +emailfake.ml +emailfreedom.ml +emailgenerator.de +emailgo.de +emailias.com +emailigo.de +emailinfive.com +emailisvalid.com +emaillime.com +emailmiser.com +emailna.co +emailnax.com +emailo.pro +emailondeck.com +emailportal.info +emailproxsy.com +emailresort.com +emails.ga +emailsecurer.com +emailsensei.com +emailsingularity.net +emailspam.cf +emailspam.ga +emailspam.gq +emailspam.ml +emailspam.tk +emailsy.info +emailtech.info +emailtemporanea.com +emailtemporanea.net +emailtemporar.ro +emailtemporario.com.br +emailthe.net +emailtmp.com +emailto.de +emailure.net +emailwarden.com +emailxfer.com +emailz.cf +emailz.ga +emailz.gq +emailz.ml +emeil.in +emeil.ir +emeraldwebmail.com +emil.com +emkei.cf +emkei.ga +emkei.gq +emkei.ml +emkei.tk +eml.pp.ua +emlhub.com +emlpro.com +emltmp.com +empireanime.ga +emstjzh.com +emz.net +enayu.com +enterto.com +envy17.com +eoffice.top +eoopy.com +epb.ro +ephemail.net +ephemeral.email +eposta.buzz +eposta.work +eqiluxspam.ga +ereplyzy.com +ericjohnson.ml +ero-tube.org +esadverse.com +esbano-ru.ru +esc.la +escapehatchapp.com +esemay.com +esgeneri.com +esiix.com +esprity.com +estate-invest.fr +eth2btc.info +ether123.net +ethereum1.top +ethersports.org +ethersportz.info +etotvibor.ru +etranquil.com +etranquil.net +etranquil.org +euaqa.com +evanfox.info +eveav.com +evilcomputer.com +evopo.com +evyush.com +exdonuts.com +existiert.net +exitstageleft.net +explodemail.com +express.net.ua +extracurricularsociety.com +extremail.ru +eyepaste.com +ez.lv +ezehe.com +ezfill.com +ezstest.com +f4k.es +f5.si +facebook-email.cf +facebook-email.ga +facebook-email.ml +facebookmail.gq +facebookmail.ml +fackme.gq +fadingemail.com +faecesmail.me +fag.wf +failbone.com +faithkills.com +fake-box.com +fake-email.pp.ua +fake-mail.cf +fake-mail.ga +fake-mail.ml +fakedemail.com +fakeinbox.cf +fakeinbox.com +fakeinbox.ga +fakeinbox.info +fakeinbox.ml +fakeinbox.tk +fakeinformation.com +fakemail.fr +fakemail.io +fakemailgenerator.com +fakemailz.com +fallinhay.com +fammix.com +fanclub.pm +fangoh.com +fansworldwide.de +fantasymail.de +farrse.co.uk +fast-email.info +fast-mail.fr +fastacura.com +fastchevy.com +fastchrysler.com +fasternet.biz +fastkawasaki.com +fastmazda.com +fastmitsubishi.com +fastnissan.com +fastsubaru.com +fastsuzuki.com +fasttoyota.com +fastyamaha.com +fatflap.com +fbma.tk +fddns.ml +fdfdsfds.com +femailtor.com +fer-gabon.org +fermaxxi.ru +fettometern.com +fexbox.org +fexbox.ru +fexpost.com +fextemp.com +ficken.de +fictionsite.com +fightallspam.com +figjs.com +figshot.com +figurescoin.com +fiifke.de +filbert4u.com +filberts4u.com +film-blog.biz +filzmail.com +findemail.info +findu.pl +finews.biz +fir.hk +firemailbox.club +fitnesrezink.ru +fivemail.de +fixmail.tk +fizmail.com +fleckens.hu +flemail.ru +flowu.com +flu.cc +fluidsoft.us +flurred.com +fly-ts.de +flyinggeek.net +flyspam.com +foobarbot.net +footard.com +foreastate.com +forecastertests.com +foreskin.cf +foreskin.ga +foreskin.gq +foreskin.ml +foreskin.tk +forgetmail.com +fornow.eu +forspam.net +forward.cat +fosil.pro +foxja.com +foxtrotter.info +fr.cr +fr.nf +fr33mail.info +fragolina2.tk +frapmail.com +frappina.tk +free-email.cf +free-email.ga +free-temp.net +freebabysittercam.com +freeblackbootytube.com +freecat.net +freedom4you.info +freedompop.us +freefattymovies.com +freehotmail.net +freeinbox.email +freelance-france.eu +freeletter.me +freemail.ms +freemails.cf +freemails.ga +freemails.ml +freemeil.ga +freemeil.gq +freemeil.ml +freeml.net +freeplumpervideos.com +freerubli.ru +freeschoolgirlvids.com +freesistercam.com +freeteenbums.com +freundin.ru +friendlymail.co.uk +front14.org +frwdmail.com +ftp.sh +ftpinc.ca +fuckedupload.com +fuckingduh.com +fuckme69.club +fucknloveme.top +fuckxxme.top +fudgerub.com +fuirio.com +fukaru.com +fukurou.ch +fullangle.org +fulvie.com +fun64.com +funnycodesnippets.com +funnymail.de +furzauflunge.de +futuramind.com +fuwamofu.com +fuwari.be +fux0ringduh.com +fxnxs.com +fyii.de +g14l71lb.com +g1xmail.top +g2xmail.top +g3xmail.top +g4hdrop.us +gafy.net +gage.ga +galaxy.tv +gally.jp +gamail.top +gamegregious.com +gamgling.com +garasikita.pw +garbagecollector.org +garbagemail.org +gardenscape.ca +garizo.com +garliclife.com +garrymccooey.com +gav0.com +gawab.com +gbcmail.win +gbmail.top +gcmail.top +gdmail.top +gedmail.win +geekforex.com +geew.ru +gehensiemirnichtaufdensack.de +geldwaschmaschine.de +gelitik.in +genderfuck.net +geronra.com +geschent.biz +get-mail.cf +get-mail.ga +get-mail.ml +get-mail.tk +get.pp.ua +get1mail.com +get2mail.fr +getairmail.cf +getairmail.com +getairmail.ga +getairmail.gq +getairmail.ml +getairmail.tk +geteit.com +getfun.men +getmails.eu +getnada.com +getnowtoday.cf +getonemail.com +getonemail.net +getover.de +getsimpleemail.com +gett.icu +gexik.com +ggmal.ml +ghosttexter.de +giacmosuaviet.info +giaiphapmuasam.com +giantmail.de +gifto12.com +ginzi.be +ginzi.co.uk +ginzi.es +ginzi.net +ginzy.co.uk +ginzy.eu +girlmail.win +girlsindetention.com +girlsundertheinfluence.com +gishpuppy.com +giveh2o.info +givememail.club +givmail.com +glitch.sx +globaltouron.com +glubex.com +glucosegrin.com +gmal.com +gmatch.org +gmial.com +gmx1mail.top +gmxmail.top +gmxmail.win +gnctr-calgary.com +go2usa.info +go2vpn.net +goemailgo.com +golemico.com +gomail.in +goonby.com +goplaygame.ru +gorillaswithdirtyarmpits.com +goround.info +gosuslugi-spravka.ru +gothere.biz +gotmail.com +gotmail.net +gotmail.org +gowikibooks.com +gowikicampus.com +gowikicars.com +gowikifilms.com +gowikigames.com +gowikimusic.com +gowikinetwork.com +gowikitravel.com +gowikitv.com +grandmamail.com +grandmasmail.com +great-host.in +greencafe24.com +greendike.com +greenhousemail.com +greensloth.com +greggamel.com +greggamel.net +gregorsky.zone +gregorygamel.com +gregorygamel.net +grish.de +griuc.schule +grn.cc +groupbuff.com +grr.la +grugrug.ru +gruz-m.ru +gs-arc.org +gsredcross.org +gsrv.co.uk +gsxstring.ga +gudanglowongan.com +guerillamail.biz +guerillamail.com +guerillamail.de +guerillamail.info +guerillamail.net +guerillamail.org +guerillamailblock.com +guerrillamail.biz +guerrillamail.com +guerrillamail.de +guerrillamail.info +guerrillamail.net +guerrillamail.org +guerrillamailblock.com +gufum.com +gustr.com +gxemail.men +gynzi.co.uk +gynzi.es +gynzy.at +gynzy.es +gynzy.eu +gynzy.gr +gynzy.info +gynzy.lt +gynzy.mobi +gynzy.pl +gynzy.ro +gynzy.sk +gzb.ro +h8s.org +habitue.net +hacccc.com +hackersquad.tk +hackthatbit.ch +hahawrong.com +haida-edu.cn +hairs24.ru +haltospam.com +hamham.uk +hangxomcuatoilatotoro.ml +happydomik.ru +harakirimail.com +haribu.com +hartbot.de +hasanmail.ml +hat-geld.de +hatespam.org +hawrong.com +haydoo.com +hazelnut4u.com +hazelnuts4u.com +hazmatshipping.org +hccmail.win +headstrong.de +heathenhammer.com +heathenhero.com +hecat.es +heisei.be +hellodream.mobi +helloricky.com +helpinghandtaxcenter.org +helpjobs.ru +heros3.com +herp.in +herpderp.nl +hezll.com +hi5.si +hiddentragedy.com +hidebox.org +hidebusiness.xyz +hidemail.de +hidemail.pro +hidemail.us +hidzz.com +highbros.org +hiltonvr.com +himail.online +hmail.us +hmamail.com +hmh.ro +hoanggiaanh.com +hoanglong.tech +hochsitze.com +hola.org +holl.ga +honeys.be +honor-8.com +hopemail.biz +hornyalwary.top +host1s.com +hostcalls.com +hostguru.top +hostingmail.me +hostlaba.com +hot-mail.cf +hot-mail.ga +hot-mail.gq +hot-mail.ml +hot-mail.tk +hotmai.com +hotmailproduct.com +hotmial.com +hotpop.com +hotprice.co +hotsoup.be +housat.com +hpc.tw +hs.vc +ht.cx +huangniu8.com +hukkmu.tk +hulapla.de +humaility.com +hungpackage.com +hushmail.cf +huskion.net +hvastudiesucces.nl +hwsye.net +i2pmail.org +i6.cloudns.cc +iaoss.com +ibnuh.bz +icantbelieveineedtoexplainthisshit.com +icemail.club +ichigo.me +icx.in +icx.ro +idx4.com +idxue.com +ieatspam.eu +ieatspam.info +ieh-mail.de +iencm.com +iffymedia.com +ige.es +igg.biz +ignoremail.com +ihateyoualot.info +ihazspam.ca +iheartspam.org +ikbenspamvrij.nl +illistnoise.com +ilovespam.com +imail1.net +imails.info +imailt.com +imgof.com +imgv.de +immo-gerance.info +imstations.com +imul.info +in-ulm.de +in2reach.com +inactivemachine.com +inbax.tk +inbound.plus +inbox.si +inbox2.info +inboxalias.com +inboxbear.com +inboxclean.com +inboxclean.org +inboxdesign.me +inboxed.im +inboxed.pw +inboxkitten.com +inboxproxy.com +inboxstore.me +inclusiveprogress.com +incognitomail.com +incognitomail.net +incognitomail.org +incq.com +ind.st +indieclad.com +indirect.ws +indomaed.pw +indomina.cf +indoserver.stream +indosukses.press +ineec.net +infocom.zp.ua +inggo.org +inkomail.com +inmynetwork.tk +inoutmail.de +inoutmail.eu +inoutmail.info +inoutmail.net +inpwa.com +insanumingeniumhomebrew.com +insorg-mail.info +instaddr.ch +instance-email.com +instant-mail.de +instantblingmail.info +instantemailaddress.com +instantmail.fr +internet-v-stavropole.ru +internetoftags.com +interstats.org +intersteller.com +intopwa.com +intopwa.net +intopwa.org +investore.co +iozak.com +ip4.pp.ua +ip6.li +ip6.pp.ua +ipoo.org +ippandansei.tk +ipsur.org +irabops.com +irc.so +irish2me.com +irishspringrealty.com +iroid.com +ironiebehindert.de +irssi.tv +is.af +isdaq.com +ishop2k.com +isosq.com +istii.ro +isukrainestillacountry.com +it7.ovh +italy-mail.com +itcompu.com +itfast.net +itunesgiftcodegenerator.com +iubridge.com +iuemail.men +iwi.net +ixaks.com +ixx.io +j-p.us +jafps.com +jajxz.com +janproz.com +jaqis.com +jdmadventures.com +jdz.ro +je-recycle.info +jellow.ml +jellyrolls.com +jeoce.com +jet-renovation.fr +jetable.com +jetable.net +jetable.org +jetable.pp.ua +jiooq.com +jmail.ovh +jmail.ro +jnxjn.com +jobbikszimpatizans.hu +jobbrett.com +jobposts.net +jobs-to-be-done.net +joelpet.com +joetestalot.com +jopho.com +joseihorumon.info +josse.ltd +jourrapide.com +jpco.org +jsrsolutions.com +jumonji.tk +jungkamushukum.com +junk.to +junk1e.com +junkmail.ga +junkmail.gq +just-email.com +justemail.ml +juyouxi.com +jwork.ru +kademen.com +kadokawa.cf +kadokawa.ga +kadokawa.gq +kadokawa.ml +kadokawa.tk +kaengu.ru +kagi.be +kakadua.net +kalapi.org +kamen-market.ru +kamsg.com +kaovo.com +kappala.info +kara-turk.net +karatraman.ml +kariplan.com +karta-kykyruza.ru +kartvelo.com +kasmail.com +kaspop.com +katztube.com +kazelink.ml +kbox.li +kcrw.de +keepmymail.com +keinhirn.de +keipino.de +kekita.com +kellychibale-researchgroup-uct.com +kemptvillebaseball.com +kennedy808.com +kiani.com +killmail.com +killmail.net +kimsdisk.com +kingsq.ga +kino-100.ru +kiois.com +kismail.ru +kisstwink.com +kitnastar.com +kjkszpjcompany.com +kkmail.be +kksm.be +klassmaster.com +klassmaster.net +klick-tipp.us +klipschx12.com +kloap.com +kludgemush.com +klzlk.com +kmail.li +kmhow.com +knol-power.nl +kobrandly.com +kommunity.biz +kon42.com +konultant-jurist.ru +kook.ml +kopagas.com +kopaka.net +korona-nedvizhimosti.ru +koshu.ru +kosmetik-obatkuat.com +kostenlosemailadresse.de +koszmail.pl +kpay.be +kpooa.com +kpost.be +krd.ag +krsw.tk +kruay.com +krypton.tk +ksmtrck.tk +kuhrap.com +kulmeo.com +kulturbetrieb.info +kurzepost.de +kutakbisajauhjauh.gq +kvhrr.com +kvhrs.com +kvhrw.com +kwift.net +kwilco.net +kyal.pl +kyois.com +kzccv.com +l-c-a.us +l33r.eu +l6factors.com +labetteraverouge.at +labworld.org +lacedmail.com +lackmail.net +lackmail.ru +lacto.info +lags.us +lain.ch +lak.pp.ua +lakelivingstonrealestate.com +lakqs.com +lamasticots.com +landmail.co +laoeq.com +larisia.com +larland.com +last-chance.pro +lastmail.co +lastmail.com +lawlita.com +lazyinbox.com +lazyinbox.us +ldaho.biz +ldop.com +ldtp.com +le-tim.ru +lee.mx +leeching.net +leetmail.co +legalrc.loan +lellno.gq +lenovog4.com +lerbhe.com +letmeinonthis.com +letthemeatspam.com +lez.se +lgxscreen.com +lhsdv.com +liamcyrus.com +lifebyfood.com +lifetimefriends.info +lifetotech.com +ligsb.com +lillemap.net +lilo.me +lindenbaumjapan.com +link2mail.net +linkedintuts2016.pw +linshiyouxiang.net +linuxmail.so +litedrop.com +liveradio.tk +lkgn.se +llogin.ru +loadby.us +loan101.pro +loaoa.com +loapq.com +locanto1.club +locantofuck.top +locantowsite.club +locomodev.net +login-email.cf +login-email.ga +login-email.ml +login-email.tk +logular.com +loh.pp.ua +loin.in +lolfreak.net +lolmail.biz +lookugly.com +lordsofts.com +lortemail.dk +losemymail.com +lovemeet.faith +lovemeleaveme.com +lpfmgmtltd.com +lr7.us +lr78.com +lroid.com +lru.me +ls-server.ru +lsyx24.com +luckymail.org +lukecarriere.com +lukemail.info +lukop.dk +luv2.us +lyfestylecreditsolutions.com +lyft.live +lyricspad.net +lzoaq.com +m21.cc +m4ilweb.info +maboard.com +mac-24.com +macr2.com +macromaid.com +macromice.info +magamail.com +maggotymeat.ga +magicbox.ro +magim.be +magspam.net +maidlow.info +mail-card.net +mail-easy.fr +mail-filter.com +mail-help.net +mail-hosting.co +mail-hub.info +mail-now.top +mail-owl.com +mail-share.com +mail-temporaire.com +mail-temporaire.fr +mail-tester.com +mail.by +mail.wtf +mail0.ga +mail1.top +mail114.net +mail1a.de +mail1web.org +mail21.cc +mail22.club +mail2rss.org +mail333.com +mail4trash.com +mail666.ru +mail7.io +mail707.com +mail72.com +mailapp.top +mailback.com +mailbidon.com +mailbiz.biz +mailblocks.com +mailbox.in.ua +mailbox52.ga +mailbox80.biz +mailbox82.biz +mailbox87.de +mailbox92.biz +mailboxy.fun +mailbucket.org +mailcat.biz +mailcatch.com +mailchop.com +mailcker.com +maildax.me +mailde.de +mailde.info +maildrop.cc +maildrop.cf +maildrop.ga +maildrop.gq +maildrop.ml +maildu.de +maildx.com +maileater.com +mailed.in +mailed.ro +maileimer.de +maileme101.com +mailexpire.com +mailf5.com +mailfa.tk +mailfall.com +mailfirst.icu +mailforspam.com +mailfree.ga +mailfree.gq +mailfree.ml +mailfreeonline.com +mailfs.com +mailguard.me +mailgutter.com +mailhazard.com +mailhazard.us +mailhex.com +mailhub.pro +mailhz.me +mailimate.com +mailin8r.com +mailinatar.com +mailinater.com +mailinator.co.uk +mailinator.com +mailinator.gq +mailinator.info +mailinator.net +mailinator.org +mailinator.us +mailinator0.com +mailinator1.com +mailinator2.com +mailinator2.net +mailinator3.com +mailinator4.com +mailinator5.com +mailinator6.com +mailinator7.com +mailinator8.com +mailinator9.com +mailincubator.com +mailismagic.com +mailita.tk +mailjunk.cf +mailjunk.ga +mailjunk.gq +mailjunk.ml +mailjunk.tk +mailmate.com +mailme.gq +mailme.ir +mailme.lv +mailme24.com +mailmetrash.com +mailmoat.com +mailmoth.com +mailms.com +mailna.biz +mailna.co +mailna.in +mailna.me +mailnator.com +mailnesia.com +mailnull.com +mailonaut.com +mailorc.com +mailorg.org +mailosaur.net +mailox.fun +mailpick.biz +mailpluss.com +mailpooch.com +mailpoof.com +mailpress.gq +mailproxsy.com +mailquack.com +mailrock.biz +mailsac.com +mailscrap.com +mailseal.de +mailshell.com +mailshiv.com +mailsiphon.com +mailslapping.com +mailslite.com +mailsucker.net +mailt.net +mailt.top +mailtechx.com +mailtemp.info +mailtemporaire.com +mailtemporaire.fr +mailto.plus +mailtome.de +mailtothis.com +mailtraps.com +mailtrash.net +mailtrix.net +mailtv.net +mailtv.tv +mailuniverse.co.uk +mailzi.ru +mailzilla.com +mailzilla.org +mainerfolg.info +makemenaughty.club +makemetheking.com +malahov.de +malayalamdtp.com +mama3.org +mamulenok.ru +mandraghen.cf +manifestgenerator.com +mannawo.com +mansiondev.com +manybrain.com +mark-compressoren.ru +marketlink.info +markmurfin.com +mask03.ru +masonline.info +maswae.world +matamuasu.ga +matchpol.net +matra.site +max-mail.org +mbox.re +mbx.cc +mcache.net +mciek.com +mdhc.tk +meantinc.com +mebelnu.info +mechanicalresumes.com +medkabinet-uzi.ru +meepsheep.eu +meidecn.com +meinspamschutz.de +meltedbrownies.com +meltmail.com +memsg.site +mentonit.net +mepost.pw +merry.pink +messagebeamer.de +messwiththebestdielikethe.rest +metadownload.org +metaintern.net +metalunits.com +mezimages.net +mfsa.info +mfsa.ru +mhzayt.online +miaferrari.com +miauj.com +midcoastcustoms.com +midcoastcustoms.net +midcoastsolutions.com +midcoastsolutions.net +midiharmonica.com +midlertidig.com +midlertidig.net +midlertidig.org +mierdamail.com +migmail.net +migmail.pl +migumail.com +mihep.com +mijnhva.nl +ministry-of-silly-walks.de +minsmail.com +mintemail.com +mirai.re +misterpinball.de +miucce.com +mji.ro +mjj.edu.ge +mjukglass.nu +mkpfilm.com +ml8.ca +mm.my +mm5.se +mnode.me +moakt.cc +moakt.co +moakt.com +moakt.ws +mobileninja.co.uk +mobilevpn.top +moburl.com +mockmyid.com +moeri.org +mofu.be +mohmal.com +mohmal.im +mohmal.in +mohmal.tech +moimoi.re +molms.com +momentics.ru +monachat.tk +monadi.ml +moneypipe.net +monumentmail.com +moonwake.com +moot.es +moreawesomethanyou.com +moreorcs.com +morriesworld.ml +morsin.com +moruzza.com +motique.de +mountainregionallibrary.net +mox.pp.ua +moy-elektrik.ru +moza.pl +mozej.com +mp-j.ga +mr24.co +mrvpm.net +mrvpt.com +msgos.com +mspeciosa.com +msrc.ml +mswork.ru +msxd.com +mt2009.com +mt2014.com +mt2015.com +mtmdev.com +muathegame.com +muchomail.com +mucincanon.com +muehlacker.tk +muell.icu +muell.monster +muell.xyz +muellemail.com +muellmail.com +munoubengoshi.gq +musiccode.me +mutant.me +mvrht.com +mvrht.net +mwarner.org +mxclip.com +mxfuel.com +my-pomsies.ru +my-teddyy.ru +my10minutemail.com +mybitti.de +mycleaninbox.net +mycorneroftheinter.net +myde.ml +mydefipet.live +mydemo.equipment +myecho.es +myemailboxy.com +mygeoweb.info +myindohome.services +myinterserver.ml +mykickassideas.com +mymail-in.net +mymail90.com +mymailoasis.com +mynetstore.de +myopang.com +mypacks.net +mypartyclip.de +myphantomemail.com +mysamp.de +myspaceinc.com +myspaceinc.net +myspaceinc.org +myspacepimpedup.com +myspamless.com +mystvpn.com +mysugartime.ru +mytemp.email +mytempemail.com +mytempmail.com +mytrashmail.com +mywarnernet.net +mywrld.site +mywrld.top +myzx.com +mzico.com +n1nja.org +na-cat.com +nabuma.com +nada.email +nada.ltd +nagi.be +nakedtruth.biz +nanonym.ch +naslazhdai.ru +nationalgardeningclub.com +nawmin.info +nbzmr.com +negated.com +neko2.net +nekochan.fr +neomailbox.com +neotlozhniy-zaim.ru +nepwk.com +nervmich.net +nervtmich.net +net1mail.com +netcom.ws +netmails.com +netmails.net +netricity.nl +netris.net +netviewer-france.com +netzidiot.de +nevermail.de +newbpotato.tk +newfilm24.ru +newideasfornewpeople.info +newmail.top +next.ovh +nextmail.info +nextstopvalhalla.com +nezdiro.org +nezid.com +nezumi.be +nezzart.com +nfast.net +nguyenusedcars.com +nh3.ro +nice-4u.com +nicknassar.com +nincsmail.com +nincsmail.hu +niseko.be +niwl.net +nm7.cc +nmail.cf +nnh.com +nnot.net +nnoway.ru +no-spam.ws +no-ux.com +noblepioneer.com +nobugmail.com +nobulk.com +nobuma.com +noclickemail.com +nodezine.com +nogmailspam.info +noicd.com +nokiamail.com +nolemail.ga +nomail.cf +nomail.ga +nomail.pw +nomail2me.com +nomorespamemails.com +nonspam.eu +nonspammer.de +nonze.ro +noref.in +norseforce.com +norwegischlernen.info +nospam4.us +nospamfor.us +nospamthanks.info +nothingtoseehere.ca +notif.me +notmailinator.com +notrnailinator.com +notsharingmy.info +now.im +nowhere.org +nowmymail.com +nowmymail.net +nproxi.com +nthrl.com +ntlhelp.net +nubescontrol.com +nullbox.info +nurfuerspam.de +nut.cc +nutpa.net +nuts2trade.com +nvhrw.com +nwldx.com +nwytg.com +nwytg.net +ny7.me +nypato.com +nyrmusic.com +o2stk.org +o7i.net +oalsp.com +obfusko.com +objectmail.com +obobbo.com +oborudovanieizturcii.ru +obxpestcontrol.com +octovie.com +odaymail.com +odem.com +odnorazovoe.ru +oepia.com +oerpub.org +offshore-proxies.net +ohaaa.de +ohi.tw +oida.icu +oing.cf +okclprojects.com +okinawa.li +okrent.us +okzk.com +olimp-case.ru +olypmall.ru +omail.pro +omnievents.org +omtecha.com +one-mail.top +one-time.email +one2mail.info +onekisspresave.com +onemail.host +oneoffemail.com +oneoffmail.com +onetm.jp +onewaymail.com +onlatedotcom.info +online.ms +onlineidea.info +onqin.com +ontyne.biz +oohioo.com +oolus.com +oonies-shoprus.ru +oopi.org +oosln.com +opayq.com +openavz.com +opendns.ro +opentrash.com +opmmedia.ga +opp24.com +optimaweb.me +opwebw.com +oranek.com +ordinaryamerican.net +oreidresume.com +orgmbx.cc +oroki.de +oshietechan.link +otherinbox.com +ourklips.com +ourpreviewdomain.com +outlawspam.com +outmail.win +ovomail.co +ovpn.to +owleyes.ch +owlpic.com +ownsyou.de +oxopoha.com +ozyl.de +p-banlis.ru +p33.org +p71ce1m.com +pa9e.com +pachilly.com +packiu.com +pagamenti.tk +paharpurmim.ga +pakadebu.ga +pamaweb.com +pancakemail.com +papierkorb.me +paplease.com +para2019.ru +parlimentpetitioner.tk +pastebitch.com +patonce.com +pavilionx2.com +payperex2.com +payspun.com +pe.hu +pecinan.com +pecinan.net +pecinan.org +penisgoes.in +penoto.tk +pepbot.com +peterdethier.com +petloca.com +petrzilka.net +pewpewpewpew.pw +pfui.ru +phone-elkey.ru +photo-impact.eu +photomark.net +pi.vu +piaa.me +pig.pp.ua +pii.at +piki.si +pimpedupmyspace.com +pinehill-seattle.org +pingir.com +pipemail.space +pisls.com +pitaniezdorovie.ru +pivo-bar.ru +pixiil.com +pjjkp.com +placebomail10.com +pleasenoham.org +plexfirm.com +plexolan.de +plhk.ru +ploae.com +plw.me +poehali-otdihat.ru +pojok.ml +pokemail.net +pokiemobile.com +polarkingxx.ml +politikerclub.de +polyfaust.net +pooae.com +poofy.org +pookmail.com +poopiebutt.club +popcornfarm7.com +popcornfly.com +popesodomy.com +popgx.com +porjoton.com +porsh.net +posdz.com +posta.store +postacin.com +postonline.me +poutineyourface.com +powered.name +powerencry.com +powlearn.com +pp7rvv.com +ppetw.com +pptrvv.com +pqoia.com +pratikmail.com +pratikmail.net +pratikmail.org +prazdnik-37.ru +predatorrat.cf +predatorrat.ga +predatorrat.gq +predatorrat.ml +predatorrat.tk +premium-mail.fr +primabananen.net +prin.be +privacy.net +privatdemail.net +privy-mail.com +privy-mail.de +privymail.de +pro-tag.org +pro5g.com +procrackers.com +profast.top +projectcl.com +promailt.com +proprietativalcea.ro +propscore.com +protempmail.com +proxymail.eu +proxyparking.com +prtnx.com +prtshr.com +prtz.eu +psh.me +psles.com +psnator.com +psoxs.com +puglieisi.com +puji.pro +punkass.com +puppetmail.de +purcell.email +purelogistics.org +put2.net +puttanamaiala.tk +putthisinyourspamdatabase.com +pwrby.com +qasti.com +qbfree.us +qc.to +qibl.at +qiott.com +qipmail.net +qiq.us +qisdo.com +qisoa.com +qmrbe.com +qoika.com +qopow.com +qq.my +qsl.ro +qtum-ico.com +quadrafit.com +quick-mail.cc +quickemail.info +quickinbox.com +quickmail.nl +quicksend.ch +ququb.com +qvy.me +qwickmail.com +r4nd0m.de +ra3.us +rabin.ca +rabiot.reisen +rackabzar.com +raetp9.com +rainbowly.ml +raketenmann.de +rancidhome.net +randomail.io +randomail.net +rapt.be +raqid.com +rax.la +raxtest.com +razemail.com +razuz.com +rbb.org +rcasd.com +rcpt.at +rdklcrv.xyz +re-gister.com +reality-concept.club +reallymymail.com +realtyalerts.ca +rebates.stream +receiveee.com +recipeforfailure.com +recode.me +reconmail.com +recyclemail.dk +redfeathercrow.com +reftoken.net +regbypass.com +regspaces.tk +reimondo.com +rejectmail.com +rejo.technology +reliable-mail.com +remail.cf +remail.ga +remarkable.rocks +remote.li +reptilegenetics.com +resgedvgfed.tk +revolvingdoorhoax.org +rfc822.org +rhyta.com +richfinances.pw +riddermark.de +rifkian.ga +rippb.com +risingsuntouch.com +riski.cf +rklips.com +rkomo.com +rm2rf.com +rma.ec +rmqkr.net +rnailinator.com +ro.lt +robertspcrepair.com +robot-mail.com +rollindo.agency +ronnierage.net +rootfest.net +rosebearmylove.ru +rotaniliam.com +rover.info +rowe-solutions.com +royal.net +royaldoodles.org +royalmarket.life +royandk.com +rppkn.com +rsvhr.com +rtrtr.com +rtskiya.xyz +rudymail.ml +rumgel.com +runi.ca +rupayamail.com +ruru.be +rustydoor.com +rvb.ro +ryteto.me +s0ny.net +s33db0x.com +sabrestlouis.com +sackboii.com +saeoil.com +safaat.cf +safermail.info +safersignup.de +safetymail.info +safetypost.de +saharanightstempe.com +salmeow.tk +samsclass.info +sandcars.net +sandelf.de +sandwhichvideo.com +sanfinder.com +sanim.net +sanstr.com +sast.ro +satisfyme.club +satukosong.com +sausen.com +saynotospams.com +scatmail.com +scay.net +schachrol.com +schafmail.de +schmeissweg.tk +schrott-email.de +scrsot.com +sd3.in +sdvft.com +sdvgeft.com +sdvrecft.com +secmail.pw +secretemail.de +secure-mail.biz +secure-mail.cc +secured-link.net +securehost.com.es +seekapps.com +seekjobs4u.com +sejaa.lv +selfdestructingmail.com +selfdestructingmail.org +send22u.info +sendfree.org +sendingspecialflyers.com +sendnow.win +sendspamhere.com +senseless-entertainment.com +server.ms +services391.com +sexforswingers.com +sexical.com +sexyalwasmi.top +shadap.org +shalar.net +sharedmailbox.org +sharklasers.com +sheryli.com +shhmail.com +shhuut.org +shieldedmail.com +shieldemail.com +shiftmail.com +shipfromto.com +shiphazmat.org +shipping-regulations.com +shippingterms.org +shitaway.tk +shitmail.de +shitmail.me +shitmail.org +shmeriously.com +shopxda.com +shortmail.net +shotmail.ru +showslow.de +shrib.com +shut.name +shut.ws +siberpay.com +sidelka-mytischi.ru +siftportal.ru +sify.com +sika3.com +sikux.com +siliwangi.ga +silvercoin.life +sim-simka.ru +simaenaga.com +simpleitsecurity.info +sin.cl +sinaite.net +sinema.ml +sinfiltro.cl +singlespride.com +sinnlos-mail.de +sino.tw +siteposter.net +sizzlemctwizzle.com +sjuaq.com +skeefmail.com +skrx.tk +sky-inbox.com +sky-ts.de +skyrt.de +slapsfromlastnight.com +slaskpost.se +slave-auctions.net +slippery.email +slipry.net +slopsbox.com +slothmail.net +slushmail.com +sluteen.com +sly.io +smallker.tk +smapfree24.com +smapfree24.de +smapfree24.eu +smapfree24.info +smapfree24.org +smartnator.com +smarttalent.pw +smashmail.de +smellfear.com +smellrear.com +smellypotato.tk +smtp99.com +smwg.info +snakemail.com +snapwet.com +sneakmail.de +snece.com +social-mailer.tk +socialfurry.org +sofia.re +sofimail.com +sofort-mail.de +sofortmail.de +sofrge.com +softkey-office.ru +softpls.asia +sogetthis.com +sohai.ml +sohus.cn +soioa.com +soisz.com +solar-impact.pro +solvemail.info +solventtrap.wiki +songsign.com +sonshi.cf +soodmail.com +soodomail.com +soodonims.com +soombo.com +soon.it +spacebazzar.ru +spam-be-gone.com +spam.care +spam.la +spam.org.es +spam.su +spam4.me +spamail.de +spamarrest.com +spamavert.com +spambob.com +spambob.net +spambob.org +spambog.com +spambog.de +spambog.net +spambog.ru +spambooger.com +spambox.info +spambox.me +spambox.org +spambox.us +spamcero.com +spamcon.org +spamcorptastic.com +spamcowboy.com +spamcowboy.net +spamcowboy.org +spamday.com +spamdecoy.net +spamex.com +spamfighter.cf +spamfighter.ga +spamfighter.gq +spamfighter.ml +spamfighter.tk +spamfree.eu +spamfree24.com +spamfree24.de +spamfree24.eu +spamfree24.info +spamfree24.net +spamfree24.org +spamgoes.in +spamherelots.com +spamhereplease.com +spamhole.com +spamify.com +spaminator.de +spamkill.info +spaml.com +spaml.de +spamlot.net +spammer.fail +spammotel.com +spammy.host +spamobox.com +spamoff.de +spamsalad.in +spamslicer.com +spamsphere.com +spamspot.com +spamstack.net +spamthis.co.uk +spamthis.network +spamthisplease.com +spamtrail.com +spamtrap.ro +spamtroll.net +spamwc.cf +spamwc.ga +spamwc.gq +spamwc.ml +speedgaus.net +sperma.cf +spikio.com +spindl-e.com +spoofmail.de +spr.io +spritzzone.de +spruzme.com +spybox.de +spymail.com +squizzy.de +squizzy.net +sroff.com +sry.li +ssoia.com +stanfordujjain.com +starlight-breaker.net +starpower.space +startfu.com +startkeys.com +statdvr.com +stathost.net +statiix.com +stayhome.li +steam-area.ru +steambot.net +stexsy.com +stinkefinger.net +stop-my-spam.cf +stop-my-spam.com +stop-my-spam.ga +stop-my-spam.ml +stop-my-spam.pp.ua +stop-my-spam.tk +stopspam.app +storiqax.top +storj99.com +storj99.top +streetwisemail.com +stromox.com +stuckmail.com +stuffmail.de +stumpfwerk.com +stylist-volos.ru +submic.com +suburbanthug.com +suckmyd.com +sueshaw.com +suexamplesb.com +suioe.com +super-auswahl.de +supergreatmail.com +supermailer.jp +superplatyna.com +superrito.com +supersave.net +superstachel.de +superyp.com +suremail.info +sute.jp +svip520.cn +svk.jp +svxr.org +sweetpotato.ml +sweetxxx.de +swift-mail.net +swift10minutemail.com +syinxun.com +sylvannet.com +symphonyresume.com +syosetu.gq +syujob.accountants +szerz.com +tafmail.com +tafoi.gr +taglead.com +tagmymedia.com +tagyourself.com +talkinator.com +tanukis.org +tapchicuoihoi.com +taphear.com +tapi.re +tarzanmail.cf +tastrg.com +taukah.com +tb-on-line.net +tcwlm.com +tcwlx.com +tdtda.com +tech69.com +techblast.ch +techemail.com +techgroup.me +technoproxy.ru +teerest.com +teewars.org +tefl.ro +telecomix.pl +teleg.eu +teleworm.com +teleworm.us +tellos.xyz +teml.net +temp-link.net +temp-mail.com +temp-mail.de +temp-mail.org +temp-mail.pp.ua +temp-mail.ru +temp-mails.com +tempail.com +tempalias.com +tempe-mail.com +tempemail.biz +tempemail.co.za +tempemail.com +tempemail.net +tempinbox.co.uk +tempinbox.com +tempmail.cn +tempmail.co +tempmail.de +tempmail.eu +tempmail.it +tempmail.pp.ua +tempmail.us +tempmail.ws +tempmail2.com +tempmaildemo.com +tempmailer.com +tempmailer.de +tempmailer.net +tempmailo.com +tempomail.fr +tempomail.org +temporarily.de +temporarioemail.com.br +temporary-mail.net +temporaryemail.net +temporaryemail.us +temporaryforwarding.com +temporaryinbox.com +temporarymailaddress.com +tempr.email +tempsky.com +tempthe.net +tempymail.com +tensi.org +ternaklele.ga +testore.co +testudine.com +thanksnospam.info +thankyou2010.com +thatim.info +thc.st +theaviors.com +thebearshark.com +thecarinformation.com +thechildrensfocus.com +thecity.biz +thecloudindex.com +thediamants.org +thedirhq.info +theeyeoftruth.com +thejoker5.com +thelightningmail.net +thelimestones.com +thembones.com.au +themegreview.com +themostemail.com +thereddoors.online +theroyalweb.club +thescrappermovie.com +theteastory.info +thex.ro +thichanthit.com +thietbivanphong.asia +thisisnotmyrealemail.com +thismail.net +thisurl.website +thnikka.com +thoas.ru +thraml.com +thrma.com +throam.com +thrott.com +throwam.com +throwawayemailaddress.com +throwawaymail.com +throwawaymail.pp.ua +throya.com +thrubay.com +thunderbolt.science +thunkinator.org +thxmate.com +tiapz.com +tic.ec +tilien.com +timgiarevn.com +timkassouf.com +tinoza.org +tinyurl24.com +tipsb.com +tittbit.in +tiv.cc +tizi.com +tkitc.de +tlpn.org +tmail.com +tmail.ws +tmailinator.com +tmails.net +tmmbt.net +tmpbox.net +tmpemails.com +tmpeml.com +tmpeml.info +tmpjr.me +tmpmail.net +tmpmail.org +tmpx.sa.com +toddsbighug.com +tofeat.com +toiea.com +tokem.co +tokenmail.de +tonaeto.com +tonne.to +tonymanso.com +toomail.biz +toon.ml +top-shop-tovar.ru +top101.de +top1mail.ru +top1post.ru +topinrock.cf +topmail2.com +topmail2.net +topofertasdehoy.com +topranklist.de +toprumours.com +tormail.org +toss.pw +tosunkaya.com +totallynotfake.net +totalvista.com +totesmail.com +totoan.info +tourcc.com +tp-qa-mail.com +tpwlb.com +tqoai.com +tqosi.com +tradermail.info +tranceversal.com +trash-amil.com +trash-mail.at +trash-mail.cf +trash-mail.com +trash-mail.de +trash-mail.ga +trash-mail.gq +trash-mail.ml +trash-mail.tk +trash-me.com +trash2009.com +trash2010.com +trash2011.com +trashcanmail.com +trashdevil.com +trashdevil.de +trashemail.de +trashemails.de +trashinbox.com +trashmail.at +trashmail.com +trashmail.de +trashmail.gq +trashmail.io +trashmail.me +trashmail.net +trashmail.org +trashmail.ws +trashmailer.com +trashmailgenerator.de +trashmails.com +trashymail.com +trashymail.net +trasz.com +trayna.com +trbvm.com +trbvn.com +trbvo.com +trend-maker.ru +trgfu.com +trgovinanaveliko.info +trialmail.de +trickmail.net +trillianpro.com +triots.com +trixtrux1.ru +trollproject.com +tropicalbass.info +trungtamtoeic.com +truthfinderlogin.com +tryalert.com +tryninja.io +tryzoe.com +ttirv.org +ttszuo.xyz +tualias.com +tuofs.com +turoid.com +turual.com +turuma.com +tutuapp.bid +tvchd.com +tverya.com +twinmail.de +twkly.ml +twocowmail.net +twoweirdtricks.com +twzhhq.online +txen.de +txtadvertise.com +tyhe.ro +tyldd.com +tympe.net +uacro.com +uber-mail.com +ubismail.net +ubm.md +ucche.us +ucupdong.ml +uemail99.com +ufacturing.com +uggsrock.com +uguuchantele.com +uhe2.com +uhhu.ru +uiu.us +ujijima1129.gq +uk.to +ultra.fyi +ultrada.ru +uma3.be +umail.net +undo.it +unicodeworld.com +unids.com +unimark.org +unit7lahaina.com +unmail.ru +uooos.com +upliftnow.com +uplipht.com +uploadnolimit.com +upozowac.info +urfunktion.se +urhen.com +uroid.com +us.af +us.to +usa.cc +usako.net +usbc.be +used-product.fr +ushijima1129.cf +ushijima1129.ga +ushijima1129.gq +ushijima1129.ml +ushijima1129.tk +utiket.us +uu.gl +uu2.ovh +uuf.me +uwork4.us +uyhip.com +vaasfc4.tk +vaati.org +valemail.net +valhalladev.com +vankin.de +vctel.com +vda.ro +vddaz.com +vdig.com +veanlo.com +vemomail.win +venompen.com +veo.kr +ver0.cf +ver0.ga +ver0.gq +ver0.ml +ver0.tk +vercelli.cf +vercelli.ga +vercelli.gq +vercelli.ml +verdejo.com +vermutlich.net +veryday.ch +veryday.eu +veryday.info +veryrealemail.com +vesa.pw +vevs.de +vfemail.net +via.tokyo.jp +vickaentb.tk +victime.ninja +victoriantwins.com +vidchart.com +viditag.com +viewcastmedia.com +viewcastmedia.net +viewcastmedia.org +vikingsonly.com +vinernet.com +vintomaper.com +vipepe.com +vipmail.name +vipmail.pw +vipxm.net +viralplays.com +virtualemail.info +visal007.tk +visal168.cf +visal168.ga +visal168.gq +visal168.ml +visal168.tk +vixletdev.com +vixtricks.com +vkcode.ru +vmailing.info +vmani.com +vmpanda.com +vnedu.me +voidbay.com +volaj.com +voltaer.com +vomoto.com +vorga.org +votiputox.org +voxelcore.com +vpn.st +vps30.com +vps911.net +vradportal.com +vremonte24-store.ru +vrmtr.com +vsimcard.com +vssms.com +vtxmail.us +vubby.com +vuiy.pw +vusra.com +vztc.com +w-asertun.ru +w3internet.co.uk +wakingupesther.com +walala.org +walkmail.net +walkmail.ru +wallm.com +wanko.be +watch-harry-potter.com +watchever.biz +watchfull.net +watchironman3onlinefreefullmovie.com +wazabi.club +wbdev.tech +wbml.net +web-contact.info +web-ideal.fr +web-inc.net +web-mail.pp.ua +web2mailco.com +webcontact-france.eu +webemail.me +webhook.site +webm4il.info +webmail24.top +webtrip.ch +webuser.in +wee.my +wef.gr +weg-werf-email.de +wegwerf-email-addressen.de +wegwerf-email-adressen.de +wegwerf-email.at +wegwerf-email.de +wegwerf-email.net +wegwerf-emails.de +wegwerfadresse.de +wegwerfemail.com +wegwerfemail.de +wegwerfemail.info +wegwerfemail.net +wegwerfemail.org +wegwerfemailadresse.com +wegwerfmail.de +wegwerfmail.info +wegwerfmail.net +wegwerfmail.org +wegwerpmailadres.nl +wegwrfmail.de +wegwrfmail.net +wegwrfmail.org +wekawa.com +welikecookies.com +wellsfargocomcardholders.com +wemel.top +wetrainbayarea.com +wetrainbayarea.org +wfgdfhj.tk +wg0.com +wh4f.org +whatiaas.com +whatifanalytics.com +whatpaas.com +whatsaas.com +whiffles.org +whopy.com +whyspam.me +wibblesmith.com +wickmail.net +widaryanto.info +widget.gg +wierie.tk +wifimaple.com +wifioak.com +wikidocuslava.ru +wilemail.com +willhackforfood.biz +willselfdestruct.com +wimsg.com +winemaven.info +wins.com.br +wlist.ro +wmail.cf +wmail.club +wokcy.com +wolfmail.ml +wolfsmail.tk +wollan.info +worldspace.link +wpdork.com +wpg.im +wralawfirm.com +writeme.us +wronghead.com +ws.gy +wsym.de +wudet.men +wuespdj.xyz +wupics.com +wuuvo.com +wuzup.net +wuzupmail.net +wwjmp.com +wwwnew.eu +wxnw.net +x24.com +xagloo.co +xagloo.com +xbaby69.top +xcode.ro +xcodes.net +xcompress.com +xcoxc.com +xcpy.com +xemaps.com +xemne.com +xents.com +xjoi.com +xkx.me +xl.cx +xmail.com +xmailer.be +xmaily.com +xn--9kq967o.com +xn--d-bga.net +xojxe.com +xost.us +xoxox.cc +xperiae5.com +xrap.de +xrho.com +xvx.us +xwaretech.com +xwaretech.info +xwaretech.net +xww.ro +xxhamsterxx.ga +xxi2.com +xxlocanto.us +xxolocanto.us +xxqx3802.com +xy9ce.tk +xyzfree.net +xzsok.com +yabai-oppai.tk +yahmail.top +yahooproduct.net +yamail.win +yanet.me +yannmail.win +yapped.net +yaqp.com +yarnpedia.ga +ycare.de +ycn.ro +ye.vc +yedi.org +yeezus.ru +yep.it +yermail.net +yhg.biz +ynmrealty.com +yodx.ro +yogamaven.com +yoggm.com +yomail.info +yoo.ro +yopmail.com +yopmail.fr +yopmail.gq +yopmail.net +yopmail.pp.ua +yordanmail.cf +you-spam.com +yougotgoated.com +youmail.ga +youmailr.com +youneedmore.info +youpymail.com +yourdomain.com +youremail.cf +yourewronghereswhy.com +yourlms.biz +yourspamgoesto.space +yourtube.ml +yroid.com +yspend.com +ytpayy.com +yugasandrika.com +yui.it +yuoia.com +yuurok.com +yxzx.net +yyolf.net +z-o-e-v-a.ru +z0d.eu +z1p.biz +z86.ru +zain.site +zainmax.net +zaktouni.fr +zarabotokdoma11.ru +zasod.com +zaym-zaym.ru +zcrcd.com +zdenka.net +ze.tc +zebins.com +zebins.eu +zehnminuten.de +zehnminutenmail.de +zepp.dk +zetmail.com +zfymail.com +zhaoqian.ninja +zhaoyuanedu.cn +zhcne.com +zhewei88.com +zhorachu.com +zik.dj +zipcad.com +zipo1.gq +zippymail.info +zipsendtest.com +zoaxe.com +zoemail.com +zoemail.net +zoemail.org +zoetropes.org +zombie-hive.com +zomg.info +zsero.com +zumpul.com +zv68.com +zxcv.com +zxcvbnm.com +zymuying.com +zzi.us +zzrgg.com +zzz.com \ No newline at end of file diff --git a/backend/src/helpers/auth.ts b/backend/src/helpers/auth.ts index 177df8ad8..ce61f3650 100644 --- a/backend/src/helpers/auth.ts +++ b/backend/src/helpers/auth.ts @@ -6,7 +6,9 @@ import { User, ServiceTokenData, ServiceAccount, - APIKeyData + APIKeyData, + TokenVersion, + ITokenVersion } from '../models'; import { AccountNotFoundError, @@ -35,7 +37,7 @@ import { * @param {Object} obj * @param {Object} obj.headers - HTTP request headers object */ -const validateAuthMode = ({ +export const validateAuthMode = ({ headers, acceptedAuthModes }: { @@ -97,7 +99,7 @@ const validateAuthMode = ({ * @param {String} obj.authTokenValue - JWT token value * @returns {User} user - user corresponding to JWT token */ -const getAuthUserPayload = async ({ +export const getAuthUserPayload = async ({ authTokenValue }: { authTokenValue: string; @@ -107,14 +109,32 @@ const getAuthUserPayload = async ({ ); const user = await User.findOne({ - _id: decodedToken.userId - }).select('+publicKey'); + _id: new Types.ObjectId(decodedToken.userId) + }).select('+publicKey +accessVersion'); - if (!user) throw AccountNotFoundError({ message: 'Failed to find User' }); + if (!user) throw AccountNotFoundError({ message: 'Failed to find user' }); - if (!user?.publicKey) throw UnauthorizedRequestError({ message: 'Failed to authenticate User with partially set up account' }); + if (!user?.publicKey) throw UnauthorizedRequestError({ message: 'Failed to authenticate user with partially set up account' }); - return user; + const tokenVersion = await TokenVersion.findOneAndUpdate({ + _id: new Types.ObjectId(decodedToken.tokenVersionId), + user: user._id + }, { + lastUsed: new Date() + }); + + if (!tokenVersion) throw UnauthorizedRequestError({ + message: 'Failed to validate access token' + }); + + if (decodedToken.accessVersion !== tokenVersion.accessVersion) throw UnauthorizedRequestError({ + message: 'Failed to validate access token' + }); + + return ({ + user, + tokenVersionId: tokenVersion._id + }); } /** @@ -123,7 +143,7 @@ const getAuthUserPayload = async ({ * @param {String} obj.authTokenValue - service token value * @returns {ServiceTokenData} serviceTokenData - service token data */ -const getAuthSTDPayload = async ({ +export const getAuthSTDPayload = async ({ authTokenValue }: { authTokenValue: string; @@ -169,7 +189,7 @@ const getAuthSTDPayload = async ({ * @param {String} obj.authTokenValue - service account access token value * @returns {ServiceAccount} serviceAccount */ -const getAuthSAAKPayload = async ({ +export const getAuthSAAKPayload = async ({ authTokenValue }: { authTokenValue: string; @@ -198,7 +218,7 @@ const getAuthSAAKPayload = async ({ * @param {String} obj.authTokenValue - API key value * @returns {APIKeyData} apiKeyData - API key data */ -const getAuthAPIKeyPayload = async ({ +export const getAuthAPIKeyPayload = async ({ authTokenValue }: { authTokenValue: string; @@ -255,12 +275,43 @@ const getAuthAPIKeyPayload = async ({ * @return {String} obj.token - issued JWT token * @return {String} obj.refreshToken - issued refresh token */ -const issueAuthTokens = async ({ userId }: { userId: string }) => { +export const issueAuthTokens = async ({ + userId, + ip, + userAgent +}: { + userId: Types.ObjectId; + ip: string; + userAgent: string; +}) => { + let tokenVersion: ITokenVersion | null; + + // continue with (session) token version matching existing ip and user agent + tokenVersion = await TokenVersion.findOne({ + user: userId, + ip, + userAgent + }); + + if (!tokenVersion) { + // case: no existing ip and user agent exists + // -> create new (session) token version for ip and user agent + tokenVersion = await new TokenVersion({ + user: userId, + refreshVersion: 0, + accessVersion: 0, + ip, + userAgent, + lastUsed: new Date() + }).save(); + } // issue tokens const token = createToken({ payload: { - userId + userId, + tokenVersionId: tokenVersion._id.toString(), + accessVersion: tokenVersion.accessVersion }, expiresIn: await getJwtAuthLifetime(), secret: await getJwtAuthSecret() @@ -268,7 +319,9 @@ const issueAuthTokens = async ({ userId }: { userId: string }) => { const refreshToken = createToken({ payload: { - userId + userId, + tokenVersionId: tokenVersion._id.toString(), + refreshVersion: tokenVersion.refreshVersion }, expiresIn: await getJwtRefreshLifetime(), secret: await getJwtRefreshSecret() @@ -285,13 +338,15 @@ const issueAuthTokens = async ({ userId }: { userId: string }) => { * @param {Object} obj * @param {String} obj.userId - id of user whose tokens are cleared. */ -const clearTokens = async ({ userId }: { userId: string }): Promise => { +export const clearTokens = async (tokenVersionId: Types.ObjectId): Promise => { // increment refreshVersion on user by 1 - User.findOneAndUpdate({ - _id: userId + + await TokenVersion.findOneAndUpdate({ + _id: tokenVersionId }, { $inc: { - refreshVersion: 1 + refreshVersion: 1, + accessVersion: 1 } }); }; @@ -304,7 +359,7 @@ const clearTokens = async ({ userId }: { userId: string }): Promise => { * @param {String} obj.secret - (JWT) secret such as [JWT_AUTH_SECRET] * @param {String} obj.expiresIn - string describing time span such as '10h' or '7d' */ -const createToken = ({ +export const createToken = ({ payload, expiresIn, secret @@ -318,7 +373,7 @@ const createToken = ({ }); }; -const validateProviderAuthToken = async ({ +export const validateProviderAuthToken = async ({ email, user, providerAuthToken, @@ -341,16 +396,4 @@ const validateProviderAuthToken = async ({ ) { throw new Error('Invalid authentication credentials.') } -} - -export { - validateAuthMode, - validateProviderAuthToken, - getAuthUserPayload, - getAuthSTDPayload, - getAuthSAAKPayload, - getAuthAPIKeyPayload, - createToken, - issueAuthTokens, - clearTokens -}; +} \ No newline at end of file diff --git a/backend/src/helpers/bot.ts b/backend/src/helpers/bot.ts index 04dfd7e36..e93ab6a8b 100644 --- a/backend/src/helpers/bot.ts +++ b/backend/src/helpers/bot.ts @@ -31,7 +31,7 @@ import { InternalServerError } from "../utils/errors"; * @param {String} obj.name - name of bot * @param {String} obj.workspaceId - id of workspace that bot belongs to */ -const createBot = async ({ +export const createBot = async ({ name, workspaceId, }: { @@ -93,7 +93,7 @@ const createBot = async ({ * @param {String} obj.workspaceId - id of workspace * @param {String} obj.environment - environment */ -const getSecretsHelper = async ({ +export const getSecretsBotHelper = async ({ workspaceId, environment, }: { @@ -136,7 +136,7 @@ const getSecretsHelper = async ({ * @param {String} obj.workspaceId - id of workspace * @returns {String} key - decrypted workspace key */ -const getKey = async ({ workspaceId }: { workspaceId: string }) => { +export const getKey = async ({ workspaceId }: { workspaceId: string }) => { const encryptionKey = await getEncryptionKey(); const rootEncryptionKey = await getRootEncryptionKey(); @@ -194,7 +194,7 @@ const getKey = async ({ workspaceId }: { workspaceId: string }) => { * @param {String} obj1.workspaceId - id of workspace * @param {String} obj1.plaintext - plaintext to encrypt */ -const encryptSymmetricHelper = async ({ +export const encryptSymmetricHelper = async ({ workspaceId, plaintext, }: { @@ -222,7 +222,7 @@ const encryptSymmetricHelper = async ({ * @param {String} obj.iv - iv * @param {String} obj.tag - tag */ -const decryptSymmetricHelper = async ({ +export const decryptSymmetricHelper = async ({ workspaceId, ciphertext, iv, @@ -242,11 +242,4 @@ const decryptSymmetricHelper = async ({ }); return plaintext; -}; - -export { - createBot, - getSecretsHelper, - encryptSymmetricHelper, - decryptSymmetricHelper -}; +}; \ No newline at end of file diff --git a/backend/src/helpers/database.ts b/backend/src/helpers/database.ts index fa8c35155..b9284bbf8 100644 --- a/backend/src/helpers/database.ts +++ b/backend/src/helpers/database.ts @@ -7,7 +7,7 @@ import { getLogger } from '../utils/logger'; * @param {String} obj.mongoURL - mongo connection string * @returns */ -const initDatabaseHelper = async ({ +export const initDatabaseHelper = async ({ mongoURL }: { mongoURL: string; @@ -30,7 +30,7 @@ const initDatabaseHelper = async ({ /** * Close database conection */ -const closeDatabaseHelper = async () => { +export const closeDatabaseHelper = async () => { return Promise.all([ new Promise((resolve) => { if (mongoose.connection && mongoose.connection.readyState == 1) { @@ -41,9 +41,4 @@ const closeDatabaseHelper = async () => { } }) ]); -} - -export { - initDatabaseHelper, - closeDatabaseHelper } \ No newline at end of file diff --git a/backend/src/helpers/event.ts b/backend/src/helpers/event.ts index c58da5b70..47c243749 100644 --- a/backend/src/helpers/event.ts +++ b/backend/src/helpers/event.ts @@ -18,7 +18,7 @@ interface Event { * @param {String} obj.event.workspaceId - id of workspace that event is part of * @param {Object} obj.event.payload - payload of event (depends on event) */ -const handleEventHelper = async ({ event }: { event: Event }) => { +export const handleEventHelper = async ({ event }: { event: Event }) => { const { workspaceId, environment } = event; // TODO: moduralize bot check into separate function @@ -37,6 +37,4 @@ const handleEventHelper = async ({ event }: { event: Event }) => { }); break; } -}; - -export { handleEventHelper }; +}; \ No newline at end of file diff --git a/backend/src/helpers/index.ts b/backend/src/helpers/index.ts new file mode 100644 index 000000000..b9d85f871 --- /dev/null +++ b/backend/src/helpers/index.ts @@ -0,0 +1,17 @@ +export * from './auth'; +export * from './bot'; +export * from './database'; +export * from './event'; +export * from './integration'; +export * from './key'; +export * from './membership'; +export * from './membershipOrg'; +export * from './nodemailer'; +export * from './organization'; +export * from './rateLimiter'; +export * from './secret'; +export * from './secrets'; +export * from './signup'; +export * from './token'; +export * from './user'; +export * from './workspace'; \ No newline at end of file diff --git a/backend/src/helpers/integration.ts b/backend/src/helpers/integration.ts index 90f8b8bdb..b6f4b0915 100644 --- a/backend/src/helpers/integration.ts +++ b/backend/src/helpers/integration.ts @@ -15,7 +15,6 @@ import { import { UnauthorizedRequestError, } from '../utils/errors'; -import RequestError from '../utils/requestError'; interface Update { workspace: string; @@ -36,7 +35,7 @@ interface Update { * @param {String} obj.code - code * @returns {IntegrationAuth} integrationAuth - integration auth after OAuth2 code-token exchange */ -const handleOAuthExchangeHelper = async ({ +export const handleOAuthExchangeHelper = async ({ workspaceId, integration, code, @@ -110,7 +109,7 @@ const handleOAuthExchangeHelper = async ({ * @param {Object} obj * @param {Object} obj.workspaceId - id of workspace */ -const syncIntegrationsHelper = async ({ +export const syncIntegrationsHelper = async ({ workspaceId, environment }: { @@ -162,7 +161,7 @@ const syncIntegrationsHelper = async ({ * @param {String} obj.integrationAuthId - id of integration auth * @param {String} refreshToken - decrypted refresh token */ - const getIntegrationAuthRefreshHelper = async ({ integrationAuthId }: { integrationAuthId: Types.ObjectId }) => { +export const getIntegrationAuthRefreshHelper = async ({ integrationAuthId }: { integrationAuthId: Types.ObjectId }) => { const integrationAuth = await IntegrationAuth .findById(integrationAuthId) .select('+refreshCiphertext +refreshIV +refreshTag'); @@ -187,7 +186,7 @@ const syncIntegrationsHelper = async ({ * @param {String} obj.integrationAuthId - id of integration auth * @returns {String} accessToken - decrypted access token */ -const getIntegrationAuthAccessHelper = async ({ integrationAuthId }: { integrationAuthId: Types.ObjectId }) => { +export const getIntegrationAuthAccessHelper = async ({ integrationAuthId }: { integrationAuthId: Types.ObjectId }) => { let accessId; let accessToken; const integrationAuth = await IntegrationAuth @@ -240,7 +239,7 @@ const getIntegrationAuthAccessHelper = async ({ integrationAuthId }: { integrati * @param {String} obj.integrationAuthId - id of integration auth * @param {String} obj.refreshToken - refresh token */ -const setIntegrationAuthRefreshHelper = async ({ +export const setIntegrationAuthRefreshHelper = async ({ integrationAuthId, refreshToken }: { @@ -282,7 +281,7 @@ const setIntegrationAuthRefreshHelper = async ({ * @param {String} obj.accessToken - access token * @param {Date} obj.accessExpiresAt - expiration date of access token */ -const setIntegrationAuthAccessHelper = async ({ +export const setIntegrationAuthAccessHelper = async ({ integrationAuthId, accessId, accessToken, @@ -327,13 +326,4 @@ const setIntegrationAuthAccessHelper = async ({ }); return integrationAuth; -} - -export { - handleOAuthExchangeHelper, - syncIntegrationsHelper, - getIntegrationAuthRefreshHelper, - getIntegrationAuthAccessHelper, - setIntegrationAuthRefreshHelper, - setIntegrationAuthAccessHelper -} +} \ No newline at end of file diff --git a/backend/src/helpers/key.ts b/backend/src/helpers/key.ts index bbd15ba58..afb4f6396 100644 --- a/backend/src/helpers/key.ts +++ b/backend/src/helpers/key.ts @@ -17,7 +17,7 @@ interface Key { * @param {String} obj.keys.nonce - nonce for encryption * @param {String} obj.keys.userId - id of receiver user */ -const pushKeys = async ({ +export const pushKeys = async ({ userId, workspaceId, keys @@ -50,6 +50,4 @@ const pushKeys = async ({ workspace: workspaceId })) ); -}; - -export { pushKeys }; +}; \ No newline at end of file diff --git a/backend/src/helpers/membership.ts b/backend/src/helpers/membership.ts index 074ebe777..976297512 100644 --- a/backend/src/helpers/membership.ts +++ b/backend/src/helpers/membership.ts @@ -10,10 +10,10 @@ import { MembershipNotFoundError, BadRequestError } from "../utils/errors"; * @param {String} obj.workspaceId - id of workspace * @returns {Membership} membership - membership of user with id [userId] for workspace with id [workspaceId] */ -const validateMembership = async ({ - userId, - workspaceId, - acceptedRoles, +export const validateMembership = async ({ + userId, + workspaceId, + acceptedRoles, }: { userId: Types.ObjectId | string; workspaceId: Types.ObjectId | string; @@ -46,8 +46,8 @@ const validateMembership = async ({ * @param {Object} queryObj - query object * @return {Object} membership - membership */ -const findMembership = async (queryObj: any) => { - const membership = await Membership.findOne(queryObj); +export const findMembership = async (queryObj: any) => { + const membership = await Membership.findOne(queryObj); return membership; }; @@ -59,10 +59,10 @@ const findMembership = async (queryObj: any) => { * @param {String} obj.workspaceId - id of workspace. * @param {String[]} obj.roles - roles of users. */ -const addMemberships = async ({ - userIds, - workspaceId, - roles, +export const addMemberships = async ({ + userIds, + workspaceId, + roles }: { userIds: string[]; workspaceId: string; @@ -93,9 +93,9 @@ const addMemberships = async ({ * @param {Object} obj * @param {String} obj.membershipId - id of membership to delete */ -const deleteMembership = async ({ membershipId }: { membershipId: string }) => { - const deletedMembership = await Membership.findOneAndDelete({ - _id: membershipId, +export const deleteMembership = async ({ membershipId }: { membershipId: string }) => { + const deletedMembership = await Membership.findOneAndDelete({ + _id: membershipId }); // delete keys associated with the membership @@ -107,7 +107,5 @@ const deleteMembership = async ({ membershipId }: { membershipId: string }) => { }); } - return deletedMembership; + return deletedMembership; }; - -export { validateMembership, addMemberships, findMembership, deleteMembership }; diff --git a/backend/src/helpers/membershipOrg.ts b/backend/src/helpers/membershipOrg.ts index b5f4bb366..f29f3cec0 100644 --- a/backend/src/helpers/membershipOrg.ts +++ b/backend/src/helpers/membershipOrg.ts @@ -18,7 +18,7 @@ import { * @param {Types.ObjectId} obj.organizationId * @param {String[]} obj.acceptedRoles */ -const validateMembershipOrg = async ({ +export const validateMembershipOrg = async ({ userId, organizationId, acceptedRoles, @@ -59,7 +59,7 @@ const validateMembershipOrg = async ({ * @param {Object} queryObj - query object * @return {Object} membershipOrg - membership */ -const findMembershipOrg = (queryObj: any) => { +export const findMembershipOrg = (queryObj: any) => { const membershipOrg = MembershipOrg.findOne(queryObj); return membershipOrg; }; @@ -72,7 +72,7 @@ const findMembershipOrg = (queryObj: any) => { * @param {String} obj.organizationId - id of organization. * @param {String[]} obj.roles - roles of users. */ -const addMembershipsOrg = async ({ +export const addMembershipsOrg = async ({ userIds, organizationId, roles, @@ -111,7 +111,7 @@ const addMembershipsOrg = async ({ * @param {Object} obj * @param {String} obj.membershipOrgId - id of organization membership to delete */ -const deleteMembershipOrg = async ({ +export const deleteMembershipOrg = async ({ membershipOrgId }: { membershipOrgId: string; @@ -148,11 +148,4 @@ const deleteMembershipOrg = async ({ } return deletedMembershipOrg; -}; - -export { - validateMembershipOrg, - findMembershipOrg, - addMembershipsOrg, - deleteMembershipOrg -}; +}; \ No newline at end of file diff --git a/backend/src/helpers/nodemailer.ts b/backend/src/helpers/nodemailer.ts index 111573916..ffd39d7dd 100644 --- a/backend/src/helpers/nodemailer.ts +++ b/backend/src/helpers/nodemailer.ts @@ -13,7 +13,7 @@ let smtpTransporter: nodemailer.Transporter; * @param {String[]} obj.recipients - email addresses of people to send email to * @param {Object} obj.substitutions - object containing template substitutions */ -const sendMail = async ({ +export const sendMail = async ({ template, subjectLine, recipients, @@ -41,8 +41,6 @@ const sendMail = async ({ } }; -const setTransporter = (transporter: nodemailer.Transporter) => { +export const setTransporter = (transporter: nodemailer.Transporter) => { smtpTransporter = transporter; -}; - -export { sendMail, setTransporter }; +}; \ No newline at end of file diff --git a/backend/src/helpers/organization.ts b/backend/src/helpers/organization.ts index 74c5df71d..71e8c15ce 100644 --- a/backend/src/helpers/organization.ts +++ b/backend/src/helpers/organization.ts @@ -28,7 +28,7 @@ import { * @param {String} obj.email - POC email that will receive invoice info * @param {Object} organization - new organization */ -const createOrganization = async ({ +export const createOrganization = async ({ name, email, }: { @@ -70,7 +70,7 @@ const createOrganization = async ({ * @return {Object} obj.stripeSubscription - new stripe subscription * @return {Subscription} obj.subscription - new subscription */ -const initSubscriptionOrg = async ({ +export const initSubscriptionOrg = async ({ organizationId, }: { organizationId: Types.ObjectId; @@ -125,7 +125,7 @@ const initSubscriptionOrg = async ({ * @param {Object} obj * @param {Number} obj.organizationId - id of subscription's organization */ -const updateSubscriptionOrgQuantity = async ({ +export const updateSubscriptionOrgQuantity = async ({ organizationId, }: { organizationId: string; @@ -171,10 +171,4 @@ const updateSubscriptionOrgQuantity = async ({ } return stripeSubscription; -}; - -export { - createOrganization, - initSubscriptionOrg, - updateSubscriptionOrgQuantity -}; +}; \ No newline at end of file diff --git a/backend/src/helpers/rateLimiter.ts b/backend/src/helpers/rateLimiter.ts index 9816d3b53..401acbe3f 100644 --- a/backend/src/helpers/rateLimiter.ts +++ b/backend/src/helpers/rateLimiter.ts @@ -2,7 +2,7 @@ import rateLimit from 'express-rate-limit'; const MongoStore = require('rate-limit-mongo'); // 200 per minute -const apiLimiter = rateLimit({ +export const apiLimiter = rateLimit({ store: new MongoStore({ uri: process.env.MONGO_URL, expireTimeMs: 1000 * 60, @@ -17,7 +17,7 @@ const apiLimiter = rateLimit({ return request.path === '/healthcheck' || request.path === '/api/status' }, keyGenerator: (req, res) => { - return req.clientIp + return req.realIP } }); @@ -34,12 +34,12 @@ const authLimit = rateLimit({ standardHeaders: true, legacyHeaders: false, keyGenerator: (req, res) => { - return req.clientIp + return req.realIP } }); // 50 requests per 1 hour -const passwordLimiter = rateLimit({ +export const passwordLimiter = rateLimit({ store: new MongoStore({ uri: process.env.MONGO_URL, expireTimeMs: 1000 * 60 * 60, @@ -51,20 +51,14 @@ const passwordLimiter = rateLimit({ standardHeaders: true, legacyHeaders: false, keyGenerator: (req, res) => { - return req.clientIp + return req.realIP } }); -const authLimiter = (req: any, res: any, next: any) => { +export const authLimiter = (req: any, res: any, next: any) => { if (process.env.NODE_ENV === 'production') { authLimit(req, res, next); } else { next(); } -}; - -export { - apiLimiter, - authLimiter, - passwordLimiter -}; +}; \ No newline at end of file diff --git a/backend/src/helpers/secret.ts b/backend/src/helpers/secret.ts index 22b362e79..31f6c6c9c 100644 --- a/backend/src/helpers/secret.ts +++ b/backend/src/helpers/secret.ts @@ -60,7 +60,7 @@ interface Update { * @param {String} obj.environment - environment for secrets * @param {Object[]} obj.secrets - secrets to push */ -const v1PushSecrets = async ({ +export const v1PushSecrets = async ({ userId, workspaceId, environment, @@ -304,7 +304,7 @@ const v1PushSecrets = async ({ * @param {String} obj.channel - channel (web/cli/auto) * @param {String} obj.ipAddress - ip address of request to push secrets */ -const v2PushSecrets = async ({ +export const v2PushSecrets = async ({ userId, workspaceId, environment, @@ -530,7 +530,7 @@ const v2PushSecrets = async ({ * @param {String} obj.workspaceId - id of workspace to pull from * @param {String} obj.environment - environment for secrets */ -const getSecrets = async ({ +export const getSecrets = async ({ userId, workspaceId, environment, @@ -570,7 +570,7 @@ const getSecrets = async ({ * @param {String} obj.channel - channel (web/cli/auto) * @param {String} obj.ipAddress - ip address of request to push secrets */ -const pullSecrets = async ({ +export const pullSecrets = async ({ userId, workspaceId, environment, @@ -614,7 +614,7 @@ const pullSecrets = async ({ * @param {Object} obj * @param {Object} obj.secrets */ -const reformatPullSecrets = ({ secrets }: { secrets: ISecret[] }) => { +export const reformatPullSecrets = ({ secrets }: { secrets: ISecret[] }) => { const reformatedSecrets = secrets.map((s) => ({ _id: s._id, workspace: s.workspace, @@ -644,6 +644,4 @@ const reformatPullSecrets = ({ secrets }: { secrets: ISecret[] }) => { })); return reformatedSecrets; -}; - -export { v1PushSecrets, v2PushSecrets, pullSecrets, reformatPullSecrets }; +}; \ No newline at end of file diff --git a/backend/src/helpers/secrets.ts b/backend/src/helpers/secrets.ts index 69ca78e7e..1c58119b1 100644 --- a/backend/src/helpers/secrets.ts +++ b/backend/src/helpers/secrets.ts @@ -45,8 +45,8 @@ import { * @param {Object} obj * @param {Types.ObjectId} obj.workspaceId */ -const createSecretBlindIndexDataHelper = async ({ - workspaceId, +export const createSecretBlindIndexDataHelper = async ({ + workspaceId }: { workspaceId: Types.ObjectId; }) => { @@ -98,8 +98,8 @@ const createSecretBlindIndexDataHelper = async ({ * @param {Types.ObjectId} obj.workspaceId - id of workspace to get salt for * @returns */ -const getSecretBlindIndexSaltHelper = async ({ - workspaceId, +export const getSecretBlindIndexSaltHelper = async ({ + workspaceId }: { workspaceId: Types.ObjectId; }) => { @@ -147,9 +147,9 @@ const getSecretBlindIndexSaltHelper = async ({ * @param {String} obj.secretName - name of secret to generate blind index for * @param {String} obj.salt - base64-salt */ -const generateSecretBlindIndexWithSaltHelper = async ({ - secretName, - salt, +export const generateSecretBlindIndexWithSaltHelper = async ({ + secretName, + salt }: { secretName: string; salt: string; @@ -177,9 +177,9 @@ const generateSecretBlindIndexWithSaltHelper = async ({ * @param {Stringj} obj.secretName - name of secret to generate blind index for * @param {Types.ObjectId} obj.workspaceId - id of workspace that secret belongs to */ -const generateSecretBlindIndexHelper = async ({ - secretName, - workspaceId, +export const generateSecretBlindIndexHelper = async ({ + secretName, + workspaceId }: { secretName: string; workspaceId: Types.ObjectId; @@ -247,7 +247,7 @@ const generateSecretBlindIndexHelper = async ({ * @param {AuthData} obj.authData - authentication data on request * @returns */ -const createSecretHelper = async ({ +export const createSecretHelper = async ({ secretName, workspaceId, environment, @@ -397,10 +397,10 @@ const createSecretHelper = async ({ * @param {AuthData} obj.authData - authentication data on request * @returns */ -const getSecretsHelper = async ({ - workspaceId, - environment, - authData, +export const getSecretsHelper = async ({ + workspaceId, + environment, + authData }: GetSecretsParams) => { let secrets: ISecret[] = []; @@ -472,7 +472,7 @@ const getSecretsHelper = async ({ * @param {AuthData} obj.authData - authentication data on request * @returns */ -const getSecretHelper = async ({ +export const getSecretHelper = async ({ secretName, workspaceId, environment, @@ -558,7 +558,8 @@ const getSecretHelper = async ({ * @param {AuthData} obj.authData - authentication data on request * @returns */ -const updateSecretHelper = async ({ + +export const updateSecretHelper = async ({ secretName, workspaceId, environment, @@ -698,7 +699,7 @@ const updateSecretHelper = async ({ * @param {AuthData} obj.authData - authentication data on request * @returns */ -const deleteSecretHelper = async ({ +export const deleteSecretHelper = async ({ secretName, workspaceId, environment, @@ -799,16 +800,4 @@ const deleteSecretHelper = async ({ secrets, secret, }; -}; - -export { - createSecretBlindIndexDataHelper, - getSecretBlindIndexSaltHelper, - generateSecretBlindIndexWithSaltHelper, - generateSecretBlindIndexHelper, - createSecretHelper, - getSecretsHelper, - getSecretHelper, - updateSecretHelper, - deleteSecretHelper, -}; +}; \ No newline at end of file diff --git a/backend/src/helpers/signup.ts b/backend/src/helpers/signup.ts index 9a70d0a57..d747de20d 100644 --- a/backend/src/helpers/signup.ts +++ b/backend/src/helpers/signup.ts @@ -13,11 +13,11 @@ import { TOKEN_EMAIL_CONFIRMATION } from '../variables'; * @param {String} obj.email - email * @returns {Boolean} success - whether or not operation was successful */ -const sendEmailVerification = async ({ email }: { email: string }) => { - const token = await TokenService.createToken({ - type: TOKEN_EMAIL_CONFIRMATION, - email - }); +export const sendEmailVerification = async ({ email }: { email: string }) => { + const token = await TokenService.createToken({ + type: TOKEN_EMAIL_CONFIRMATION, + email + }); // send mail await sendMail({ @@ -36,7 +36,7 @@ const sendEmailVerification = async ({ email }: { email: string }) => { * @param {String} obj.email - emai * @param {String} obj.code - code that was sent to [email] */ -const checkEmailVerification = async ({ +export const checkEmailVerification = async ({ email, code }: { @@ -57,7 +57,7 @@ const checkEmailVerification = async ({ * @param {String} obj.organizationName - name of organization to initialize * @param {IUser} obj.user - user who we are initializing for */ -const initializeDefaultOrg = async ({ +export const initializeDefaultOrg = async ({ organizationName, user }: { @@ -81,6 +81,4 @@ const initializeDefaultOrg = async ({ } catch (err) { throw new Error(`Failed to initialize default organization and workspace [err=${err}]`); } -}; - -export { sendEmailVerification, checkEmailVerification, initializeDefaultOrg }; +}; \ No newline at end of file diff --git a/backend/src/helpers/telemetry.ts b/backend/src/helpers/telemetry.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/src/helpers/token.ts b/backend/src/helpers/token.ts index b44641dae..66bae1a15 100644 --- a/backend/src/helpers/token.ts +++ b/backend/src/helpers/token.ts @@ -20,7 +20,7 @@ import { getSaltRounds } from "../config"; * @param {Types.ObjectId} obj.organizationId * @returns {String} token - the created token */ -const createTokenHelper = async ({ +export const createTokenHelper = async ({ type, email, phoneNumber, @@ -121,7 +121,7 @@ const createTokenHelper = async ({ * @param {String} obj.email - email associated with the token * @param {String} obj.token - value of the token */ -const validateTokenHelper = async ({ +export const validateTokenHelper = async ({ type, email, phoneNumber, @@ -212,6 +212,4 @@ const validateTokenHelper = async ({ // case: token is valid await TokenData.findByIdAndDelete(tokenData._id); -}; - -export { createTokenHelper, validateTokenHelper }; +}; \ No newline at end of file diff --git a/backend/src/helpers/workspace.ts b/backend/src/helpers/workspace.ts index eb74bf06d..a1d71e920 100644 --- a/backend/src/helpers/workspace.ts +++ b/backend/src/helpers/workspace.ts @@ -15,7 +15,7 @@ import { SecretService } from '../services'; * @param {String} organizationId - id of organization to create workspace in * @param {Object} workspace - new workspace */ -const createWorkspace = async ({ +export const createWorkspace = async ({ name, organizationId }: { @@ -50,23 +50,18 @@ const createWorkspace = async ({ * @param {Object} obj * @param {String} obj.id - id of workspace to delete */ -const deleteWorkspace = async ({ id }: { id: string }) => { - await Workspace.deleteOne({ _id: id }); - await Bot.deleteOne({ - workspace: id - }); - await Membership.deleteMany({ - workspace: id - }); - await Secret.deleteMany({ - workspace: id - }); - await Key.deleteMany({ - workspace: id - }); -}; - -export { - createWorkspace, - deleteWorkspace +export const deleteWorkspace = async ({ id }: { id: string }) => { + await Workspace.deleteOne({ _id: id }); + await Bot.deleteOne({ + workspace: id + }); + await Membership.deleteMany({ + workspace: id + }); + await Secret.deleteMany({ + workspace: id + }); + await Key.deleteMany({ + workspace: id + }); }; diff --git a/backend/src/index.ts b/backend/src/index.ts index 51cddcde5..af3e0b24b 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -13,7 +13,6 @@ import swaggerUi = require("swagger-ui-express"); // eslint-disable-next-line @typescript-eslint/no-var-requires const swaggerFile = require("../spec.json"); // eslint-disable-next-line @typescript-eslint/no-var-requires -const requestIp = require("request-ip"); import { apiLimiter } from "./helpers/rateLimiter"; import { workspace as eeWorkspaceRouter, @@ -86,8 +85,6 @@ const main = async () => { }) ); - app.use(requestIp.mw()); - if ((await getNodeEnv()) === "production") { // enable app-wide rate-limiting + helmet security // in production @@ -96,6 +93,13 @@ const main = async () => { app.use(helmet()); } + app.use((req, res, next) => { + // default to IP address provided by Cloudflare + const cfIp = req.headers['cf-connecting-ip']; + req.realIP = Array.isArray(cfIp) ? cfIp[0] : (cfIp as string) || req.ip; + next(); + }); + // (EE) routes app.use("/api/v1/secret", eeSecretRouter); app.use("/api/v1/secret-snapshot", eeSecretSnapshotRouter); diff --git a/backend/src/interfaces/middleware/index.ts b/backend/src/interfaces/middleware/index.ts index 34230de05..a368a3be1 100644 --- a/backend/src/interfaces/middleware/index.ts +++ b/backend/src/interfaces/middleware/index.ts @@ -1,3 +1,4 @@ +import { Types } from 'mongoose'; import { IUser, IServiceAccount, @@ -10,4 +11,5 @@ export interface AuthData { authChannel: string; authIP: string; authUserAgent: string; + tokenVersionId?: Types.ObjectId; } \ No newline at end of file diff --git a/backend/src/middleware/requireAuth.ts b/backend/src/middleware/requireAuth.ts index 9ada0628b..22de05f68 100644 --- a/backend/src/middleware/requireAuth.ts +++ b/backend/src/middleware/requireAuth.ts @@ -71,10 +71,12 @@ const requireAuth = ({ req.user = authPayload; break; default: - authPayload = await getAuthUserPayload({ + const { user, tokenVersionId } = await getAuthUserPayload({ authTokenValue }); - req.user = authPayload; + authPayload = user; + req.user = user; + req.tokenVersionId = tokenVersionId; break; } @@ -88,8 +90,9 @@ const requireAuth = ({ authMode, authPayload, // User, ServiceAccount, ServiceTokenData authChannel: getChannelFromUserAgent(req.headers['user-agent']), - authIP: req.ip, - authUserAgent: req.headers['user-agent'] ?? 'other' + authIP: req.realIP, + authUserAgent: req.headers['user-agent'] ?? 'other', + tokenVersionId: req.tokenVersionId } return next(); diff --git a/backend/src/models/index.ts b/backend/src/models/index.ts index 843296b55..cb4ee672a 100644 --- a/backend/src/models/index.ts +++ b/backend/src/models/index.ts @@ -22,6 +22,7 @@ import Workspace, { IWorkspace } from './workspace'; import ServiceTokenData, { IServiceTokenData } from './serviceTokenData'; import APIKeyData, { IAPIKeyData } from './apiKeyData'; import LoginSRPDetail, { ILoginSRPDetail } from './loginSRPDetail'; +import TokenVersion, { ITokenVersion } from './tokenVersion'; export { AuthProvider, @@ -72,5 +73,7 @@ export { APIKeyData, IAPIKeyData, LoginSRPDetail, - ILoginSRPDetail + ILoginSRPDetail, + TokenVersion, + ITokenVersion }; diff --git a/backend/src/models/tokenVersion.ts b/backend/src/models/tokenVersion.ts new file mode 100644 index 000000000..890c0a272 --- /dev/null +++ b/backend/src/models/tokenVersion.ts @@ -0,0 +1,47 @@ +import { Schema, model, Types, Document } from 'mongoose'; + +export interface ITokenVersion extends Document { + user: Types.ObjectId; + ip: string; + userAgent: string; + refreshVersion: number; + accessVersion: number; + lastUsed: Date; +} + +const tokenVersionSchema = new Schema( + { + user: { + type: Schema.Types.ObjectId, + ref: 'User', + required: true + }, + ip: { + type: String, + required: true + }, + userAgent: { + type: String, + required: true + }, + refreshVersion: { + type: Number, + required: true + }, + accessVersion: { + type: Number, + required: true + }, + lastUsed: { + type: Date, + required: true + } + }, + { + timestamps: true + } +); + +const TokenVersion = model('TokenVersion', tokenVersionSchema); + +export default TokenVersion; \ No newline at end of file diff --git a/backend/src/models/user.ts b/backend/src/models/user.ts index 843730e0c..1c12720f8 100644 --- a/backend/src/models/user.ts +++ b/backend/src/models/user.ts @@ -21,7 +21,6 @@ export interface IUser extends Document { tag?: string; salt?: string; verifier?: string; - refreshVersion?: number; isMfaEnabled: boolean; mfaMethods: boolean; devices: { @@ -91,11 +90,6 @@ const userSchema = new Schema( type: String, select: false }, - refreshVersion: { - type: Number, - default: 0, - select: false - }, isMfaEnabled: { type: Boolean, default: false @@ -108,7 +102,8 @@ const userSchema = new Schema( ip: String, userAgent: String }], - default: [] + default: [], + select: false } }, { diff --git a/backend/src/routes/v1/auth.ts b/backend/src/routes/v1/auth.ts index 20f5ec9b8..ed86a236d 100644 --- a/backend/src/routes/v1/auth.ts +++ b/backend/src/routes/v1/auth.ts @@ -44,8 +44,6 @@ router.post( authController.checkAuth ); - - router.get( '/redirect/google', authLimiter, @@ -53,12 +51,27 @@ router.get( scope: ['profile', 'email'], session: false, }), -) +); router.get( '/callback/google', passport.authenticate('google', { failureRedirect: '/login/provider/error', session: false }), authController.handleAuthProviderCallback, -) +); + +router.get( + '/common-passwords', + authLimiter, + authController.getCommonPasswords +); + +router.delete( + '/sessions', + authLimiter, + requireAuth({ + acceptedAuthModes: [AUTH_MODE_JWT] + }), + authController.revokeAllSessions +); export default router; diff --git a/backend/src/routes/v2/auth.ts b/backend/src/routes/v2/auth.ts index 128a08fae..288004e65 100644 --- a/backend/src/routes/v2/auth.ts +++ b/backend/src/routes/v2/auth.ts @@ -26,7 +26,7 @@ router.post( router.post( '/mfa/send', authLimiter, - body('email').isString().trim().notEmpty(), + body('email').isString().trim().notEmpty().isEmail(), validateRequest, authController.sendMfaToken ); diff --git a/backend/src/services/BotService.ts b/backend/src/services/BotService.ts index 4e8118fbe..2c0db0355 100644 --- a/backend/src/services/BotService.ts +++ b/backend/src/services/BotService.ts @@ -1,6 +1,6 @@ import { Types } from 'mongoose'; import { - getSecretsHelper, + getSecretsBotHelper, encryptSymmetricHelper, decryptSymmetricHelper } from '../helpers/bot'; @@ -25,7 +25,7 @@ class BotService { workspaceId: Types.ObjectId; environment: string; }) { - return await getSecretsHelper({ + return await getSecretsBotHelper({ workspaceId, environment }); diff --git a/backend/src/types/express/index.d.ts b/backend/src/types/express/index.d.ts index 7cd570020..b5ca0ab28 100644 --- a/backend/src/types/express/index.d.ts +++ b/backend/src/types/express/index.d.ts @@ -1,4 +1,5 @@ import * as express from 'express'; +import { Types } from 'mongoose'; import { IUser, IServiceAccount, @@ -39,7 +40,9 @@ declare global { serviceTokenData: any; apiKeyData: any; query?: any; + tokenVersionId?: Types.ObjectId; authData: AuthData; + realIP: string; requestData: { [key: string]: string }; diff --git a/backend/src/validation/index.ts b/backend/src/validation/index.ts index 84f25bb74..177c716ea 100644 --- a/backend/src/validation/index.ts +++ b/backend/src/validation/index.ts @@ -1,3 +1,4 @@ +export * from './user'; export * from './workspace'; export * from './bot'; export * from './integration'; diff --git a/backend/src/validation/user.ts b/backend/src/validation/user.ts index 1329adfc4..4c412e52f 100644 --- a/backend/src/validation/user.ts +++ b/backend/src/validation/user.ts @@ -1,3 +1,5 @@ +import fs from 'fs'; +import path from 'path'; import { Types } from 'mongoose'; import { IUser, @@ -8,7 +10,7 @@ import { } from '../models'; import { validateMembership } from '../helpers/membership'; import _ from 'lodash'; -import { BadRequestError, UnauthorizedRequestError } from '../utils/errors'; +import { BadRequestError, UnauthorizedRequestError, ValidationError } from '../utils/errors'; import { validateMembershipOrg } from '../helpers/membershipOrg'; @@ -17,6 +19,22 @@ import { PERMISSION_WRITE_SECRETS } from '../variables'; +/** + * Validate that email [email] is not disposable + * @param email - email to validate + */ +export const validateUserEmail = (email: string) => { + const emailDomain = email.split('@')[1]; + const disposableEmails = fs.readFileSync( + path.resolve(__dirname, '../data/' + 'disposable_emails.txt'), + 'utf8' + ).split('\n'); + + if (disposableEmails.includes(emailDomain)) throw ValidationError({ + message: 'Failed to validate email as non-disposable' + }); +} + /** * Validate that user (client) can access workspace * with id [workspaceId] and its environment [environment] with required permissions diff --git a/frontend/src/components/signup/UserInfoStep.tsx b/frontend/src/components/signup/UserInfoStep.tsx index 09aefa884..e4feb1137 100644 --- a/frontend/src/components/signup/UserInfoStep.tsx +++ b/frontend/src/components/signup/UserInfoStep.tsx @@ -2,18 +2,19 @@ import crypto from 'crypto'; import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { faCheck, faXmark } from '@fortawesome/free-solid-svg-icons'; +import { faXmark } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import jsrp from 'jsrp'; import nacl from 'tweetnacl'; import { encodeBase64 } from 'tweetnacl-util'; +import { useGetCommonPasswords } from '@app/hooks/api'; import completeAccountInformationSignup from '@app/pages/api/auth/CompleteAccountInformationSignup'; import getOrganizations from '@app/pages/api/organization/getOrgs'; import ProjectService from '@app/services/ProjectService'; import InputField from '../basic/InputField'; -import passwordCheck from '../utilities/checks/PasswordCheck'; +import checkPassword from '../utilities/checks/checkPassword'; import Aes256Gcm from '../utilities/cryptography/aes-256-gcm'; import { deriveArgonKey } from '../utilities/cryptography/crypto'; import { saveTokenToLocalStorage } from '../utilities/saveTokenToLocalStorage'; @@ -37,6 +38,15 @@ interface UserInfoStepProps { providerAuthToken?: string; } +type Errors = { + length?: string, + upperCase?: string, + lowerCase?: string, + number?: string, + specialChar?: string, + repeatedChar?: string, +}; + /** * This is the step of the sign up flow where people provife their name/surname and password * @param {object} obj @@ -63,11 +73,11 @@ export default function UserInfoStep({ setAttributionSource, providerAuthToken, }: UserInfoStepProps): JSX.Element { + const { data: commonPasswords } = useGetCommonPasswords(); const [nameError, setNameError] = useState(false); const [organizationNameError, setOrganizationNameError] = useState(false); - const [passwordErrorLength, setPasswordErrorLength] = useState(false); - const [passwordErrorNumber, setPasswordErrorNumber] = useState(false); - const [passwordErrorLowerCase, setPasswordErrorLowerCase] = useState(false); + + const [errors, setErrors] = useState({}); const [isLoading, setIsLoading] = useState(false); const { t } = useTranslation(); @@ -89,12 +99,11 @@ export default function UserInfoStep({ } else { setOrganizationNameError(false); } - errorCheck = passwordCheck({ + + errorCheck = checkPassword({ password, - setPasswordErrorLength, - setPasswordErrorNumber, - setPasswordErrorLowerCase, - errorCheck + commonPasswords, + setErrors }); if (!errorCheck) { @@ -248,59 +257,45 @@ export default function UserInfoStep({ label={t('section.password.password')} onChangeHandler={(pass: string) => { setPassword(pass); - passwordCheck({ + checkPassword({ password: pass, - setPasswordErrorLength, - setPasswordErrorNumber, - setPasswordErrorLowerCase, - errorCheck: false + commonPasswords, + setErrors }); }} type="password" value={password} isRequired - error={passwordErrorLength && passwordErrorNumber && passwordErrorLowerCase} + error={Object.keys(errors).length > 0} autoComplete="new-password" id="new-password" /> - {passwordErrorLength || passwordErrorLowerCase || passwordErrorNumber ? ( + {Object.keys(errors).length > 0 && (
-
{t('section.password.validate-base')}
-
- {passwordErrorLength ? ( - - ) : ( - - )} -
- {t('section.password.validate-length')} -
-
-
- {passwordErrorLowerCase ? ( - - ) : ( - - )} -
- {t('section.password.validate-case')} -
-
-
- {passwordErrorNumber ? ( - - ) : ( - - )} -
- {t('section.password.validate-number')} -
-
+
{t('section.password.validate-base')}
+ {Object.keys(errors).map((key) => { + if (errors[key as keyof Errors]) { + return ( +
+
+ +
+

+ {errors[key as keyof Errors]} +

+
+ ); + } + + return null; + })}
- ) : ( -
)}
diff --git a/frontend/src/components/utilities/checks/PasswordCheck.ts b/frontend/src/components/utilities/checks/PasswordCheck.ts index e84cba761..5fb9dfe2c 100644 --- a/frontend/src/components/utilities/checks/PasswordCheck.ts +++ b/frontend/src/components/utilities/checks/PasswordCheck.ts @@ -17,6 +17,7 @@ const passwordCheck = ({ setPasswordErrorLowerCase, errorCheck }: PasswordCheckProps) => { + if (!password || password.length < 14) { setPasswordErrorLength(true); errorCheck = true; diff --git a/frontend/src/components/utilities/checks/checkPassword.ts b/frontend/src/components/utilities/checks/checkPassword.ts new file mode 100644 index 000000000..69dba2397 --- /dev/null +++ b/frontend/src/components/utilities/checks/checkPassword.ts @@ -0,0 +1,72 @@ +type Errors = { + length?: string, + upperCase?: string, + lowerCase?: string, + number?: string, + specialChar?: string, + repeatedChar?: string, + commonPassword?: string + }; + +interface CheckPasswordParams { + password: string; + commonPasswords: string[]; + setErrors: (value: Errors) => void; +} + +/** + * Validate that the password [password] is at least: + * - 8 characters long + * - Contains 1 uppercase character (A-Z) + * - Contains 1 lowercase character (a-z) + * - Contains 1 number (0-9) + * - Does not contain 3 repeat, consecutive characters + * + * The function returns whether or not the password [password] + * passes the minimum requirements above. It sets errors on + * an erorr object via [setErrors]. + * + * @param {Object} obj + * @param {String} obj.password - the password to check + * @param {Function} obj.setErrors - set state function to set error object + */ +const checkPassword = ({ + password, + commonPasswords, + setErrors +}: CheckPasswordParams): boolean => { + const errors: Errors = {}; + + if (password.length < 8) { + errors.length = "8 characters"; + } + + if (!/[A-Z]/.test(password)) { + errors.upperCase = "1 uppercase character (A-Z)"; + } + + if (!/[a-z]/.test(password)) { + errors.lowerCase = "1 lowercase character (a-z)"; + } + + if (!/[0-9]/.test(password)) { + errors.number = "1 number (0-9)"; + } + + if (!/[!@#$%^&*(),.?":{}|<>]/.test(password)) { + errors.specialChar = "1 special character (!@#$%^&*(),.?)"; + } + + if (/([A-Za-z0-9])\1\1\1/.test(password)) { + errors.repeatedChar = "No 3 repeat, consecutive characters"; + } + + if (commonPasswords.includes(password)) { + errors.commonPassword = "No common passwords"; + } + + setErrors(errors); + return Object.keys(errors).length > 0; +} + +export default checkPassword; \ No newline at end of file diff --git a/frontend/src/components/utilities/cryptography/changePassword.ts b/frontend/src/components/utilities/cryptography/changePassword.ts index e5b8fffb5..4f1eb85c3 100644 --- a/frontend/src/components/utilities/cryptography/changePassword.ts +++ b/frontend/src/components/utilities/cryptography/changePassword.ts @@ -125,6 +125,10 @@ const changePassword = async ( setPasswordChanged(true); setCurrentPassword(''); setNewPassword(''); + + window.location.href = '/login'; + + // move to login page } catch (error) { setCurrentPasswordError(true); console.log(error); diff --git a/frontend/src/hooks/api/auth/index.tsx b/frontend/src/hooks/api/auth/index.tsx index de14c3bf4..13b39764a 100644 --- a/frontend/src/hooks/api/auth/index.tsx +++ b/frontend/src/hooks/api/auth/index.tsx @@ -1,4 +1,7 @@ export { useGetAuthToken, useSendMfaToken, - useVerifyMfaToken} from './queries' + useVerifyMfaToken, + useRevokeAllSessions, + useGetCommonPasswords +} from './queries' diff --git a/frontend/src/hooks/api/auth/queries.tsx b/frontend/src/hooks/api/auth/queries.tsx index 23e0c50fc..e4d35d934 100644 --- a/frontend/src/hooks/api/auth/queries.tsx +++ b/frontend/src/hooks/api/auth/queries.tsx @@ -10,7 +10,8 @@ import { VerifyMfaTokenRes} from './types'; const authKeys = { - getAuthToken: ['token'] as const + getAuthToken: ['token'] as const, + commonPasswords: ['common-passwords'] as const }; export const useSendMfaToken = () => { @@ -49,3 +50,20 @@ export const useGetAuthToken = () => onSuccess: (data) => setAuthToken(data.token), retry: 0 }); + +export const useRevokeAllSessions = () => { + return useMutation({ + mutationFn: async () => { + const { data } = await apiRequest.delete('/api/v1/auth/sessions'); + return data; + } + }); +} + +const fetchCommonPasswords = async () => { + const { data } = await apiRequest.get('/api/v1/auth/common-passwords'); + return data || []; +}; + +export const useGetCommonPasswords = () => + useQuery({ queryKey: authKeys.commonPasswords, queryFn: fetchCommonPasswords }); \ No newline at end of file diff --git a/frontend/src/pages/settings/personal/[id].tsx b/frontend/src/pages/settings/personal/[id].tsx index 2b428aeca..dabd90863 100644 --- a/frontend/src/pages/settings/personal/[id].tsx +++ b/frontend/src/pages/settings/personal/[id].tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import Head from 'next/head'; import { useRouter } from 'next/router'; -import { faCheck, faPlus, faX } from '@fortawesome/free-solid-svg-icons'; +import { faBan,faCheck, faPlus, faXmark } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import Button from '@app/components/basic/buttons/Button'; @@ -10,21 +10,31 @@ import InputField from '@app/components/basic/InputField'; import ListBox from '@app/components/basic/Listbox'; import ApiKeyTable from '@app/components/basic/table/ApiKeyTable'; import NavHeader from '@app/components/navigation/NavHeader'; -import passwordCheck from '@app/components/utilities/checks/PasswordCheck'; +import checkPassword from '@app/components/utilities/checks/checkPassword'; import changePassword from '@app/components/utilities/cryptography/changePassword'; import issueBackupKey from '@app/components/utilities/cryptography/issueBackupKey'; +import { + useGetCommonPasswords, + useRevokeAllSessions} from '@app/hooks/api'; import { SecuritySection } from '@app/views/Settings/PersonalSettingsPage/SecuritySection/SecuritySection'; import AddApiKeyDialog from '../../../components/basic/dialog/AddApiKeyDialog'; import getAPIKeys from '../../api/apiKey/getAPIKeys'; import getUser from '../../api/user/getUser'; +type Errors = { + length?: string, + upperCase?: string, + lowerCase?: string, + number?: string, + specialChar?: string, + repeatedChar?: string, +}; + export default function PersonalSettings() { + const { data: commonPasswords } = useGetCommonPasswords(); const [personalEmail, setPersonalEmail] = useState(''); const [personalName, setPersonalName] = useState(''); - const [passwordErrorLength, setPasswordErrorLength] = useState(false); - const [passwordErrorNumber, setPasswordErrorNumber] = useState(false); - const [passwordErrorLowerCase, setPasswordErrorLowerCase] = useState(false); const [currentPasswordError, setCurrentPasswordError] = useState(false); const [currentPassword, setCurrentPassword] = useState(''); const [newPassword, setNewPassword] = useState(''); @@ -34,6 +44,9 @@ export default function PersonalSettings() { const [backupKeyError, setBackupKeyError] = useState(false); const [isAddApiKeyDialogOpen, setIsAddApiKeyDialogOpen] = useState(false); const [apiKeys, setApiKeys] = useState([]); + const [errors, setErrors] = useState({}); + + const revokeAllSessions = useRevokeAllSessions(); const { t, i18n } = useTranslation(); const router = useRouter(); @@ -154,78 +167,54 @@ export default function PersonalSettings() { label={t('section.password.new') as string} onChangeHandler={(password) => { setNewPassword(password); - passwordCheck({ + checkPassword({ password, - setPasswordErrorLength, - setPasswordErrorNumber, - setPasswordErrorLowerCase, - errorCheck: false + commonPasswords, + setErrors }); }} type="password" value={newPassword} isRequired - error={passwordErrorLength && passwordErrorLowerCase && passwordErrorNumber} + error={Object.keys(errors).length > 0} autoComplete="new-password" id="new-password" />
- {passwordErrorLength || passwordErrorLowerCase || passwordErrorNumber ? ( -
-
- {t('section.password.validate-base')} -
-
- {passwordErrorLength ? ( - - ) : ( - - )} -
- {t('section.password.validate-length')} -
-
-
- {passwordErrorLowerCase ? ( - - ) : ( - - )} -
- {t('section.password.validate-case')} -
-
-
- {passwordErrorNumber ? ( - - ) : ( - - )} -
- {t('section.password.validate-number')} -
-
+ {Object.keys(errors).length > 0 && ( +
+
{t('section.password.validate-base')}
+ {Object.keys(errors).map((key) => { + if (errors[key as keyof Errors]) { + return ( +
+
+ +
+

+ {errors[key as keyof Errors]} +

+
+ ); + } + + return null; + })}
- ) : ( -
)}
+
+
+

+ Sessions +

+
+
+
+

+ Logging into Infisical via browser or CLI creates a session. Revoking all sessions logs your account out all active sessions across all browsers and CLIs. +

+
diff --git a/frontend/src/pages/signupinvite.tsx b/frontend/src/pages/signupinvite.tsx index e86dd92d7..cc009e091 100644 --- a/frontend/src/pages/signupinvite.tsx +++ b/frontend/src/pages/signupinvite.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; import Image from 'next/image'; import Link from 'next/link'; import { useRouter } from 'next/router'; -import { faCheck, faWarning, faX } from '@fortawesome/free-solid-svg-icons'; +import { faCheck, faWarning, faXmark } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import jsrp from 'jsrp'; import queryString from 'query-string'; @@ -17,7 +17,9 @@ import { encodeBase64 } from 'tweetnacl-util'; import Button from '@app/components/basic/buttons/Button'; import InputField from '@app/components/basic/InputField'; import attemptLogin from '@app/components/utilities/attemptLogin'; -import passwordCheck from '@app/components/utilities/checks/PasswordCheck'; + +import checkPassword from '@app/components/utilities/checks/checkPassword'; + import Aes256Gcm from '@app/components/utilities/cryptography/aes-256-gcm'; import { deriveArgonKey } from '@app/components/utilities/cryptography/crypto'; import issueBackupKey from '@app/components/utilities/cryptography/issueBackupKey'; @@ -25,28 +27,36 @@ import { saveTokenToLocalStorage } from '@app/components/utilities/saveTokenToLo import SecurityClient from '@app/components/utilities/SecurityClient'; import getOrganizations from '@app/pages/api/organization/getOrgs'; import getOrganizationUserProjects from '@app/pages/api/organization/GetOrgUserProjects'; - +import { + useGetCommonPasswords +} from '@app/hooks/api'; import completeAccountInformationSignupInvite from './api/auth/CompleteAccountInformationSignupInvite'; import verifySignupInvite from './api/auth/VerifySignupInvite'; // eslint-disable-next-line new-cap const client = new jsrp.client(); +type Errors = { + length?: string, + upperCase?: string, + lowerCase?: string, + number?: string, + specialChar?: string, + repeatedChar?: string, +}; + export default function SignupInvite() { + const { data: commonPasswords } = useGetCommonPasswords(); const [password, setPassword] = useState(''); const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); const [firstNameError, setFirstNameError] = useState(false); const [lastNameError, setLastNameError] = useState(false); - const [passwordErrorLength, setPasswordErrorLength] = useState(false); - const [passwordErrorNumber, setPasswordErrorNumber] = useState(false); - const [passwordErrorLowerCase, setPasswordErrorLowerCase] = useState(false); - const [errorLogin, setErrorLogin] = useState(false); const [isLoading, setIsLoading] = useState(false); const [step, setStep] = useState(1); const [backupKeyError, setBackupKeyError] = useState(false); - const [verificationToken, setVerificationToken] = useState(''); const [backupKeyIssued, setBackupKeyIssued] = useState(false); + const [errors, setErrors] = useState({}); const router = useRouter(); const parsedUrl = queryString.parse(router.asPath.split('?')[1]); @@ -70,12 +80,11 @@ export default function SignupInvite() { } else { setLastNameError(false); } - errorCheck = passwordCheck({ + + errorCheck = checkPassword({ password, - setPasswordErrorLength, - setPasswordErrorNumber, - setPasswordErrorLowerCase, - errorCheck + commonPasswords, + setErrors }); if (!errorCheck) { @@ -252,60 +261,43 @@ export default function SignupInvite() { label="Password" onChangeHandler={(pass) => { setPassword(pass); - passwordCheck({ + checkPassword({ password: pass, - setPasswordErrorLength, - setPasswordErrorNumber, - setPasswordErrorLowerCase, - errorCheck: false + commonPasswords, + setErrors }); }} type="password" value={password} isRequired - error={passwordErrorLength && passwordErrorNumber && passwordErrorLowerCase} + error={Object.keys(errors).length > 0} autoComplete="new-password" id="new-password" /> - {passwordErrorLength || passwordErrorLowerCase || passwordErrorNumber ? ( -
-
Password should contain at least:
-
- {passwordErrorLength ? ( - - ) : ( - - )} -
- 14 characters -
+ {Object.keys(errors).length > 0 && ( +
+
Password should contain at least:
+ {Object.keys(errors).map((key) => { + if (errors[key as keyof Errors]) { + return ( +
+
+ +
+

+ {errors[key as keyof Errors]} +

+
+ ); + } + + return null; + })}
-
- {passwordErrorLowerCase ? ( - - ) : ( - - )} -
- 1 lowercase character -
-
-
- {passwordErrorNumber ? ( - - ) : ( - - )} -
- 1 number -
-
-
- ) : ( -
- )} + )}