diff --git a/package-lock.json b/package-lock.json index 8ca9457429f..e0aede4611c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38697,9 +38697,9 @@ "link": true }, "node_modules/mongodb-connection-string-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.3.2.tgz", - "integrity": "sha512-2LkmS0ny7LamAyhEs2Q+zuFFxeGNSc2DaGHBevjqkoPt7bgh+67mg1sFU6awnMsdLKpdEt7zUy466K9x7RsYcQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.1.tgz", + "integrity": "sha512-d5Kd2bVsKcSA7YI/yo57fSTtMwRQdFkvc5IZwod1RRxJtECeWPPSo7zqcUGJELifRA//Igs4spVtYAmvFCatug==", "dependencies": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -63751,7 +63751,7 @@ "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-model": "^21.10.0", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "mongodb-runner": "^4.8.3", "mongodb-shell-to-url": "^0.1.0", @@ -69657,7 +69657,7 @@ "lodash.values": "^4.3.0", "lodash.zipobject": "^4.1.3", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.3.2" + "mongodb-connection-string-url": "^2.4.1" }, "devDependencies": { "@babel/cli": "^7.14.3", @@ -98702,7 +98702,7 @@ "version": "0.3.0", "license": "SSPL", "dependencies": { - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "react": "*", "react-dom": "*" }, @@ -98726,6 +98726,7 @@ "eslint": "^7.25.0", "gen-esm-wrapper": "^1.1.0", "mocha": "^8.4.0", + "mongodb": "^4.2.2", "mongodb-data-service": "^21.14.0", "nyc": "^15.1.0", "prettier": "2.3.2", @@ -99075,7 +99076,7 @@ "ampersand-rest-collection": "^6.0.0", "debug": "4.3.0", "lodash": "^4.17.15", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb3": "npm:mongodb@^3.6.3", "raf": "^3.4.1", "resolve-mongodb-srv": "^1.1.1", @@ -99496,7 +99497,7 @@ "mocha": "^8.4.0", "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "nyc": "^15.1.0", "prettier": "2.3.2", @@ -99858,7 +99859,7 @@ "get-port": "^5.1.1", "lodash": "^4.17.20", "mongodb-build-info": "^1.3.0", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-index-model": "^3.7.0", "mongodb-ns": "^2.2.0", "resolve-mongodb-srv": "^1.1.1", @@ -108445,7 +108446,7 @@ "keytar": "^7.7.0", "lodash": "^4.17.21", "minimist": "^1.2.5", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "ora": "^5.4.0", "pacote": "^11.3.5", @@ -118093,7 +118094,7 @@ "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-model": "^21.10.0", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "mongodb-runner": "^4.8.3", "mongodb-shell-to-url": "^0.1.0", @@ -118161,7 +118162,7 @@ "mocha": "^8.4.0", "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "nyc": "^15.1.0", "prettier": "2.3.2", @@ -122811,7 +122812,7 @@ "mocha-webpack": "^2.0.0-beta.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-model": "^21.10.0", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-js-metrics": "^7.6.0", "mongodb-reflux-store": "^0.0.1", "mongodb-schema": "^8.2.5", @@ -128819,7 +128820,7 @@ "keytar": "^7.7.0", "lodash": "^4.17.21", "minimist": "^1.2.5", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "ora": "^5.4.0", "pacote": "^11.3.5", @@ -142442,7 +142443,8 @@ "eslint": "^7.25.0", "gen-esm-wrapper": "^1.1.0", "mocha": "^8.4.0", - "mongodb-connection-string-url": "^2.3.2", + "mongodb": "^4.2.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "nyc": "^15.1.0", "prettier": "2.3.2", @@ -178537,7 +178539,7 @@ "mocha": "^8.0.1", "mock-require": "^3.0.3", "mongodb": "^4.2.1", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-runner": "^4.8.3", "mongodb3": "npm:mongodb@^3.6.3", "proxyquire": "^2.1.0", @@ -178820,9 +178822,9 @@ } }, "mongodb-connection-string-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.3.2.tgz", - "integrity": "sha512-2LkmS0ny7LamAyhEs2Q+zuFFxeGNSc2DaGHBevjqkoPt7bgh+67mg1sFU6awnMsdLKpdEt7zUy466K9x7RsYcQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.1.tgz", + "integrity": "sha512-d5Kd2bVsKcSA7YI/yo57fSTtMwRQdFkvc5IZwod1RRxJtECeWPPSo7zqcUGJELifRA//Igs4spVtYAmvFCatug==", "requires": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -178900,7 +178902,7 @@ "mongodb": "^4.2.1", "mongodb-build-info": "^1.3.0", "mongodb-connection-model": "^21.10.0", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-index-model": "^3.7.0", "mongodb-ns": "^2.2.0", "mongodb-runner": "^4.8.3", diff --git a/packages/compass-connect/package.json b/packages/compass-connect/package.json index 645e7a23be4..9911d8c79d8 100644 --- a/packages/compass-connect/package.json +++ b/packages/compass-connect/package.json @@ -108,7 +108,7 @@ "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-model": "^21.10.0", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "mongodb-runner": "^4.8.3", "mongodb-shell-to-url": "^0.1.0", diff --git a/packages/compass-metrics/package.json b/packages/compass-metrics/package.json index 5b45afea615..a8829f21d75 100644 --- a/packages/compass-metrics/package.json +++ b/packages/compass-metrics/package.json @@ -124,7 +124,7 @@ "lodash.values": "^4.3.0", "lodash.zipobject": "^4.1.3", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.3.2" + "mongodb-connection-string-url": "^2.4.1" }, "homepage": "https://github.com/mongodb-js/compass", "bugs": { diff --git a/packages/connect-form/package.json b/packages/connect-form/package.json index 5da746b1a7a..328ef80b930 100644 --- a/packages/connect-form/package.json +++ b/packages/connect-form/package.json @@ -53,7 +53,7 @@ "react-dom": "*" }, "dependencies": { - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "react": "*", "react-dom": "*" }, @@ -78,6 +78,7 @@ "gen-esm-wrapper": "^1.1.0", "mocha": "^8.4.0", "mongodb-data-service": "^21.14.0", + "mongodb": "^4.2.2", "nyc": "^15.1.0", "prettier": "2.3.2", "sinon": "^9.2.3", diff --git a/packages/connect-form/src/components/advanced-options-tabs/general/direct-connection-input.tsx b/packages/connect-form/src/components/advanced-options-tabs/general/direct-connection-input.tsx index 05b665114aa..d260391bde9 100644 --- a/packages/connect-form/src/components/advanced-options-tabs/general/direct-connection-input.tsx +++ b/packages/connect-form/src/components/advanced-options-tabs/general/direct-connection-input.tsx @@ -1,6 +1,7 @@ import React, { useCallback } from 'react'; import { Checkbox, Description } from '@mongodb-js/compass-components'; import ConnectionStringUrl from 'mongodb-connection-string-url'; +import type { MongoClientOptions } from 'mongodb'; import { UpdateConnectionFormField } from '../../../hooks/use-connect-form'; @@ -12,7 +13,9 @@ function DirectConnectionInput({ updateConnectionFormField: UpdateConnectionFormField; }): React.ReactElement { const isDirectConnection = - connectionStringUrl.searchParams.get('directConnection') === 'true'; + connectionStringUrl + .typedSearchParams() + .get('directConnection') === 'true'; const updateDirectConnection = useCallback( (event: React.ChangeEvent) => { diff --git a/packages/connect-form/src/components/advanced-options-tabs/general/host-input.tsx b/packages/connect-form/src/components/advanced-options-tabs/general/host-input.tsx index 7a7e623a514..79f509e9207 100644 --- a/packages/connect-form/src/components/advanced-options-tabs/general/host-input.tsx +++ b/packages/connect-form/src/components/advanced-options-tabs/general/host-input.tsx @@ -8,6 +8,7 @@ import { spacing, } from '@mongodb-js/compass-components'; import ConnectionStringUrl from 'mongodb-connection-string-url'; +import type { MongoClientOptions } from 'mongodb'; import { UpdateConnectionFormField } from '../../../hooks/use-connect-form'; import { ConnectionFormError } from '../../../utils/connect-form-errors'; @@ -44,7 +45,9 @@ function HostInput({ const { isSRV } = connectionStringUrl; const showDirectConnectionInput = - connectionStringUrl.searchParams.get('directConnection') === 'true' || + connectionStringUrl + .typedSearchParams() + .get('directConnection') === 'true' || (!connectionStringUrl.isSRV && hosts.length === 1); useEffect(() => { diff --git a/packages/connect-form/src/hooks/use-connect-form.ts b/packages/connect-form/src/hooks/use-connect-form.ts index f1461567884..eb4379c2755 100644 --- a/packages/connect-form/src/hooks/use-connect-form.ts +++ b/packages/connect-form/src/hooks/use-connect-form.ts @@ -1,6 +1,7 @@ import { useEffect, useReducer } from 'react'; import ConnectionStringUrl from 'mongodb-connection-string-url'; import { ConnectionInfo, ConnectionOptions } from 'mongodb-data-service'; +import type { MongoClientOptions } from 'mongodb'; import { defaultConnectionString } from '../constants/default-connection'; import { @@ -215,6 +216,8 @@ export function handleConnectionFormFieldUpdate({ errors: ConnectionFormError[]; } { const updatedConnectionStringUrl = connectionStringUrl.clone(); + const updatedSearchParams = + updatedConnectionStringUrl.typedSearchParams(); switch (action.type) { case 'add-new-host': { @@ -229,8 +232,8 @@ export function handleConnectionFormFieldUpdate({ 0, newHost ); - if (updatedConnectionStringUrl.searchParams.get('directConnection')) { - updatedConnectionStringUrl.searchParams.delete('directConnection'); + if (updatedSearchParams.get('directConnection')) { + updatedSearchParams.delete('directConnection'); } return { @@ -275,11 +278,9 @@ export function handleConnectionFormFieldUpdate({ case 'update-direct-connection': { const { isDirectConnection } = action; if (isDirectConnection) { - updatedConnectionStringUrl.searchParams.set('directConnection', 'true'); - } else if ( - updatedConnectionStringUrl.searchParams.get('directConnection') - ) { - updatedConnectionStringUrl.searchParams.delete('directConnection'); + updatedSearchParams.set('directConnection', 'true'); + } else if (updatedSearchParams.get('directConnection')) { + updatedSearchParams.delete('directConnection'); } return { diff --git a/packages/connect-form/src/utils/connection-string-schema.ts b/packages/connect-form/src/utils/connection-string-schema.ts index fd2a1ea0ef9..c81522d2997 100644 --- a/packages/connect-form/src/utils/connection-string-schema.ts +++ b/packages/connect-form/src/utils/connection-string-schema.ts @@ -1,4 +1,5 @@ import ConnectionStringUrl from 'mongodb-connection-string-url'; +import type { MongoClientOptions } from 'mongodb'; import { defaultHostname, defaultPort } from '../constants/default-connection'; @@ -10,11 +11,8 @@ function updateConnectionStringToStandard( return connectionStringUrl; } - const newConnectionString = connectionStringUrl.toString(); - - const newConnectionStringUrl = new ConnectionStringUrl( - newConnectionString.replace('mongodb+srv://', 'mongodb://') - ); + const newConnectionStringUrl = connectionStringUrl.clone(); + newConnectionStringUrl.protocol = 'mongodb:'; newConnectionStringUrl.hosts = [ `${newConnectionStringUrl.hosts[0]}:${defaultPort}`, @@ -31,7 +29,7 @@ function updateConnectionStringToSRV( return connectionStringUrl; } - let newConnectionStringUrl = connectionStringUrl.clone(); + const newConnectionStringUrl = connectionStringUrl.clone(); // Only include one host without port. const newHost = @@ -45,14 +43,13 @@ function updateConnectionStringToSRV( : defaultHostname; newConnectionStringUrl.hosts = [newHost]; - const newConnectionString = newConnectionStringUrl.toString(); - newConnectionStringUrl = new ConnectionStringUrl( - newConnectionString.replace('mongodb://', 'mongodb+srv://') - ); + newConnectionStringUrl.protocol = 'mongodb+srv:'; + const searchParams = + newConnectionStringUrl.typedSearchParams(); // SRV connections can't have directConnection set. - if (newConnectionStringUrl.searchParams.get('directConnection')) { - newConnectionStringUrl.searchParams.delete('directConnection'); + if (searchParams.get('directConnection')) { + searchParams.delete('directConnection'); } return newConnectionStringUrl; diff --git a/packages/connection-model/package.json b/packages/connection-model/package.json index f099e045d8f..476fa9a6d89 100644 --- a/packages/connection-model/package.json +++ b/packages/connection-model/package.json @@ -41,7 +41,7 @@ "ampersand-rest-collection": "^6.0.0", "debug": "4.3.0", "lodash": "^4.17.15", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb3": "npm:mongodb@^3.6.3", "raf": "^3.4.1", "resolve-mongodb-srv": "^1.1.1", diff --git a/packages/connections/package.json b/packages/connections/package.json index 4ff9ce376a2..d0e8824ab3f 100644 --- a/packages/connections/package.json +++ b/packages/connections/package.json @@ -82,7 +82,7 @@ "mocha": "^8.4.0", "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "nyc": "^15.1.0", "prettier": "2.3.2", diff --git a/packages/data-service/package.json b/packages/data-service/package.json index 4f486208068..25b83a67935 100644 --- a/packages/data-service/package.json +++ b/packages/data-service/package.json @@ -64,7 +64,7 @@ "get-port": "^5.1.1", "lodash": "^4.17.20", "mongodb-build-info": "^1.3.0", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-index-model": "^3.7.0", "mongodb-ns": "^2.2.0", "resolve-mongodb-srv": "^1.1.1", diff --git a/packages/data-service/src/connect-mongo-client.ts b/packages/data-service/src/connect-mongo-client.ts index 051875ea8a9..b381f662b6a 100644 --- a/packages/data-service/src/connect-mongo-client.ts +++ b/packages/data-service/src/connect-mongo-client.ts @@ -107,29 +107,30 @@ function connectionOptionsToMongoClientParams( connectionOptions: ConnectionOptions ): [string, MongoClientOptions] { const url = new ConnectionStringUrl(connectionOptions.connectionString); + const searchParams = url.typedSearchParams(); const options: MongoClientOptions = { monitorCommands: true, }; // adds directConnection=true unless is explicitly a replica set - const isLoadBalanced = url.searchParams.get('loadBalanced') === 'true'; + const isLoadBalanced = searchParams.get('loadBalanced') === 'true'; const isReplicaSet = - url.isSRV || url.hosts.length > 1 || url.searchParams.has('replicaSet'); - const hasDirectConnection = url.searchParams.has('directConnection'); + url.isSRV || url.hosts.length > 1 || searchParams.has('replicaSet'); + const hasDirectConnection = searchParams.has('directConnection'); if (!isReplicaSet && !isLoadBalanced && !hasDirectConnection) { - url.searchParams.set('directConnection', 'true'); + searchParams.set('directConnection', 'true'); } // See https://jira.mongodb.org/browse/NODE-3591 if ( - !url.searchParams.has('tlsCertificateFile') && - url.searchParams.has('tlsCertificateKeyFile') + !searchParams.has('tlsCertificateFile') && + searchParams.has('tlsCertificateKeyFile') ) { - url.searchParams.set( + searchParams.set( 'tlsCertificateFile', - url.searchParams.get('tlsCertificateKeyFile') as string + searchParams.get('tlsCertificateKeyFile') as string ); } diff --git a/packages/data-service/src/connect.spec.ts b/packages/data-service/src/connect.spec.ts index f75d220854b..c858125ba87 100644 --- a/packages/data-service/src/connect.spec.ts +++ b/packages/data-service/src/connect.spec.ts @@ -6,6 +6,7 @@ import util from 'util'; import ConnectionStringUrl from 'mongodb-connection-string-url'; import path from 'path'; import os from 'os'; +import type { MongoClientOptions } from 'mongodb'; import connect from './connect'; import { ConnectionOptions } from './connection-options'; @@ -32,7 +33,7 @@ const buildConnectionString = ( username: string | undefined, password: string | undefined, host: string | undefined, - params?: Record + params?: MongoClientOptions ): string => { if (!username || !password || !host) { return ''; @@ -213,11 +214,12 @@ describe('connect', function () { const url = new ConnectionStringUrl( `mongodb+srv://${E2E_TESTS_ATLAS_HOST || ''}/admin` ); + const searchParams = url.typedSearchParams(); - url.searchParams.set('authMechanism', 'MONGODB-X509'); - url.searchParams.set('tls', 'true'); - url.searchParams.set('tlsCertificateKeyFile', certPath); - url.searchParams.set('authSource', '$external'); + searchParams.set('authMechanism', 'MONGODB-X509'); + searchParams.set('tls', 'true'); + searchParams.set('tlsCertificateKeyFile', certPath); + searchParams.set('authSource', '$external'); await connectAndGetAuthInfo({ connectionString: url.href, diff --git a/packages/data-service/src/connection-secrets.ts b/packages/data-service/src/connection-secrets.ts index 3ee1d2b187d..d47d0edbaf8 100644 --- a/packages/data-service/src/connection-secrets.ts +++ b/packages/data-service/src/connection-secrets.ts @@ -3,6 +3,7 @@ import ConnectionString, { CommaAndColonSeparatedRecord, } from 'mongodb-connection-string-url'; import { ConnectionInfo } from './connection-info'; +import type { MongoClientOptions, AuthMechanismProperties } from 'mongodb'; export interface ConnectionSecrets { password?: string; @@ -25,6 +26,10 @@ export function mergeSecrets( const connectionOptions = connectionInfoWithSecrets.connectionOptions; const uri = new ConnectionString(connectionOptions.connectionString); + // can remove the proxyPassword addition once we have NODE-3633 + const searchParams = uri.typedSearchParams< + MongoClientOptions & { proxyPassword?: string } + >(); if (secrets.password) { uri.password = secrets.password; @@ -36,24 +41,25 @@ export function mergeSecrets( } if (secrets.tlsCertificateKeyFilePassword) { - uri.searchParams.set( + searchParams.set( 'tlsCertificateKeyFilePassword', secrets.tlsCertificateKeyFilePassword ); } if (secrets.proxyPassword) { - uri.searchParams.set('proxyPassword', secrets.proxyPassword); + searchParams.set('proxyPassword', secrets.proxyPassword); } if (secrets.awsSessionToken) { - const authMechanismProperties = new CommaAndColonSeparatedRecord( - uri.searchParams.get('authMechanismProperties') - ); + const authMechanismProperties = + new CommaAndColonSeparatedRecord( + searchParams.get('authMechanismProperties') + ); authMechanismProperties.set('AWS_SESSION_TOKEN', secrets.awsSessionToken); - uri.searchParams.set( + searchParams.set( 'authMechanismProperties', authMechanismProperties.toString() ); @@ -73,6 +79,10 @@ export function extractSecrets(connectionInfo: Readonly): { const connectionOptions = connectionInfoWithoutSecrets.connectionOptions; const uri = new ConnectionString(connectionOptions.connectionString); + // can remove the proxyPassword addition once we have NODE-3633 + const searchParams = uri.typedSearchParams< + MongoClientOptions & { proxyPassword?: string } + >(); if (uri.password) { secrets.password = uri.password; @@ -85,32 +95,33 @@ export function extractSecrets(connectionInfo: Readonly): { delete connectionOptions.sshTunnel.identityKeyPassphrase; } - if (uri.searchParams.has('tlsCertificateKeyFilePassword')) { + if (searchParams.has('tlsCertificateKeyFilePassword')) { secrets.tlsCertificateKeyFilePassword = - uri.searchParams.get('tlsCertificateKeyFilePassword') || undefined; - uri.searchParams.delete('tlsCertificateKeyFilePassword'); + searchParams.get('tlsCertificateKeyFilePassword') || undefined; + searchParams.delete('tlsCertificateKeyFilePassword'); } - if (uri.searchParams.has('proxyPassword')) { - secrets.proxyPassword = uri.searchParams.get('proxyPassword') || undefined; - uri.searchParams.delete('proxyPassword'); + if (searchParams.has('proxyPassword')) { + secrets.proxyPassword = searchParams.get('proxyPassword') || undefined; + searchParams.delete('proxyPassword'); } - const authMechanismProperties = new CommaAndColonSeparatedRecord( - uri.searchParams.get('authMechanismProperties') - ); + const authMechanismProperties = + new CommaAndColonSeparatedRecord( + searchParams.get('authMechanismProperties') + ); if (authMechanismProperties.has('AWS_SESSION_TOKEN')) { secrets.awsSessionToken = authMechanismProperties.get('AWS_SESSION_TOKEN'); authMechanismProperties.delete('AWS_SESSION_TOKEN'); if (authMechanismProperties.toString()) { - uri.searchParams.set( + searchParams.set( 'authMechanismProperties', authMechanismProperties.toString() ); } else { - uri.searchParams.delete('authMechanismProperties'); + searchParams.delete('authMechanismProperties'); } } diff --git a/packages/data-service/src/legacy/legacy-connection-model.ts b/packages/data-service/src/legacy/legacy-connection-model.ts index b2fa31078a1..ec7a83a3c60 100644 --- a/packages/data-service/src/legacy/legacy-connection-model.ts +++ b/packages/data-service/src/legacy/legacy-connection-model.ts @@ -225,13 +225,13 @@ export function convertConnectionModelToInfo( return info; } -function setConnectionStringParam( +function setConnectionStringParam( connectionOptions: ConnectionOptions, - param: string, + param: K, value: string ) { const url = new ConnectionString(connectionOptions.connectionString); - url.searchParams.set(param, value); + url.typedSearchParams().set(param, value); connectionOptions.connectionString = url.toString(); } @@ -240,13 +240,14 @@ function modelSslPropertiesToConnectionOptions( connectionOptions: ConnectionOptions ): void { const url = new ConnectionString(connectionOptions.connectionString); + const searchParams = url.typedSearchParams(); if (driverOptions.sslValidate === false) { - url.searchParams.set('tlsAllowInvalidCertificates', 'true'); + searchParams.set('tlsAllowInvalidCertificates', 'true'); } if (driverOptions.tlsAllowInvalidHostnames) { - url.searchParams.set('tlsAllowInvalidHostnames', 'true'); + searchParams.set('tlsAllowInvalidHostnames', 'true'); } const sslCA = getSslDriverOptionsFile(driverOptions.sslCA); @@ -254,31 +255,28 @@ function modelSslPropertiesToConnectionOptions( const sslKey = getSslDriverOptionsFile(driverOptions.sslKey); if (sslCA) { - url.searchParams.set('tlsCAFile', sslCA); + searchParams.set('tlsCAFile', sslCA); } // See https://jira.mongodb.org/browse/NODE-3591 and // https://jira.mongodb.org/browse/COMPASS-5058 if (sslCert && sslCert !== sslKey) { - url.searchParams.set('tlsCertificateFile', sslCert); + searchParams.set('tlsCertificateFile', sslCert); } if (sslKey) { - url.searchParams.set('tlsCertificateKeyFile', sslKey); + searchParams.set('tlsCertificateKeyFile', sslKey); } if (driverOptions.sslPass) { - url.searchParams.set( - 'tlsCertificateKeyFilePassword', - driverOptions.sslPass - ); + searchParams.set('tlsCertificateKeyFilePassword', driverOptions.sslPass); } if ( - url.searchParams.get('ssl') === 'true' && - url.searchParams.get('tls') === 'true' + searchParams.get('ssl') === 'true' && + searchParams.get('tls') === 'true' ) { - url.searchParams.delete('ssl'); + searchParams.delete('ssl'); } connectionOptions.connectionString = url.toString(); @@ -382,13 +380,14 @@ function convertSslOptionsToLegacyProperties( properties: Partial ): void { const url = new ConnectionString(options.connectionString); - const tlsCAFile = url.searchParams.get('tlsCAFile'); - const tlsCertificateKeyFile = url.searchParams.get('tlsCertificateKeyFile'); - const tlsCertificateKeyFilePassword = url.searchParams.get( + const searchParams = url.typedSearchParams(); + const tlsCAFile = searchParams.get('tlsCAFile'); + const tlsCertificateKeyFile = searchParams.get('tlsCertificateKeyFile'); + const tlsCertificateKeyFilePassword = searchParams.get( 'tlsCertificateKeyFilePassword' ); - const tlsCertificateFile = url.searchParams.get('tlsCertificateFile'); + const tlsCertificateFile = searchParams.get('tlsCertificateFile'); if (tlsCAFile) { properties.sslCA = [tlsCAFile]; @@ -411,18 +410,17 @@ function convertSslOptionsToLegacyProperties( function optionsToSslMethod(options: ConnectionOptions): SslMethod { const url = new ConnectionString(options.connectionString); - const tls = url.searchParams.get('tls') || url.searchParams.get('ssl'); + const searchParams = url.typedSearchParams(); + const tls = searchParams.get('tls') || searchParams.get('ssl'); - const tlsAllowInvalidCertificates = url.searchParams.get( + const tlsAllowInvalidCertificates = searchParams.get( 'tlsAllowInvalidCertificates' ); - const tlsAllowInvalidHostnames = url.searchParams.get( - 'tlsAllowInvalidHostnames' - ); + const tlsAllowInvalidHostnames = searchParams.get('tlsAllowInvalidHostnames'); - const tlsInsecure = url.searchParams.get('tlsInsecure'); - const tlsCAFile = url.searchParams.get('tlsCAFile'); - const tlsCertificateKeyFile = url.searchParams.get('tlsCertificateKeyFile'); + const tlsInsecure = searchParams.get('tlsInsecure'); + const tlsCAFile = searchParams.get('tlsCAFile'); + const tlsCertificateKeyFile = searchParams.get('tlsCertificateKeyFile'); if (tls === 'false') { return 'NONE'; @@ -453,10 +451,11 @@ function optionsToSslMethod(options: ConnectionOptions): SslMethod { // as unauthenticated. function removeAWSParams(connectionString: string): string { const url = new ConnectionString(connectionString); + const searchParams = url.typedSearchParams(); - if (url.searchParams.get('authMechanism') === 'MONGODB-AWS') { - url.searchParams.delete('authMechanism'); - url.searchParams.delete('authMechanismProperties'); + if (searchParams.get('authMechanism') === 'MONGODB-AWS') { + searchParams.delete('authMechanism'); + searchParams.delete('authMechanismProperties'); } return url.href; diff --git a/scripts/package.json b/scripts/package.json index bbf0584fee1..59d4059321e 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -41,7 +41,7 @@ "keytar": "^7.7.0", "lodash": "^4.17.21", "minimist": "^1.2.5", - "mongodb-connection-string-url": "^2.3.2", + "mongodb-connection-string-url": "^2.4.1", "mongodb-data-service": "^21.14.0", "ora": "^5.4.0", "pacote": "^11.3.5",