diff --git a/backend/package-lock.json b/backend/package-lock.json index b575c65c8..80ab4e03b 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,15 +9,15 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.267.0", + "@aws-sdk/client-secrets-manager": "^3.281.0", "@godaddy/terminus": "^4.11.2", "@octokit/rest": "^19.0.5", - "@sentry/node": "^7.39.0", - "@sentry/tracing": "^7.19.0", + "@sentry/node": "^7.40.0", + "@sentry/tracing": "^7.39.0", "@types/crypto-js": "^4.1.1", "@types/libsodium-wrappers": "^0.7.10", "await-to-js": "^3.0.0", - "aws-sdk": "^2.1311.0", + "aws-sdk": "^2.1324.0", "axios": "^1.1.3", "axios-retry": "^3.4.0", "bcrypt": "^5.1.0", @@ -38,7 +38,7 @@ "jsrp": "^0.2.4", "libsodium-wrappers": "^0.7.10", "lodash": "^4.17.21", - "mongoose": "^6.7.2", + "mongoose": "^6.10.2", "nodemailer": "^6.8.0", "posthog-node": "^2.5.4", "query-string": "^7.1.3", @@ -232,15 +232,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.279.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.279.0.tgz", - "integrity": "sha512-1cEXfqDUiS44DSXueb4QhHKa1K9WVWP/FqxYUB11xV0p5jElX88JVHyNPK/XsVbh9S6nS/MGPBIDbVA2y/mt5g==", + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.281.0.tgz", + "integrity": "sha512-vL+LygNDoCja/47pFwSnI3tCWfy5SGHlz6C1whcszmfl81gXyuHNlAK8RXVRiKhnD11zmCsHJhZyYSfTz5RErQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.279.0", + "@aws-sdk/client-sts": "3.281.0", "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.279.0", + "@aws-sdk/credential-provider-node": "3.281.0", "@aws-sdk/fetch-http-handler": "3.272.0", "@aws-sdk/hash-node": "3.272.0", "@aws-sdk/invalid-dependency": "3.272.0", @@ -277,10 +277,211 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/client-sso": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.281.0.tgz", + "integrity": "sha512-3RvO5zClQhu37w9VMLoHPGk58S3y8Spb7XX8rW51bm5TUglYQskQ0X2VLEUW/7ZGx/peokHws9Z9+w5yGq5sdA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.278.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.279.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.279.0", + "@aws-sdk/util-defaults-mode-node": "3.279.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.281.0.tgz", + "integrity": "sha512-P6zf9pDuxApVoCYStAg7L8BU9AcWI8PxfLSX4r2WnmcQropxzPJ3op1j9nvbwwBDMFWephijVY4AVp8MqPcPyg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.278.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.279.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.279.0", + "@aws-sdk/util-defaults-mode-node": "3.279.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/client-sts": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.281.0.tgz", + "integrity": "sha512-w8QomyhCVEArRcXgOkjbofiS/PLEKWRAyYBovjMS1cGhns2ZYJXFgHNgr3VGE54TghUc5dR1CqKuBKKM4ThrgA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.281.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.278.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-sdk-sts": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.279.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.279.0", + "@aws-sdk/util-defaults-mode-node": "3.279.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.281.0.tgz", + "integrity": "sha512-H99nhMhHImQKgNhHKYc6usTS6UK8KzCcVGpILLVTuP97YlrYAMFAVstA3Xk6mZ28JAbHVXvI6vJjkMNOzCSKCA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.281.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.281.0.tgz", + "integrity": "sha512-jhddd+lJp8G8hBJ+6glmXjfWJT3nxiE1aliH3fBC4RR3D+1kRXc99Xg6mbUb8bm+GrVZ4gzfiqSgg+ByKjd7xA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.281.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.281.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.281.0.tgz", + "integrity": "sha512-IqJnpXuLpJYoSCf/Rt66/CPVTjfkam3z9+ZvlQJV+VbK+vGj276qEtTmSN3XPZZgF1XbWptvkzIWDszLhHiZmg==", + "dependencies": { + "@aws-sdk/client-sso": "3.281.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/token-providers": "3.281.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/token-providers": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.281.0.tgz", + "integrity": "sha512-36Vg/F6Edm7qdjcTeNVON+sK2edgHhmhTtAEjWcuUk5AX/Et+Ate/A2N8HD3nxwlAcgidfnBC9SHYJatbhcEnQ==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.281.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/client-sso": { "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.279.0.tgz", "integrity": "sha512-599Y5wOrkpjD6p0BTs0X4+Ge9O7jlAPJ2ttI9lfhT2/UEZyqoJHajJs1pMJV75oeZklPOBi8G9jnZcMVJgRpvQ==", + "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -323,6 +524,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.279.0.tgz", "integrity": "sha512-tC9xKGo3z/HQbJDMvaUrnBSSRX7sOX2YUA2OpJ3T1TTfylLTO70OKjg1G4OMFNiPpJsHonwD7Iud+rnMnUKI0g==", + "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -365,6 +567,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.279.0.tgz", "integrity": "sha512-y/cI5Gg5WWqmSSDQftCT26wOLu0HSuPY1u6Q4Q97FBIfRC3hYztjYdUDHuTu6qPPT+tdsnWOUy2tr3qamVSQ4g==", + "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -469,6 +672,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.279.0.tgz", "integrity": "sha512-FCpr3/khMTb2pWLMC138wU7HzcpkrjejrBNfCJSUu7Emxm039UMLjT2JObnRKxidKlz58oYBRayVIbBYRWREcg==", + "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.272.0", "@aws-sdk/credential-provider-imds": "3.272.0", @@ -488,6 +692,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.279.0.tgz", "integrity": "sha512-7D8ETopCt3H+x2BEPMEhzc4dcNtSK7umnRdgfiTGRjcQSVPh5Whq/tDIAtNj2D+PmLgu3e+Hk7jrXkaMCDlxMw==", + "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.272.0", "@aws-sdk/credential-provider-imds": "3.272.0", @@ -522,6 +727,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.279.0.tgz", "integrity": "sha512-u8ZHz9Sv7sAv2vllyzcdgcO1pC5pa2UuoYKfz9J8hqLHc8VJYtYQ6WJvi4GoA55VDPk87pyVYz9t6ATntsukaw==", + "optional": true, "dependencies": { "@aws-sdk/client-sso": "3.279.0", "@aws-sdk/property-provider": "3.272.0", @@ -905,6 +1111,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.279.0.tgz", "integrity": "sha512-bsUlZSizTXZ8Pehdatcioi8VphxYn7fRjo5L083peOvBjoL+9WSGyP74PLrFLNwA35QxddwOqgnpQZoE1heuPQ==", + "optional": true, "dependencies": { "@aws-sdk/client-sso-oidc": "3.279.0", "@aws-sdk/property-provider": "3.272.0", @@ -2781,32 +2988,14 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, - "node_modules/@sentry/core": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.38.0.tgz", - "integrity": "sha512-+hXh/SO3Ie6WC2b+wi01xLhyVREdkRXS5QBmCiv3z2ks2HvYXp7PoKSXJvNKiwCP+pBD+enOnM1YEzM2yEy5yw==", - "dependencies": { - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/core/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/@sentry/node": { - "version": "7.39.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.39.0.tgz", - "integrity": "sha512-oe1OBxgs6t/FizjxkSPtuvJv5wJMO+mLENZkiE0PpBD56JyZrWK48kYIt2ccWAfk6Vh235/oIpmqET150xB4lQ==", + "version": "7.40.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.40.0.tgz", + "integrity": "sha512-S2pcLBUsCg3+WYlyQbXKPey3H1yaZPt9fpJTPAoabbidYXweBAbtFjSCRwPFwCQMzWusWxlYEwWRT77C07pHVg==", "dependencies": { - "@sentry/core": "7.39.0", - "@sentry/types": "7.39.0", - "@sentry/utils": "7.39.0", + "@sentry/core": "7.40.0", + "@sentry/types": "7.40.0", + "@sentry/utils": "7.40.0", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", @@ -2817,12 +3006,12 @@ } }, "node_modules/@sentry/node/node_modules/@sentry/core": { - "version": "7.39.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.39.0.tgz", - "integrity": "sha512-45WJIcWWCQnZ8zhHtcrkJjQ4YydmzMWY4pmRuBG7Qp+zrCT6ISoyODcjY+SCHFdvXkiYFi8+bFZa1qG3YQnnYw==", + "version": "7.40.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.40.0.tgz", + "integrity": "sha512-OPAobQG0GTY++r5LWUcOA1lS+2TY2Lmw/i5s4kL9WbY+f08dbLNEGNBObY7/V98OL4f7OG+nWaPFybgM7kqUTQ==", "dependencies": { - "@sentry/types": "7.39.0", - "@sentry/utils": "7.39.0", + "@sentry/types": "7.40.0", + "@sentry/utils": "7.40.0", "tslib": "^1.9.3" }, "engines": { @@ -2830,19 +3019,19 @@ } }, "node_modules/@sentry/node/node_modules/@sentry/types": { - "version": "7.39.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.39.0.tgz", - "integrity": "sha512-5Y83Y8O3dT5zT2jTKEIPMcpn5lUm05KRMaCXuw0sRsv4r9TbBUKeqiSU1LjowT8rB/XNy8m7DHav8+NmogPaJw==", + "version": "7.40.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.40.0.tgz", + "integrity": "sha512-dIbqBenbmDx1F8pvfC11C88J83ecwumUhV+YOIxcmVd1fmlPF2hXWZ01+NTkTDkCu341sJx4wPQogByFy8FwGA==", "engines": { "node": ">=8" } }, "node_modules/@sentry/node/node_modules/@sentry/utils": { - "version": "7.39.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.39.0.tgz", - "integrity": "sha512-/ZxlPgm1mGgmuMckCTc9iyqDuFTEYNEoMB53IjVFz8ann+37OiWB7Py/QV1rEEsv3xKrGbA8thhRhV9E1sjTlQ==", + "version": "7.40.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.40.0.tgz", + "integrity": "sha512-ZdCbTpAXPiVVfvNJVftnDhsctOui71MDUhVIdLkgg4Cuic+WHGPRmmZ+H6uZdp7vRaeB+Uvnn5+t2iSAVo/mAA==", "dependencies": { - "@sentry/types": "7.39.0", + "@sentry/types": "7.40.0", "tslib": "^1.9.3" }, "engines": { @@ -2855,13 +3044,46 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@sentry/tracing": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.38.0.tgz", - "integrity": "sha512-ejXJp8oOT64MVtBzqdECUUaNzKbpu25St8Klub1i4Sm7xO+ZjDQDI4TIHvWojZvtkwQ3F4jcsCclc8KuyJunyQ==", + "version": "7.39.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.39.0.tgz", + "integrity": "sha512-bSRdUMzp/n54J+Qf4hHC4WVvdv4vZEv3NEbNNsnIZNAhnVAq6QB9VzsGRJZ12PqxJU3StDuqLiZFVOmGxETCkQ==", "dependencies": { - "@sentry/core": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", + "@sentry/core": "7.39.0", + "@sentry/types": "7.39.0", + "@sentry/utils": "7.39.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/core": { + "version": "7.39.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.39.0.tgz", + "integrity": "sha512-45WJIcWWCQnZ8zhHtcrkJjQ4YydmzMWY4pmRuBG7Qp+zrCT6ISoyODcjY+SCHFdvXkiYFi8+bFZa1qG3YQnnYw==", + "dependencies": { + "@sentry/types": "7.39.0", + "@sentry/utils": "7.39.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/types": { + "version": "7.39.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.39.0.tgz", + "integrity": "sha512-5Y83Y8O3dT5zT2jTKEIPMcpn5lUm05KRMaCXuw0sRsv4r9TbBUKeqiSU1LjowT8rB/XNy8m7DHav8+NmogPaJw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/utils": { + "version": "7.39.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.39.0.tgz", + "integrity": "sha512-/ZxlPgm1mGgmuMckCTc9iyqDuFTEYNEoMB53IjVFz8ann+37OiWB7Py/QV1rEEsv3xKrGbA8thhRhV9E1sjTlQ==", + "dependencies": { + "@sentry/types": "7.39.0", "tslib": "^1.9.3" }, "engines": { @@ -2873,31 +3095,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@sentry/types": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.38.0.tgz", - "integrity": "sha512-NKOALR6pNUMzUrsk2m+dkPrO8uGNvNh1LD0BCPswKNjC2qHo1h1mDGCgBmF9+EWyii8ZoACTIsxvsda+MBf97Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.38.0.tgz", - "integrity": "sha512-MgbI3YmYuyyhUtvcXkgGBqjOW+nuLLNGUdWCK+C4kObf8VbLt3dSE/7SEMT6TSHLYQmxs2BxFgx5Agn97m68kQ==", - "dependencies": { - "@sentry/types": "7.38.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils/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/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", @@ -3874,9 +4071,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1323.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1323.0.tgz", - "integrity": "sha512-GoLwk2SuG9A6eWgc1mGmm548dklheDmkeptHRw2RhCvq2GZqlc4AzStFUjUURy4O4NQmd2ZiQIoeseue4RwurA==", + "version": "2.1324.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1324.0.tgz", + "integrity": "sha512-7T9Jn6qtzCANdqRcdhxZ9Fx31/U+h/VPFxEU3+sFEnC7WtGtRlgmsJOY2lIdFKRXkHYT3Jw5MqDyjnb/i1QqbA==", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -7427,9 +7624,9 @@ } }, "node_modules/mongoose": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.10.0.tgz", - "integrity": "sha512-0zrKDEnmNscYyAyN94smo2LlJ63gaezKHpHM+KQ+6EiAgAnah5Kt3hQSYzOTQX/63YNdT1oJXiLlB5LqTdcjUw==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.10.2.tgz", + "integrity": "sha512-9/AbheG2PiVVBWLx3S6LgCIEQNdMppjdnp/WH9nLGjFzjJeb9LiHNPEtsOGOm8qXmuICHMdbn5iUFAsLWWvpEw==", "dependencies": { "bson": "^4.7.0", "kareem": "2.5.1", @@ -12423,15 +12620,15 @@ } }, "@aws-sdk/client-secrets-manager": { - "version": "3.279.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.279.0.tgz", - "integrity": "sha512-1cEXfqDUiS44DSXueb4QhHKa1K9WVWP/FqxYUB11xV0p5jElX88JVHyNPK/XsVbh9S6nS/MGPBIDbVA2y/mt5g==", + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.281.0.tgz", + "integrity": "sha512-vL+LygNDoCja/47pFwSnI3tCWfy5SGHlz6C1whcszmfl81gXyuHNlAK8RXVRiKhnD11zmCsHJhZyYSfTz5RErQ==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.279.0", + "@aws-sdk/client-sts": "3.281.0", "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.279.0", + "@aws-sdk/credential-provider-node": "3.281.0", "@aws-sdk/fetch-http-handler": "3.272.0", "@aws-sdk/hash-node": "3.272.0", "@aws-sdk/invalid-dependency": "3.272.0", @@ -12463,12 +12660,194 @@ "@aws-sdk/util-utf8": "3.254.0", "tslib": "^2.3.1", "uuid": "^8.3.2" + }, + "dependencies": { + "@aws-sdk/client-sso": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.281.0.tgz", + "integrity": "sha512-3RvO5zClQhu37w9VMLoHPGk58S3y8Spb7XX8rW51bm5TUglYQskQ0X2VLEUW/7ZGx/peokHws9Z9+w5yGq5sdA==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.278.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.279.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.279.0", + "@aws-sdk/util-defaults-mode-node": "3.279.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.281.0.tgz", + "integrity": "sha512-P6zf9pDuxApVoCYStAg7L8BU9AcWI8PxfLSX4r2WnmcQropxzPJ3op1j9nvbwwBDMFWephijVY4AVp8MqPcPyg==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.278.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.279.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.279.0", + "@aws-sdk/util-defaults-mode-node": "3.279.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sts": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.281.0.tgz", + "integrity": "sha512-w8QomyhCVEArRcXgOkjbofiS/PLEKWRAyYBovjMS1cGhns2ZYJXFgHNgr3VGE54TghUc5dR1CqKuBKKM4ThrgA==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.281.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.278.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-sdk-sts": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.279.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.279.0", + "@aws-sdk/util-defaults-mode-node": "3.279.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.281.0.tgz", + "integrity": "sha512-H99nhMhHImQKgNhHKYc6usTS6UK8KzCcVGpILLVTuP97YlrYAMFAVstA3Xk6mZ28JAbHVXvI6vJjkMNOzCSKCA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.281.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.281.0.tgz", + "integrity": "sha512-jhddd+lJp8G8hBJ+6glmXjfWJT3nxiE1aliH3fBC4RR3D+1kRXc99Xg6mbUb8bm+GrVZ4gzfiqSgg+ByKjd7xA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.281.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.281.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.281.0.tgz", + "integrity": "sha512-IqJnpXuLpJYoSCf/Rt66/CPVTjfkam3z9+ZvlQJV+VbK+vGj276qEtTmSN3XPZZgF1XbWptvkzIWDszLhHiZmg==", + "requires": { + "@aws-sdk/client-sso": "3.281.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/token-providers": "3.281.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/token-providers": { + "version": "3.281.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.281.0.tgz", + "integrity": "sha512-36Vg/F6Edm7qdjcTeNVON+sK2edgHhmhTtAEjWcuUk5AX/Et+Ate/A2N8HD3nxwlAcgidfnBC9SHYJatbhcEnQ==", + "requires": { + "@aws-sdk/client-sso-oidc": "3.281.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + } } }, "@aws-sdk/client-sso": { "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.279.0.tgz", "integrity": "sha512-599Y5wOrkpjD6p0BTs0X4+Ge9O7jlAPJ2ttI9lfhT2/UEZyqoJHajJs1pMJV75oeZklPOBi8G9jnZcMVJgRpvQ==", + "optional": true, "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -12508,6 +12887,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.279.0.tgz", "integrity": "sha512-tC9xKGo3z/HQbJDMvaUrnBSSRX7sOX2YUA2OpJ3T1TTfylLTO70OKjg1G4OMFNiPpJsHonwD7Iud+rnMnUKI0g==", + "optional": true, "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -12547,6 +12927,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.279.0.tgz", "integrity": "sha512-y/cI5Gg5WWqmSSDQftCT26wOLu0HSuPY1u6Q4Q97FBIfRC3hYztjYdUDHuTu6qPPT+tdsnWOUy2tr3qamVSQ4g==", + "optional": true, "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -12636,6 +13017,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.279.0.tgz", "integrity": "sha512-FCpr3/khMTb2pWLMC138wU7HzcpkrjejrBNfCJSUu7Emxm039UMLjT2JObnRKxidKlz58oYBRayVIbBYRWREcg==", + "optional": true, "requires": { "@aws-sdk/credential-provider-env": "3.272.0", "@aws-sdk/credential-provider-imds": "3.272.0", @@ -12652,6 +13034,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.279.0.tgz", "integrity": "sha512-7D8ETopCt3H+x2BEPMEhzc4dcNtSK7umnRdgfiTGRjcQSVPh5Whq/tDIAtNj2D+PmLgu3e+Hk7jrXkaMCDlxMw==", + "optional": true, "requires": { "@aws-sdk/credential-provider-env": "3.272.0", "@aws-sdk/credential-provider-imds": "3.272.0", @@ -12680,6 +13063,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.279.0.tgz", "integrity": "sha512-u8ZHz9Sv7sAv2vllyzcdgcO1pC5pa2UuoYKfz9J8hqLHc8VJYtYQ6WJvi4GoA55VDPk87pyVYz9t6ATntsukaw==", + "optional": true, "requires": { "@aws-sdk/client-sso": "3.279.0", "@aws-sdk/property-provider": "3.272.0", @@ -12985,6 +13369,7 @@ "version": "3.279.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.279.0.tgz", "integrity": "sha512-bsUlZSizTXZ8Pehdatcioi8VphxYn7fRjo5L083peOvBjoL+9WSGyP74PLrFLNwA35QxddwOqgnpQZoE1heuPQ==", + "optional": true, "requires": { "@aws-sdk/client-sso-oidc": "3.279.0", "@aws-sdk/property-provider": "3.272.0", @@ -14376,16 +14761,44 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, - "@sentry/core": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.38.0.tgz", - "integrity": "sha512-+hXh/SO3Ie6WC2b+wi01xLhyVREdkRXS5QBmCiv3z2ks2HvYXp7PoKSXJvNKiwCP+pBD+enOnM1YEzM2yEy5yw==", + "@sentry/node": { + "version": "7.40.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.40.0.tgz", + "integrity": "sha512-S2pcLBUsCg3+WYlyQbXKPey3H1yaZPt9fpJTPAoabbidYXweBAbtFjSCRwPFwCQMzWusWxlYEwWRT77C07pHVg==", "requires": { - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", + "@sentry/core": "7.40.0", + "@sentry/types": "7.40.0", + "@sentry/utils": "7.40.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", "tslib": "^1.9.3" }, "dependencies": { + "@sentry/core": { + "version": "7.40.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.40.0.tgz", + "integrity": "sha512-OPAobQG0GTY++r5LWUcOA1lS+2TY2Lmw/i5s4kL9WbY+f08dbLNEGNBObY7/V98OL4f7OG+nWaPFybgM7kqUTQ==", + "requires": { + "@sentry/types": "7.40.0", + "@sentry/utils": "7.40.0", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "7.40.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.40.0.tgz", + "integrity": "sha512-dIbqBenbmDx1F8pvfC11C88J83ecwumUhV+YOIxcmVd1fmlPF2hXWZ01+NTkTDkCu341sJx4wPQogByFy8FwGA==" + }, + "@sentry/utils": { + "version": "7.40.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.40.0.tgz", + "integrity": "sha512-ZdCbTpAXPiVVfvNJVftnDhsctOui71MDUhVIdLkgg4Cuic+WHGPRmmZ+H6uZdp7vRaeB+Uvnn5+t2iSAVo/mAA==", + "requires": { + "@sentry/types": "7.40.0", + "tslib": "^1.9.3" + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -14393,17 +14806,14 @@ } } }, - "@sentry/node": { + "@sentry/tracing": { "version": "7.39.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.39.0.tgz", - "integrity": "sha512-oe1OBxgs6t/FizjxkSPtuvJv5wJMO+mLENZkiE0PpBD56JyZrWK48kYIt2ccWAfk6Vh235/oIpmqET150xB4lQ==", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.39.0.tgz", + "integrity": "sha512-bSRdUMzp/n54J+Qf4hHC4WVvdv4vZEv3NEbNNsnIZNAhnVAq6QB9VzsGRJZ12PqxJU3StDuqLiZFVOmGxETCkQ==", "requires": { "@sentry/core": "7.39.0", "@sentry/types": "7.39.0", "@sentry/utils": "7.39.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", "tslib": "^1.9.3" }, "dependencies": { @@ -14438,45 +14848,6 @@ } } }, - "@sentry/tracing": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.38.0.tgz", - "integrity": "sha512-ejXJp8oOT64MVtBzqdECUUaNzKbpu25St8Klub1i4Sm7xO+ZjDQDI4TIHvWojZvtkwQ3F4jcsCclc8KuyJunyQ==", - "requires": { - "@sentry/core": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/types": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.38.0.tgz", - "integrity": "sha512-NKOALR6pNUMzUrsk2m+dkPrO8uGNvNh1LD0BCPswKNjC2qHo1h1mDGCgBmF9+EWyii8ZoACTIsxvsda+MBf97Q==" - }, - "@sentry/utils": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.38.0.tgz", - "integrity": "sha512-MgbI3YmYuyyhUtvcXkgGBqjOW+nuLLNGUdWCK+C4kObf8VbLt3dSE/7SEMT6TSHLYQmxs2BxFgx5Agn97m68kQ==", - "requires": { - "@sentry/types": "7.38.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", @@ -15226,9 +15597,9 @@ "integrity": "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==" }, "aws-sdk": { - "version": "2.1323.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1323.0.tgz", - "integrity": "sha512-GoLwk2SuG9A6eWgc1mGmm548dklheDmkeptHRw2RhCvq2GZqlc4AzStFUjUURy4O4NQmd2ZiQIoeseue4RwurA==", + "version": "2.1324.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1324.0.tgz", + "integrity": "sha512-7T9Jn6qtzCANdqRcdhxZ9Fx31/U+h/VPFxEU3+sFEnC7WtGtRlgmsJOY2lIdFKRXkHYT3Jw5MqDyjnb/i1QqbA==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -17914,9 +18285,9 @@ } }, "mongoose": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.10.0.tgz", - "integrity": "sha512-0zrKDEnmNscYyAyN94smo2LlJ63gaezKHpHM+KQ+6EiAgAnah5Kt3hQSYzOTQX/63YNdT1oJXiLlB5LqTdcjUw==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.10.2.tgz", + "integrity": "sha512-9/AbheG2PiVVBWLx3S6LgCIEQNdMppjdnp/WH9nLGjFzjJeb9LiHNPEtsOGOm8qXmuICHMdbn5iUFAsLWWvpEw==", "requires": { "bson": "^4.7.0", "kareem": "2.5.1", diff --git a/backend/package.json b/backend/package.json index 3d36797a5..af252211b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,14 +1,14 @@ { "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.267.0", + "@aws-sdk/client-secrets-manager": "^3.281.0", "@godaddy/terminus": "^4.11.2", "@octokit/rest": "^19.0.5", - "@sentry/node": "^7.39.0", - "@sentry/tracing": "^7.19.0", + "@sentry/tracing": "^7.39.0", + "@sentry/node": "^7.40.0", "@types/crypto-js": "^4.1.1", "@types/libsodium-wrappers": "^0.7.10", "await-to-js": "^3.0.0", - "aws-sdk": "^2.1311.0", + "aws-sdk": "^2.1324.0", "axios": "^1.1.3", "axios-retry": "^3.4.0", "bcrypt": "^5.1.0", @@ -29,7 +29,7 @@ "jsrp": "^0.2.4", "libsodium-wrappers": "^0.7.10", "lodash": "^4.17.21", - "mongoose": "^6.7.2", + "mongoose": "^6.10.2", "nodemailer": "^6.8.0", "posthog-node": "^2.5.4", "query-string": "^7.1.3", @@ -57,7 +57,7 @@ "lint-and-fix": "eslint . --ext .ts --fix", "lint-staged": "lint-staged", "pretest": "docker compose -f test-resources/docker-compose.test.yml up -d", - "test": "cross-env NODE_ENV=test jest --testTimeout=10000 --detectOpenHandles", + "test": "cross-env NODE_ENV=test jest --verbose --testTimeout=10000 --detectOpenHandles", "test:ci": "npm test -- --watchAll=false --ci --reporters=default --reporters=jest-junit --reporters=github-actions --coverage --testLocationInResults --json --outputFile=coverage/report.json", "posttest": "docker compose -f test-resources/docker-compose.test.yml down" }, diff --git a/backend/tests/example.test.ts b/backend/tests/example.test.ts deleted file mode 100644 index 6d38025a5..000000000 --- a/backend/tests/example.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { it, expect } from '@jest/globals'; - -it('should return true', () => { - expect(true).toBeTruthy(); -}); diff --git a/backend/tests/utils/crypto.test.ts b/backend/tests/utils/crypto.test.ts new file mode 100644 index 000000000..aea5f5f26 --- /dev/null +++ b/backend/tests/utils/crypto.test.ts @@ -0,0 +1,251 @@ +import { describe, test, expect } from '@jest/globals'; +import { + decryptAsymmetric, + decryptSymmetric, + encryptAsymmetric, + encryptSymmetric +} from '../../src/utils/crypto'; + +describe('Crypto', () => { + describe('encryptAsymmetric', () => { + describe('given all valid publicKey, privateKey and plaintext', () => { + const publicKey = '6U5m6S5jlyazJ+R4z7Yf/Ah4th4JwKxDN8Wn7+upvzw='; + const privateKey = 'Z8W53YV+2ddjJCrFwzptjK96y2QsQI9oXuvfcx+qxz0='; + const plaintext = 'secret-message'; + + test('should encrypt plain text', () => { + const result = encryptAsymmetric({ plaintext, publicKey, privateKey }); + expect(result.ciphertext).toBeDefined(); + expect(result.nonce).toBeDefined(); + }); + }); + + describe('given empty/undefined publicKey', () => { + let publicKey: string; + const privateKey = 'Z8W53YV+2ddjJCrFwzptjK96y2QsQI9oXuvfcx+qxz0='; + const plaintext = 'secret-message'; + + test('should throw error if publicKey is undefined', () => { + expect(() => { + encryptAsymmetric({ plaintext, publicKey, privateKey }); + }).toThrowError('Failed to perform asymmetric encryption'); + }); + + test('should throw error if publicKey is empty string', () => { + publicKey = ''; + expect(() => { + encryptAsymmetric({ plaintext, publicKey, privateKey }); + }).toThrowError('Failed to perform asymmetric encryption'); + }); + }); + + describe('given empty/undefined privateKey', () => { + const publicKey = '6U5m6S5jlyazJ+R4z7Yf/Ah4th4JwKxDN8Wn7+upvzw='; + let privateKey: string; + const plaintext = 'secret-message'; + + test('should throw error if privateKey is undefined', () => { + expect(() => { + encryptAsymmetric({ plaintext, publicKey, privateKey }); + }).toThrowError('Failed to perform asymmetric encryption'); + }); + + test('should throw error if privateKey is empty string', () => { + privateKey = ''; + expect(() => { + encryptAsymmetric({ plaintext, publicKey, privateKey }); + }).toThrowError('Failed to perform asymmetric encryption'); + }); + }); + + describe('given undefined/invalid plaint text', () => { + const publicKey = '6U5m6S5jlyazJ+R4z7Yf/Ah4th4JwKxDN8Wn7+upvzw='; + const privateKey = 'Z8W53YV+2ddjJCrFwzptjK96y2QsQI9oXuvfcx+qxz0='; + let plaintext: string; + + test('should throw error if plaintext is undefined', () => { + expect(() => { + encryptAsymmetric({ plaintext, publicKey, privateKey }); + }).toThrowError('Failed to perform asymmetric encryption'); + }); + + test('should encrypt plaintext containing special characters', () => { + plaintext = '131@#$%235!@#&*(&123sadfkjadjf'; + const result = encryptAsymmetric({ + plaintext, + publicKey, + privateKey + }); + expect(result.ciphertext).toBeDefined(); + expect(result.nonce).toBeDefined(); + }); + }); + }); + + describe('decryptAsymmetric', () => { + describe('given all valid publicKey, privateKey and plaintext', () => { + const publicKey = '6U5m6S5jlyazJ+R4z7Yf/Ah4th4JwKxDN8Wn7+upvzw='; + const privateKey = 'Z8W53YV+2ddjJCrFwzptjK96y2QsQI9oXuvfcx+qxz0='; + const plaintext = 'secret-message'; + + test('should decrypt the encrypted plaintext', () => { + const encryptedResult = encryptAsymmetric({ + plaintext, + publicKey, + privateKey + }); + const ciphertext = encryptedResult.ciphertext; + const nonce = encryptedResult.nonce; + + const decryptedResult = decryptAsymmetric({ + ciphertext, + nonce, + publicKey, + privateKey + }); + + expect(decryptedResult).toBeDefined(); + expect(decryptedResult).toEqual(plaintext); + }); + }); + + describe('given ciphertext or nonce is modified before decrypt', () => { + const publicKey = '6U5m6S5jlyazJ+R4z7Yf/Ah4th4JwKxDN8Wn7+upvzw='; + const privateKey = 'Z8W53YV+2ddjJCrFwzptjK96y2QsQI9oXuvfcx+qxz0='; + const plaintext = 'secret-message'; + + test('should throw error if ciphertext is modified', () => { + const encryptedResult = encryptAsymmetric({ + plaintext, + publicKey, + privateKey + }); + const ciphertext = '=12adfJ@#52af1231=123'; // modified + const nonce = encryptedResult.nonce; + + expect(() => { + decryptAsymmetric({ + ciphertext, + nonce, + publicKey, + privateKey + }); + }).toThrowError('Failed to perform asymmetric decryption'); + }); + + test('should throw error if nonce is modified', () => { + const encryptedResult = encryptAsymmetric({ + plaintext, + publicKey, + privateKey + }); + const ciphertext = encryptedResult.ciphertext; + const nonce = '=12adfJ@#52af1231=123'; // modified + + expect(() => { + decryptAsymmetric({ + ciphertext, + nonce, + publicKey, + privateKey + }); + }).toThrowError('Failed to perform asymmetric decryption'); + }); + }); + }); + + describe('encryptSymmetric', () => { + let plaintext: string; + const key = '7e8ee7e5cc667b9c1829783ad31f36f4'; + + test('should encrypt plaintext with the given key', () => { + plaintext = 'secret-message'; + const { ciphertext, iv, tag } = encryptSymmetric({ plaintext, key }); + expect(ciphertext).toBeDefined(); + expect(iv).toBeDefined(); + expect(tag).toBeDefined(); + }); + + test('should throw an error when plaintext is undefined', () => { + const invalidKey = 'invalid-key'; + expect(() => { + encryptSymmetric({ plaintext, key: invalidKey }); + }).toThrowError('Failed to perform symmetric encryption'); + }); + + test('should throw an error when invalid key is provided', () => { + plaintext = 'secret-message'; + const invalidKey = 'invalid-key'; + + expect(() => { + encryptSymmetric({ plaintext, key: invalidKey }); + }).toThrowError('Failed to perform symmetric encryption'); + }); + }); + + describe('decryptSymmetric', () => { + const plaintext = 'secret-message'; + const key = '7e8ee7e5cc667b9c1829783ad31f36f4'; + const { ciphertext, iv, tag } = encryptSymmetric({ plaintext, key }); + + test('should decrypt encrypted plaintext', () => { + const result = decryptSymmetric({ + ciphertext, + iv, + tag, + key + }); + + expect(result).toBeDefined(); + expect(result).toEqual(plaintext); + }); + + test('should fail if ciphertext is modified', () => { + const modifieldCiphertext = 'abcdefghijklmnopqrstuvwxyz'; + expect(() => { + decryptSymmetric({ + ciphertext: modifieldCiphertext, + iv, + tag, + key + }); + }).toThrowError('Failed to perform symmetric decryption'); + }); + + test('should fail if iv is modified', () => { + const modifiedIv = 'abcdefghijklmnopqrstuvwxyz'; + expect(() => { + decryptSymmetric({ + ciphertext, + iv: modifiedIv, + tag, + key + }); + }).toThrowError('Failed to perform symmetric decryption'); + }); + + test('should fail if tag is modified', () => { + const modifiedTag = 'abcdefghijklmnopqrstuvwxyz'; + expect(() => { + decryptSymmetric({ + ciphertext, + iv, + tag: modifiedTag, + key + }); + }).toThrowError('Failed to perform symmetric decryption'); + }); + + test('should throw an error when decryption fails', () => { + const invalidKey = 'invalid-key'; + expect(() => { + decryptSymmetric({ + ciphertext, + iv, + tag, + key: invalidKey + }); + }).toThrowError('Failed to perform symmetric decryption'); + }); + }); +}); diff --git a/backend/tests/utils/posthog.test.ts b/backend/tests/utils/posthog.test.ts new file mode 100644 index 000000000..a380060b0 --- /dev/null +++ b/backend/tests/utils/posthog.test.ts @@ -0,0 +1,29 @@ +import { describe, test, expect } from '@jest/globals'; +import { getChannelFromUserAgent } from '../../src/utils/posthog'; + +describe('posthog getChannelFromUserAgent', () => { + test("should return 'web' when userAgent includes 'mozilla'", () => { + const userAgent = + 'Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.115 Mobile Safari/537.36'; + const channel = getChannelFromUserAgent(userAgent); + expect(channel).toBe('web'); + }); + + test("should return 'cli'", () => { + const userAgent = 'cli'; + const channel = getChannelFromUserAgent(userAgent); + expect(channel).toBe('cli'); + }); + + test("should return 'k8-operator'", () => { + const userAgent = 'k8-operator'; + const channel = getChannelFromUserAgent(userAgent); + expect(channel).toBe('k8-operator'); + }); + + test('should return undefined if no userAgent', () => { + const userAgent = undefined; + const channel = getChannelFromUserAgent(userAgent); + expect(channel).toBe('other'); + }); +}); diff --git a/cli/go.mod b/cli/go.mod index cfa1ede11..d1aadd208 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -4,7 +4,10 @@ go 1.19 require ( github.com/99designs/keyring v1.2.2 + github.com/mattn/go-isatty v0.0.14 + github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a github.com/muesli/mango-cobra v1.2.0 + github.com/muesli/reflow v0.3.0 github.com/muesli/roff v0.1.0 github.com/spf13/cobra v1.6.1 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d @@ -22,7 +25,6 @@ require ( github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/mattn/go-colorable v0.1.9 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mitchellh/mapstructure v1.3.3 // indirect github.com/mtibben/percent v0.2.1 // indirect diff --git a/cli/go.sum b/cli/go.sum index dc97287db..2b514ea6e 100644 --- a/cli/go.sum +++ b/cli/go.sum @@ -56,6 +56,7 @@ github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8= @@ -63,12 +64,16 @@ github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a h1:jlDOeO5TU0pYlbc/y6PFguab5IjANI0Knrpg3u/ton4= +github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/mango v0.1.0 h1:DZQK45d2gGbql1arsYA4vfg4d7I9Hfx5rX/GCmzsAvI= github.com/muesli/mango v0.1.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4= github.com/muesli/mango-cobra v1.2.0 h1:DQvjzAM0PMZr85Iv9LIMaYISpTOliMEg+uMFtNbYvWg= github.com/muesli/mango-cobra v1.2.0/go.mod h1:vMJL54QytZAJhCT13LPVDfkvCUJ5/4jNUKF/8NC2UjA= github.com/muesli/mango-pflag v0.1.0 h1:UADqbYgpUyRoBja3g6LUL+3LErjpsOwaC9ywvBWe7Sg= github.com/muesli/mango-pflag v0.1.0/go.mod h1:YEQomTxaCUp8PrbhFh10UfbhbQrM/xJ4i2PB8VTLLW0= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= @@ -78,6 +83,7 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -106,7 +112,6 @@ go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAV golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= diff --git a/cli/packages/cmd/secrets.go b/cli/packages/cmd/secrets.go index 95224b24e..69a4539a6 100644 --- a/cli/packages/cmd/secrets.go +++ b/cli/packages/cmd/secrets.go @@ -263,10 +263,10 @@ var secretsSetCmd = &cobra.Command{ } // Print secret operations - headers := []string{"SECRET NAME", "SECRET VALUE", "STATUS"} - rows := [][]string{} + headers := [...]string{"SECRET NAME", "SECRET VALUE", "STATUS"} + rows := [][3]string{} for _, secretOperation := range secretOperations { - rows = append(rows, []string{secretOperation.SecretKey, secretOperation.SecretValue, secretOperation.SecretOperation}) + rows = append(rows, [...]string{secretOperation.SecretKey, secretOperation.SecretValue, secretOperation.SecretOperation}) } visualize.Table(headers, rows) diff --git a/cli/packages/visualize/secrets.go b/cli/packages/visualize/secrets.go index e9ac5d297..7be41020d 100644 --- a/cli/packages/visualize/secrets.go +++ b/cli/packages/visualize/secrets.go @@ -3,12 +3,12 @@ package visualize import "github.com/Infisical/infisical-merge/packages/models" func PrintAllSecretDetails(secrets []models.SingleEnvironmentVariable) { - rows := [][]string{} + rows := [][3]string{} for _, secret := range secrets { - rows = append(rows, []string{secret.Key, secret.Value, secret.Type}) + rows = append(rows, [...]string{secret.Key, secret.Value, secret.Type}) } - headers := []string{"SECRET NAME", "SECRET VALUE", "SECRET TYPE"} + headers := [...]string{"SECRET NAME", "SECRET VALUE", "SECRET TYPE"} Table(headers, rows) } diff --git a/cli/packages/visualize/visualize.go b/cli/packages/visualize/visualize.go index 5658197ee..8599f2405 100644 --- a/cli/packages/visualize/visualize.go +++ b/cli/packages/visualize/visualize.go @@ -2,8 +2,14 @@ package visualize import ( "os" + "strings" "github.com/jedib0t/go-pretty/table" + "github.com/mattn/go-isatty" + "github.com/muesli/ansi" + "github.com/muesli/reflow/truncate" + log "github.com/sirupsen/logrus" + "golang.org/x/term" ) type TableOptions struct { @@ -16,8 +22,35 @@ type TableOptions struct { // } // } +const ( + // combined width of the table borders and padding + borderWidths = 10 + // char to indicate that a string has been truncated + ellipsis = "…" +) + // Given headers and rows, this function will print out a table -func Table(headers []string, rows [][]string) { +func Table(headers [3]string, rows [][3]string) { + // if we're not in a terminal or cygwin terminal, don't truncate the secret value + shouldTruncate := isatty.IsTerminal(os.Stdout.Fd()) + + // This will return an error if we're not in a terminal or + // if the terminal is a cygwin terminal like Git Bash. + width, _, err := term.GetSize(int(os.Stdout.Fd())) + if err != nil { + if shouldTruncate { + log.Errorf("error getting terminal size: %s", err) + } else { + log.Debug(err) + } + } + + longestSecretName, longestSecretType := getLongestValues(append(rows, headers)) + availableWidth := width - longestSecretName - longestSecretType - borderWidths + if availableWidth < 0 { + availableWidth = 0 + } + t := table.NewWriter() t.SetOutputMirror(os.Stdout) t.SetStyle(table.StyleLight) @@ -35,7 +68,11 @@ func Table(headers []string, rows [][]string) { t.AppendHeader(tableHeaders) for _, row := range rows { tableRow := table.Row{} - for _, val := range row { + for i, val := range row { + // only truncate the first column (secret value) + if i == 1 && stringWidth(val) > availableWidth && shouldTruncate { + val = truncate.StringWithTail(val, uint(availableWidth), ellipsis) + } tableRow = append(tableRow, val) } t.AppendRow(tableRow) @@ -43,3 +80,28 @@ func Table(headers []string, rows [][]string) { t.Render() } + +// getLongestValues returns the length of the longest secret name and type from all rows (including the header). +func getLongestValues(rows [][3]string) (longestSecretName, longestSecretType int) { + for _, row := range rows { + if len(row[0]) > longestSecretName { + longestSecretName = stringWidth(row[0]) + } + if len(row[2]) > longestSecretType { + longestSecretType = stringWidth(row[2]) + } + } + return +} + +// stringWidth returns the width of a string. +// ANSI escape sequences are ignored and double-width characters are handled correctly. +func stringWidth(str string) (width int) { + for _, l := range strings.Split(str, "\n") { + w := ansi.PrintableRuneWidth(l) + if w > width { + width = w + } + } + return width +} diff --git a/docs/cli/faq.mdx b/docs/cli/faq.mdx index daeeb6458..80229de01 100644 --- a/docs/cli/faq.mdx +++ b/docs/cli/faq.mdx @@ -4,7 +4,7 @@ description: "Frequently Asked Questions about Infisical" --- Frequently asked questions about the CLI can be found on this page. -If you can't find the answer you're looking for, please create an issue on our GitHub repository or join our Slack channel for additional support. +If you can't find the answer you are looking for, please create an issue on our GitHub repository or join our Slack channel for additional support. By default, the CLI will choose the most suitable store available on your system. @@ -22,4 +22,4 @@ Yes. If you have previously retrieved secrets for a specific project and environ Yes. This is simply a configuration file and contains no sensitive data. - \ No newline at end of file + diff --git a/docs/self-hosting/configuration/envars.mdx b/docs/self-hosting/configuration/envars.mdx index 6786eef08..6bcb67d55 100644 --- a/docs/self-hosting/configuration/envars.mdx +++ b/docs/self-hosting/configuration/envars.mdx @@ -11,27 +11,27 @@ Other environment variables are listed below to increase the functionality of yo - Must be a random 32 character length hex string + Must be a random 16 byte hex string. Can be generated with `openssl rand -hex 16` - Must be a random 32 character length hex string + Must be a random 16 byte hex string. Can be generated with `openssl rand -hex 16` - Must be a random 32 character length hex string + Must be a random 16 byte hex string. Can be generated with `openssl rand -hex 16` - Must be a random 32 character length hex string + Must be a random 16 byte hex string. Can be generated with `openssl rand -hex 16` - Must be a random 32 character length hex string + Must be a random 16 byte hex string. Can be generated with `openssl rand -hex 16` - Must be a random 32 character length hex string + Must be a random 16 byte hex string. Can be generated with `openssl rand -hex 16` diff --git a/docs/self-hosting/overview.mdx b/docs/self-hosting/overview.mdx index 216b02d0e..f149f9663 100644 --- a/docs/self-hosting/overview.mdx +++ b/docs/self-hosting/overview.mdx @@ -38,7 +38,7 @@ Self-hosted Infisical allows you to maintain your sensitive information within y #### 1. Fill our environment variables Before you can deploy the Helm chart, you must fill out the required environment variables. To do so, please copy the below file to a `.yaml` file. - Refer to the available [environment variables](../../self-hosting/configuration/envars) to learn more + Refer to the available [environment variables](/self-hosting/configuration/envars) to learn more [View all available Helm chart values parameters](https://github.com/Infisical/infisical/tree/main/helm-charts/infisical) @@ -178,7 +178,7 @@ Self-hosted Infisical allows you to maintain your sensitive information within y mkdir nginx && wget -O ./nginx/default.conf https://raw.githubusercontent.com/Infisical/infisical/main/nginx/default.dev.conf ``` - 3. Tweak the `.env` according to your preferences. Refer to the available [environment variables](../../self-hosting/configuration/envars) + 3. Tweak the `.env` according to your preferences. Refer to the available [environment variables](/self-hosting/configuration/envars) ```bash # update environment variables like mongo login @@ -195,4 +195,4 @@ Self-hosted Infisical allows you to maintain your sensitive information within y 5. Your Infisical installation is complete and should be running on [http://localhost:80](http://localhost:80). Please note that the containers are not exposed to the internet and only bind to the localhost. It's up to you to configure a firewall, SSL certificates, and implement any additional security measures. - \ No newline at end of file + diff --git a/frontend/src/views/Settings/OrgSettingsPage/OrgSettingsPage.tsx b/frontend/src/views/Settings/OrgSettingsPage/OrgSettingsPage.tsx index f73249196..d3f8ba628 100644 --- a/frontend/src/views/Settings/OrgSettingsPage/OrgSettingsPage.tsx +++ b/frontend/src/views/Settings/OrgSettingsPage/OrgSettingsPage.tsx @@ -52,12 +52,12 @@ export const OrgSettingsPage = () => { const addIncidentContact = useAddIncidentContact(); const removeIncidentContact = useDeleteIncidentContact(); - const [completeInviteLink, setcompleteInviteLink] = useState("") + const [completeInviteLink, setcompleteInviteLink] = useState(''); const isMoreUsersNotAllowed = (orgUsers || []).length >= 5 && subscriptionPlan === plans.starter && - host === 'https://app.infisical.com' && + host === 'https://app.infisical.com' && currentWorkspace?._id !== '63ea8121b6e2b0543ba79616'; const onRenameOrg = async (name: string) => { @@ -84,7 +84,7 @@ export const OrgSettingsPage = () => { try { await removeUserOrgMembership.mutateAsync({ orgId: currentOrg?._id, membershipId }); createNotification({ - text: 'Successfully removed used from org', + text: 'Successfully removed user from org', type: 'success' }); } catch (error) { @@ -99,11 +99,14 @@ export const OrgSettingsPage = () => { if (!currentOrg?._id) return; try { - const {data} = await addUserToOrg.mutateAsync({ organizationId: currentOrg?._id, inviteeEmail: email }); - setcompleteInviteLink(data?.completeInviteLink) + const { data } = await addUserToOrg.mutateAsync({ + organizationId: currentOrg?._id, + inviteeEmail: email + }); + setcompleteInviteLink(data?.completeInviteLink); // only show this notification when email is configured. A [completeInviteLink] will not be sent if smtp is configured - if (!data.completeInviteLink){ + if (!data.completeInviteLink) { createNotification({ text: 'Successfully invited user to the organization.', type: 'success'