diff --git a/package-lock.json b/package-lock.json index 0f9cd436821..766a4306d7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39331,9 +39331,9 @@ "link": true }, "node_modules/mongodb-connection-string-url": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.2.tgz", - "integrity": "sha512-mZUXF6nUzRWk5J3h41MsPv13ukWlH4jOMSk6astVeoZ1EbdTJyF5I3wxKkvqBAOoVtzLgyEYUvDjrGdcPlKjAw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", "dependencies": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -64171,7 +64171,7 @@ "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-model": "^21.13.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "mongodb-runner": "^4.8.3", "mongodb-shell-to-url": "^0.1.0", @@ -64270,7 +64270,7 @@ "mocha": "^8.4.0", "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "nyc": "^15.1.0", "prettier": "2.3.2", @@ -65661,7 +65661,7 @@ "lodash": "^4.17.21", "mocha": "*", "mongodb": "^4.4.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-log-writer": "^1.1.4", "mongodb-runner": "^4.8.3", "prettier": "*", @@ -66924,7 +66924,7 @@ "@mongodb-js/compass-logging": "^0.8.0", "@mongodb-js/mongodb-redux-common": "^1.9.0", "js-beautify": "^1.10.2", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "react-select-plus": "^1.2.0", "redux-thunk": "^2.3.0" }, @@ -71204,7 +71204,7 @@ "lodash.values": "^4.3.0", "lodash.zipobject": "^4.1.3", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.4.2" + "mongodb-connection-string-url": "^2.5.1" }, "devDependencies": { "@babel/cli": "^7.14.3", @@ -95653,7 +95653,7 @@ "@testing-library/react-hooks": "^7.0.2", "lodash": "^4.17.21", "mongodb-build-info": "^1.4.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "react": "^16.14.0", "react-dom": "^16.14.0" }, @@ -96025,7 +96025,7 @@ "ampersand-rest-collection": "^6.0.0", "debug": "4.3.0", "lodash": "^4.17.15", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb3": "npm:mongodb@^3.6.3", "os-dns-native": "^1.1.2", "raf": "^3.4.1", @@ -96479,7 +96479,7 @@ "lodash": "^4.17.20", "mongodb-build-info": "^1.3.0", "mongodb-connection-model": "^21.13.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-index-model": "^3.9.0", "mongodb-ns": "^2.3.0", "uuid": "^8.3.2" @@ -106025,7 +106025,7 @@ "keytar": "^7.7.0", "lodash": "^4.17.21", "minimist": "^1.2.5", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "ora": "^5.4.0", "pacote": "^11.3.5", @@ -116082,7 +116082,7 @@ "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-model": "^21.13.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "mongodb-runner": "^4.8.3", "mongodb-shell-to-url": "^0.1.0", @@ -116152,7 +116152,7 @@ "mongodb": "^4.4.0", "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "nyc": "^15.1.0", "prettier": "2.3.2", @@ -117786,7 +117786,7 @@ "mocha-webpack": "^2.0.0-beta.0", "mongodb-ace-theme": "^1.6.0", "mongodb-connection-model": "^21.13.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "mongodb-ns": "^2.3.0", "mongodb-reflux-store": "^0.0.1", @@ -120999,7 +120999,7 @@ "mocha-webpack": "^2.0.0-beta.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-model": "^21.13.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.1", "mongodb-js-metrics": "^7.8.0", "mongodb-reflux-store": "^0.0.1", "mongodb-schema": "^8.2.5", @@ -127251,7 +127251,7 @@ "keytar": "^7.7.0", "lodash": "^4.17.21", "minimist": "^1.2.5", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "ora": "^5.4.0", "pacote": "^11.3.5", @@ -137106,7 +137106,7 @@ "mocha": "^8.4.0", "mongodb": "^4.4.0", "mongodb-build-info": "^1.4.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "nyc": "^15.1.0", "prettier": "2.3.2", @@ -149800,7 +149800,7 @@ "mocha": "*", "mongodb": "^4.4.0", "mongodb-compass": "^0.0.0-dev.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-log-writer": "^1.1.4", "mongodb-runner": "^4.8.3", "prettier": "*", @@ -174427,7 +174427,7 @@ "mocha": "^8.0.1", "mock-require": "^3.0.3", "mongodb": "^4.4.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-runner": "^4.8.3", "mongodb3": "npm:mongodb@^3.6.3", "os-dns-native": "^1.1.2", @@ -174711,9 +174711,9 @@ } }, "mongodb-connection-string-url": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.2.tgz", - "integrity": "sha512-mZUXF6nUzRWk5J3h41MsPv13ukWlH4jOMSk6astVeoZ1EbdTJyF5I3wxKkvqBAOoVtzLgyEYUvDjrGdcPlKjAw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", "requires": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -174791,7 +174791,7 @@ "mongodb": "^4.4.0", "mongodb-build-info": "^1.3.0", "mongodb-connection-model": "^21.13.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-index-model": "^3.9.0", "mongodb-ns": "^2.3.0", "mongodb-runner": "^4.8.3", diff --git a/packages/compass-connect/package.json b/packages/compass-connect/package.json index ea7c589a7b0..20e8a8b63a7 100644 --- a/packages/compass-connect/package.json +++ b/packages/compass-connect/package.json @@ -106,7 +106,7 @@ "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-model": "^21.13.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "mongodb-runner": "^4.8.3", "mongodb-shell-to-url": "^0.1.0", diff --git a/packages/compass-connections/package.json b/packages/compass-connections/package.json index 329bbf93122..cbcabd91e78 100644 --- a/packages/compass-connections/package.json +++ b/packages/compass-connections/package.json @@ -84,7 +84,7 @@ "mocha": "^8.4.0", "mongodb-build-info": "^1.3.0", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "nyc": "^15.1.0", "prettier": "2.3.2", diff --git a/packages/compass-e2e-tests/package.json b/packages/compass-e2e-tests/package.json index cf6e3ff3646..381aaad403e 100644 --- a/packages/compass-e2e-tests/package.json +++ b/packages/compass-e2e-tests/package.json @@ -56,7 +56,7 @@ "lodash": "^4.17.21", "mocha": "*", "mongodb": "^4.4.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-log-writer": "^1.1.4", "mongodb-runner": "^4.8.3", "prettier": "*", diff --git a/packages/compass-export-to-language/package.json b/packages/compass-export-to-language/package.json index 0fe3b33b0cd..b4db1ef7572 100644 --- a/packages/compass-export-to-language/package.json +++ b/packages/compass-export-to-language/package.json @@ -127,7 +127,7 @@ "@mongodb-js/compass-logging": "^0.8.0", "@mongodb-js/mongodb-redux-common": "^1.9.0", "js-beautify": "^1.10.2", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "react-select-plus": "^1.2.0", "redux-thunk": "^2.3.0" }, diff --git a/packages/compass-metrics/package.json b/packages/compass-metrics/package.json index e660c66c706..f86d0772478 100644 --- a/packages/compass-metrics/package.json +++ b/packages/compass-metrics/package.json @@ -123,7 +123,7 @@ "lodash.values": "^4.3.0", "lodash.zipobject": "^4.1.3", "mongodb-cloud-info": "^1.1.3", - "mongodb-connection-string-url": "^2.4.2" + "mongodb-connection-string-url": "^2.5.1" }, "homepage": "https://github.com/mongodb-js/compass", "bugs": { diff --git a/packages/connection-form/package.json b/packages/connection-form/package.json index f2f9598ce42..d24adeb64c1 100644 --- a/packages/connection-form/package.json +++ b/packages/connection-form/package.json @@ -55,7 +55,7 @@ "@testing-library/react-hooks": "^7.0.2", "lodash": "^4.17.21", "mongodb-build-info": "^1.4.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "react": "^16.14.0", "react-dom": "^16.14.0" }, diff --git a/packages/connection-form/src/components/advanced-options-tabs/advanced-options-tabs.tsx b/packages/connection-form/src/components/advanced-options-tabs/advanced-options-tabs.tsx index 217aadec23c..d0c63a16a64 100644 --- a/packages/connection-form/src/components/advanced-options-tabs/advanced-options-tabs.tsx +++ b/packages/connection-form/src/components/advanced-options-tabs/advanced-options-tabs.tsx @@ -74,7 +74,9 @@ function AdvancedOptionsTabs({ const connectionStringUrl = useMemo(() => { try { - return new ConnectionStringUrl(connectionOptions.connectionString); + return new ConnectionStringUrl(connectionOptions.connectionString, { + looseValidation: true, + }); } catch (e) { // Return default connection string url when can't be parsed. return new ConnectionStringUrl(defaultConnectionString); diff --git a/packages/connection-form/src/components/advanced-options-tabs/authentication-tab/authentication-tab.spec.tsx b/packages/connection-form/src/components/advanced-options-tabs/authentication-tab/authentication-tab.spec.tsx index 7ccab6af5a5..9d679d87ea6 100644 --- a/packages/connection-form/src/components/advanced-options-tabs/authentication-tab/authentication-tab.spec.tsx +++ b/packages/connection-form/src/components/advanced-options-tabs/authentication-tab/authentication-tab.spec.tsx @@ -76,7 +76,7 @@ describe('AuthenticationTab Component', function () { }); }); - it('does not render the username/password tab when auth is set', function () { + it('does not render the username/password tab when auth is not set', function () { renderComponent({ connectionStringUrl: new ConnectionStringUrl('mongodb://localhost'), updateConnectionFormField: updateConnectionFormFieldSpy, @@ -98,4 +98,18 @@ describe('AuthenticationTab Component', function () { expect(screen.getByLabelText('Username')).to.be.visible; expect(screen.getByLabelText('Password')).to.be.visible; }); + + it('renders the username/password tab when only password is set', function () { + renderComponent({ + errors: [], + connectionStringUrl: new ConnectionStringUrl( + 'mongodb://:b123@localhost', + { looseValidation: true } + ), + updateConnectionFormField: updateConnectionFormFieldSpy, + }); + + expect(screen.getByLabelText('Username')).to.be.visible; + expect(screen.getByLabelText('Password')).to.be.visible; + }); }); diff --git a/packages/connection-form/src/components/connect-form.spec.tsx b/packages/connection-form/src/components/connect-form.spec.tsx index e1b60b3b7f5..433a54bf77b 100644 --- a/packages/connection-form/src/components/connect-form.spec.tsx +++ b/packages/connection-form/src/components/connect-form.spec.tsx @@ -58,11 +58,8 @@ describe('ConnectForm Component', function () { onSaveConnectionClicked={noop} /> ); - expect( - screen.getByText( - 'Invalid scheme, expected connection string to start with "mongodb://" or "mongodb+srv://"' - ) - ).to.be.visible; + expect(screen.getByText('Invalid connection string "pineapples"')).to.be + .visible; }); it('should not show to save a connection when onSaveConnectionClicked doesnt exist', function () { diff --git a/packages/connection-form/src/components/connect-form.tsx b/packages/connection-form/src/components/connect-form.tsx index 836c5440e99..6b172a6fc15 100644 --- a/packages/connection-form/src/components/connect-form.tsx +++ b/packages/connection-form/src/components/connect-form.tsx @@ -128,6 +128,28 @@ function ConnectForm({ (error) => error.fieldName === 'connectionString' ); + const callOnSaveConnectionClickedAndStoreErrors = async ( + connectionInfo: ConnectionInfo + ): Promise => { + try { + const formErrors = validateConnectionOptionsErrors( + connectionInfo.connectionOptions, + { looseValidation: false } + ); + if (formErrors.length) { + setErrors(formErrors); + return; + } + await onSaveConnectionClicked?.(connectionInfo); + } catch (err) { + setErrors([ + { + message: `Unable to save connection: ${(err as Error).message}`, + }, + ]); + } + }; + return ( <>
@@ -203,12 +225,10 @@ function ConnectForm({ : 'hidden' } onSaveClicked={async () => { - if (onSaveConnectionClicked) { - await onSaveConnectionClicked({ - ...cloneDeep(initialConnectionInfo), - connectionOptions: cloneDeep(connectionOptions), - }); - } + await callOnSaveConnectionClickedAndStoreErrors({ + ...cloneDeep(initialConnectionInfo), + connectionOptions: cloneDeep(connectionOptions), + }); }} onConnectClicked={() => { const updatedConnectionOptions = cloneDeep(connectionOptions); @@ -237,17 +257,13 @@ function ConnectForm({ onSaveClicked={async (favoriteInfo: ConnectionFavoriteOptions) => { setShowSaveConnectionModal(false); - try { - await onSaveConnectionClicked({ - ...cloneDeep(initialConnectionInfo), - connectionOptions: cloneDeep(connectionOptions), - favorite: { - ...favoriteInfo, - }, - }); - } catch (err) { - setErrors([err as Error]); - } + await callOnSaveConnectionClickedAndStoreErrors({ + ...cloneDeep(initialConnectionInfo), + connectionOptions: cloneDeep(connectionOptions), + favorite: { + ...favoriteInfo, + }, + }); }} key={initialConnectionInfo.id} initialFavoriteInfo={initialConnectionInfo.favorite} diff --git a/packages/connection-form/src/hooks/use-connect-form.ts b/packages/connection-form/src/hooks/use-connect-form.ts index 17b6a79c4b0..e217bc321b1 100644 --- a/packages/connection-form/src/hooks/use-connect-form.ts +++ b/packages/connection-form/src/hooks/use-connect-form.ts @@ -3,7 +3,7 @@ import { useCallback, useEffect, useReducer } from 'react'; import type { ConnectionInfo, ConnectionOptions } from 'mongodb-data-service'; import type { MongoClientOptions, ProxyOptions } from 'mongodb'; import { cloneDeep, isEqual } from 'lodash'; -import ConnectionStringUrl from 'mongodb-connection-string-url'; +import type ConnectionStringUrl from 'mongodb-connection-string-url'; import type { ConnectionFormError, ConnectionFormWarning, @@ -219,9 +219,7 @@ function handleUpdateHost({ // Build a new connection string url to ensure the // validity of the update. - const newConnectionStringUrl = new ConnectionStringUrl( - updatedConnectionString.toString() - ); + const newConnectionStringUrl = updatedConnectionString.clone(); return { connectionOptions: { diff --git a/packages/connection-form/src/utils/authentication-handler.spec.ts b/packages/connection-form/src/utils/authentication-handler.spec.ts index 9899ae6da97..313f4b5b34e 100644 --- a/packages/connection-form/src/utils/authentication-handler.spec.ts +++ b/packages/connection-form/src/utils/authentication-handler.spec.ts @@ -67,7 +67,7 @@ describe('Authentication Handler', function () { expect(res.errors).to.equal(undefined); }); - it('should return an error if the connection string has a password and the username is being set to empty', function () { + it('should not return an error if the connection string has a password and the username is being set to empty', function () { const res = handleUpdateUsername({ action: { type: 'update-username', @@ -80,16 +80,9 @@ describe('Authentication Handler', function () { }); expect(res.connectionOptions.connectionString).to.equal( - 'mongodb://a123:b123@localhost' + 'mongodb://:b123@localhost/' ); - expect(res.errors).to.deep.equal([ - { - fieldName: 'username', - fieldTab: 'authentication', - message: - 'Username cannot be empty: "URI contained empty userinfo section"', - }, - ]); + expect(res.errors).to.equal(undefined); }); it('should remove the username field when being set to empty with no password', function () { @@ -183,21 +176,9 @@ describe('Authentication Handler', function () { }); expect(res.connectionOptions.connectionString).to.equal( - 'mongodb://localhost/?authMechanism=DEFAULT' + 'mongodb://:pineapple@localhost/?authMechanism=DEFAULT' ); - expect(res.errors).to.deep.equal([ - { - fieldName: 'username', - fieldTab: 'authentication', - message: - 'Username cannot be empty: "URI contained empty userinfo section"', - }, - { - fieldName: 'password', - fieldTab: 'authentication', - message: 'Please enter a username first', - }, - ]); + expect(res.errors).to.equal(undefined); }); it('should remove the password field when being set to empty with a username', function () { diff --git a/packages/connection-form/src/utils/authentication-handler.ts b/packages/connection-form/src/utils/authentication-handler.ts index adab349012a..a371ddfda2a 100644 --- a/packages/connection-form/src/utils/authentication-handler.ts +++ b/packages/connection-form/src/utils/authentication-handler.ts @@ -111,9 +111,7 @@ export function handleUpdateUsername({ { fieldName: 'username', fieldTab: 'authentication', - message: action.username - ? parsingError.message - : `Username cannot be empty: "${parsingError.message}"`, + message: parsingError.message, }, ], }; @@ -151,26 +149,13 @@ export function handleUpdatePassword({ if (parsingError) { return { connectionOptions, - errors: connectionStringUrl.username - ? [ - { - fieldName: 'password', - fieldTab: 'authentication', - message: parsingError.message, - }, - ] - : [ - { - fieldName: 'username', - fieldTab: 'authentication', - message: `Username cannot be empty: "${parsingError.message}"`, - }, - { - fieldName: 'password', - fieldTab: 'authentication', - message: 'Please enter a username first', - }, - ], + errors: [ + { + fieldName: 'password', + fieldTab: 'authentication', + message: parsingError.message, + }, + ], }; } diff --git a/packages/connection-form/src/utils/connection-string-helpers.spec.ts b/packages/connection-form/src/utils/connection-string-helpers.spec.ts index b1fd5f43341..55f5671fb50 100644 --- a/packages/connection-form/src/utils/connection-string-helpers.spec.ts +++ b/packages/connection-form/src/utils/connection-string-helpers.spec.ts @@ -55,7 +55,7 @@ describe('connection-string-helpers', function () { it('should return an error when it cannot be parsed', function () { const [connectionString, error] = tryToParseConnectionString( - 'mongos://pineapple:27099/?directConnection=true' + '-://pineapple:27099/?directConnection=true' ); expect(connectionString).to.equal(undefined); @@ -63,6 +63,17 @@ describe('connection-string-helpers', function () { 'Invalid scheme, expected connection string to start with "mongodb://" or "mongodb+srv://"' ); }); + + it('should not return an error when the URL is valid but not a valid connection string', function () { + const [connectionString, error] = tryToParseConnectionString( + 'mongos://pineapple:27099/?directConnection=true' + ); + + expect(connectionString.href).to.equal( + 'mongos://pineapple:27099/?directConnection=true' + ); + expect(error).to.equal(undefined); + }); }); describe('#getConnectionStringUsername', function () { diff --git a/packages/connection-form/src/utils/connection-string-helpers.ts b/packages/connection-form/src/utils/connection-string-helpers.ts index 3ee1e319a0b..6edcce4e112 100644 --- a/packages/connection-form/src/utils/connection-string-helpers.ts +++ b/packages/connection-form/src/utils/connection-string-helpers.ts @@ -28,9 +28,11 @@ export function parseAuthMechanismProperties( export function tryToParseConnectionString( connectionString: string -): [ConnectionStringUrl | undefined, Error | undefined] { +): [ConnectionStringUrl, undefined] | [undefined, Error] { try { - const connectionStringUrl = new ConnectionStringUrl(connectionString); + const connectionStringUrl = new ConnectionStringUrl(connectionString, { + looseValidation: true, + }); return [connectionStringUrl, undefined]; } catch (err) { return [undefined, err as Error]; diff --git a/packages/connection-form/src/utils/validation.ts b/packages/connection-form/src/utils/validation.ts index ae6d199ba76..f6ae12de892 100644 --- a/packages/connection-form/src/utils/validation.ts +++ b/packages/connection-form/src/utils/validation.ts @@ -2,6 +2,7 @@ import type { MongoClientOptions } from 'mongodb'; import { isLocalhost } from 'mongodb-build-info'; import type { ConnectionOptions } from 'mongodb-data-service'; import ConnectionString from 'mongodb-connection-string-url'; +import type { ConnectionStringParsingOptions } from 'mongodb-connection-string-url'; export type FieldName = | 'connectionString' @@ -73,9 +74,13 @@ export function errorMessageByFieldNameAndIndex( } export function validateConnectionOptionsErrors( - connectionOptions: ConnectionOptions + connectionOptions: ConnectionOptions, + parsingOptions?: ConnectionStringParsingOptions ): ConnectionFormError[] { - const connectionString = getConnectionString(connectionOptions); + const connectionString = new ConnectionString( + connectionOptions.connectionString, + { looseValidation: true, ...parsingOptions } + ); return [ ...validateAuthMechanismErrors(connectionString), @@ -239,12 +244,6 @@ function validateSocksProxyErrors( return errors; } -export function getConnectionString( - connectionOptions: ConnectionOptions -): ConnectionString { - return new ConnectionString(connectionOptions.connectionString); -} - export function isSecure(connectionString: ConnectionString): boolean { const sslParam = connectionString.searchParams.get('ssl'); const tlsParam = connectionString.searchParams.get('tls'); @@ -258,8 +257,22 @@ export function isSecure(connectionString: ConnectionString): boolean { export function validateConnectionOptionsWarnings( connectionOptions: ConnectionOptions ): ConnectionFormWarning[] { - const connectionString = getConnectionString(connectionOptions); + let connectionString: ConnectionString; + let parserWarning: ConnectionFormWarning[] = []; + try { + connectionString = new ConnectionString(connectionOptions.connectionString); + } catch (err: any) { + parserWarning = [{ message: err.message }]; + connectionString = new ConnectionString( + connectionOptions.connectionString, + { + looseValidation: true, + } + ); + } + return [ + ...parserWarning, ...validateReadPreferenceWarnings(connectionString), ...validateDeprecatedOptionsWarnings(connectionString), ...validateCertificateValidationWarnings(connectionString), diff --git a/packages/connection-model/package.json b/packages/connection-model/package.json index c1cc027b15c..116f366a273 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.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb3": "npm:mongodb@^3.6.3", "os-dns-native": "^1.1.2", "raf": "^3.4.1", diff --git a/packages/data-service/package.json b/packages/data-service/package.json index 32483d37a50..1820eb46dcf 100644 --- a/packages/data-service/package.json +++ b/packages/data-service/package.json @@ -64,7 +64,7 @@ "lodash": "^4.17.20", "mongodb-build-info": "^1.3.0", "mongodb-connection-model": "^21.13.0", - "mongodb-connection-string-url": "^2.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-index-model": "^3.9.0", "mongodb-ns": "^2.3.0", "uuid": "^8.3.2" diff --git a/scripts/package.json b/scripts/package.json index 3fc0a4fc46c..d14677893c4 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.4.2", + "mongodb-connection-string-url": "^2.5.2", "mongodb-data-service": "^21.17.0", "ora": "^5.4.0", "pacote": "^11.3.5",