From 3b268d246045a41d9633690a000b53b95e4ea573 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Tue, 6 Dec 2022 13:52:44 +0100 Subject: [PATCH 1/2] fix(arg-parser): more helpful error message for password without username MONGOSH-1235 --- packages/arg-parser/src/arg-mapper.spec.ts | 21 +++++++++++++++++++-- packages/arg-parser/src/arg-mapper.ts | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/arg-parser/src/arg-mapper.spec.ts b/packages/arg-parser/src/arg-mapper.spec.ts index 7aa593b55c..342ad9d245 100644 --- a/packages/arg-parser/src/arg-mapper.spec.ts +++ b/packages/arg-parser/src/arg-mapper.spec.ts @@ -77,8 +77,8 @@ describe('arg-mapper.mapCliToDriver', () => { context('when cli args have password', () => { it('maps to auth object', () => { - expect(optionsTest({ password: 'aphextwin' })).to.deep.equal({ - cs: 'mongodb://:aphextwin@localhost/' + expect(optionsTest({ password: 'aphextwin', username: 'x' })).to.deep.equal({ + cs: 'mongodb://x:aphextwin@localhost/' }); }); }); @@ -340,4 +340,21 @@ describe('arg-mapper.mapCliToDriver', () => { }); }); }); + + context('when password is provided without username', () => { + const cliOptions: CliOptions = { password: '1234' }; + + it('throws a helpful error', () => { + expect(() => optionsTest(cliOptions)).to.throw( + "[COMMON-10001] Invalid connection information: Password specified but no username provided (did you mean '--port' instead of '-p'?)"); + }); + }); + context('when password is provided without username and --port is already specified', () => { + const cliOptions: CliOptions = { password: '1234', port: '12345' }; + + it('throws a helpful error', () => { + expect(() => optionsTest(cliOptions)).to.throw( + '[COMMON-10001] Invalid connection information: Password specified but no username provided'); + }); + }); }); diff --git a/packages/arg-parser/src/arg-mapper.ts b/packages/arg-parser/src/arg-mapper.ts index 463987dcbf..c21f0e1d9f 100644 --- a/packages/arg-parser/src/arg-mapper.ts +++ b/packages/arg-parser/src/arg-mapper.ts @@ -1,3 +1,4 @@ +import { CommonErrors, MongoshInvalidInputError } from '@mongosh/errors'; import type { CliOptions, ConnectionInfo } from './'; import type { DevtoolsConnectOptions } from '@mongodb-js/devtools-connect'; import { ConnectionString, CommaAndColonSeparatedRecord } from 'mongodb-connection-string-url'; @@ -152,6 +153,8 @@ export function mapCliToDriver(options: Readonly, i: Readonly Date: Tue, 6 Dec 2022 15:33:55 +0100 Subject: [PATCH 2/2] fixup: skip validation if no connection string is in use --- packages/arg-parser/src/arg-mapper.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/arg-parser/src/arg-mapper.ts b/packages/arg-parser/src/arg-mapper.ts index c21f0e1d9f..fc2b95908b 100644 --- a/packages/arg-parser/src/arg-mapper.ts +++ b/packages/arg-parser/src/arg-mapper.ts @@ -171,6 +171,9 @@ function mapGSSAPIHostnameCanonicalization(value: string): AuthMechanismProps['C } function validateConnectionInfoAfterArgMapping(info: ConnectionInfo, originalOptions: CliOptions): void { + if (!info.connectionString) { + return; + } // Provide a better error message for some cases in which applying // command line options to the connection string can make it invalid. const connectionString = new ConnectionString(info.connectionString, { looseValidation: true });