Skip to content

Commit

Permalink
fix(NODE-5536): remove credentials from ConnectionPoolCreatedEvent op…
Browse files Browse the repository at this point in the history
…tions (#3812)
  • Loading branch information
nbbeeken authored Aug 17, 2023
1 parent 0c1b654 commit 2910dca
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 8 deletions.
9 changes: 7 additions & 2 deletions src/cmap/connection_pool_events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,17 @@ export class ConnectionPoolMonitoringEvent {
*/
export class ConnectionPoolCreatedEvent extends ConnectionPoolMonitoringEvent {
/** The options used to create this connection pool */
options?: ConnectionPoolOptions;
options: Omit<ConnectionPoolOptions, 'credentials'> & { credentials?: Record<never, never> };

/** @internal */
constructor(pool: ConnectionPool) {
super(pool);
this.options = pool.options;
if (pool.options.credentials != null) {
// Intentionally remove credentials: NODE-5460
this.options = { ...pool.options, credentials: {} };
} else {
this.options = pool.options;
}
}
}

Expand Down
8 changes: 2 additions & 6 deletions src/operations/operation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ export const Aspect = {
/** @public */
export type Hint = string | Document;

export interface OperationConstructor extends Function {
aspects?: Set<symbol>;
}

/** @public */
export interface OperationOptions extends BSONSerializeOptions {
/** Specify ClientSession for this command */
Expand Down Expand Up @@ -96,7 +92,7 @@ export abstract class AbstractOperation<TResult = any> {
): void;

hasAspect(aspect: symbol): boolean {
const ctor = this.constructor as OperationConstructor;
const ctor = this.constructor as { aspects?: Set<symbol> };
if (ctor.aspects == null) {
return false;
}
Expand All @@ -122,7 +118,7 @@ export abstract class AbstractOperation<TResult = any> {
}

export function defineAspects(
operation: OperationConstructor,
operation: { new (...args: any[]): any },
aspects: symbol | symbol[] | Set<symbol>
): Set<symbol> {
if (!Array.isArray(aspects) && !(aspects instanceof Set)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import { expect } from 'chai';
import { once } from 'events';

import { MongoClient } from '../../../src';
import { loadSpecTests } from '../../spec';
import { CmapTest, runCmapTestSuite } from '../../tools/cmap_spec_runner';

Expand All @@ -16,4 +20,49 @@ describe('Connection Monitoring and Pooling (Node Driver)', function () {
}
]
});

describe('ConnectionPoolCreatedEvent', () => {
let client: MongoClient;
beforeEach(async function () {
client = this.configuration.newClient();
});

afterEach(async function () {
await client.close();
});

describe('constructor()', () => {
it('when auth is enabled redacts credentials from options', {
metadata: { requires: { auth: 'enabled' } },
async test() {
const poolCreated = once(client, 'connectionPoolCreated');
await client.connect();
const [event] = await poolCreated;
expect(event).to.have.deep.nested.property('options.credentials', {});

const poolOptions = Array.from(client.topology?.s.servers.values() ?? []).map(
s => s.s.pool.options
);
expect(poolOptions).to.have.length.of.at.least(1);

for (const { credentials = {} } of poolOptions) {
expect(
Object.keys(credentials),
'pool.options.credentials must exist and have keys'
).to.not.equal(0);
}
}
});

it('when auth is disabled does not add a credentials property to options', {
metadata: { requires: { auth: 'disabled' } },
async test() {
const poolCreated = once(client, 'connectionPoolCreated');
await client.connect();
const [event] = await poolCreated;
expect(event).to.not.have.nested.property('options.credentials');
}
});
});
});
});

0 comments on commit 2910dca

Please sign in to comment.