Skip to content

Commit e67a221

Browse files
committed
fix: make auth providers non singletons
1 parent 58a3034 commit e67a221

File tree

3 files changed

+29
-32
lines changed

3 files changed

+29
-32
lines changed

src/cmap/auth/mongodb_oidc/azure_machine_workflow.ts

-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ export class AzureMachineWorkflow extends MachineWorkflow {
5252
} else {
5353
this.cache.deleteEntry(tokenAudience);
5454
const response = await getAzureTokenData(tokenAudience, tokenClientId);
55-
console.log(response);
5655
if (!isEndpointResultValid(response)) {
5756
throw new MongoAzureError(ENDPOINT_RESULT_ERROR);
5857
}

src/cmap/connect.ts

+25-28
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,28 @@ import {
4141
} from './wire_protocol/constants';
4242

4343
/** @internal */
44-
export const AUTH_PROVIDERS = new Map<AuthMechanism | string, AuthProvider>([
45-
[AuthMechanism.MONGODB_AWS, new MongoDBAWS()],
46-
[AuthMechanism.MONGODB_CR, new MongoCR()],
47-
[AuthMechanism.MONGODB_GSSAPI, new GSSAPI()],
48-
[AuthMechanism.MONGODB_OIDC, new MongoDBOIDC()],
49-
[AuthMechanism.MONGODB_PLAIN, new Plain()],
50-
[AuthMechanism.MONGODB_SCRAM_SHA1, new ScramSHA1()],
51-
[AuthMechanism.MONGODB_SCRAM_SHA256, new ScramSHA256()],
52-
[AuthMechanism.MONGODB_X509, new X509()]
53-
]);
44+
export function getAuthProvider(name: AuthMechanism | string): AuthProvider {
45+
switch (name) {
46+
case AuthMechanism.MONGODB_AWS:
47+
return new MongoDBAWS();
48+
case AuthMechanism.MONGODB_CR:
49+
return new MongoCR();
50+
case AuthMechanism.MONGODB_GSSAPI:
51+
return new GSSAPI();
52+
case AuthMechanism.MONGODB_OIDC:
53+
return new MongoDBOIDC();
54+
case AuthMechanism.MONGODB_PLAIN:
55+
return new Plain();
56+
case AuthMechanism.MONGODB_SCRAM_SHA1:
57+
return new ScramSHA1();
58+
case AuthMechanism.MONGODB_SCRAM_SHA256:
59+
return new ScramSHA256();
60+
case AuthMechanism.MONGODB_X509:
61+
return new X509();
62+
default:
63+
throw new MongoInvalidArgumentError(`No auth provider found for type ${name}`);
64+
}
65+
}
5466

5567
/** @public */
5668
export type Stream = Socket | TLSSocket;
@@ -109,15 +121,6 @@ async function performInitialHandshake(
109121
): Promise<void> {
110122
const credentials = options.credentials;
111123

112-
if (credentials) {
113-
if (
114-
!(credentials.mechanism === AuthMechanism.MONGODB_DEFAULT) &&
115-
!AUTH_PROVIDERS.get(credentials.mechanism)
116-
) {
117-
throw new MongoInvalidArgumentError(`AuthMechanism '${credentials.mechanism}' not supported`);
118-
}
119-
}
120-
121124
const authContext = new AuthContext(conn, credentials, options);
122125
conn.authContext = authContext;
123126

@@ -167,7 +170,7 @@ async function performInitialHandshake(
167170
authContext.response = response;
168171

169172
const resolvedCredentials = credentials.resolveAuthMechanism(response);
170-
const provider = AUTH_PROVIDERS.get(resolvedCredentials.mechanism);
173+
const provider = getAuthProvider(resolvedCredentials.mechanism);
171174
if (!provider) {
172175
throw new MongoInvalidArgumentError(
173176
`No AuthProvider for ${resolvedCredentials.mechanism} defined.`
@@ -229,16 +232,10 @@ export async function prepareHandshakeDocument(
229232
if (credentials.mechanism === AuthMechanism.MONGODB_DEFAULT && credentials.username) {
230233
handshakeDoc.saslSupportedMechs = `${credentials.source}.${credentials.username}`;
231234

232-
const provider = AUTH_PROVIDERS.get(AuthMechanism.MONGODB_SCRAM_SHA256);
233-
if (!provider) {
234-
// This auth mechanism is always present.
235-
throw new MongoInvalidArgumentError(
236-
`No AuthProvider for ${AuthMechanism.MONGODB_SCRAM_SHA256} defined.`
237-
);
238-
}
235+
const provider = getAuthProvider(AuthMechanism.MONGODB_SCRAM_SHA256);
239236
return provider.prepare(handshakeDoc, authContext);
240237
}
241-
const provider = AUTH_PROVIDERS.get(credentials.mechanism);
238+
const provider = getAuthProvider(credentials.mechanism);
242239
if (!provider) {
243240
throw new MongoInvalidArgumentError(`No AuthProvider for ${credentials.mechanism} defined.`);
244241
}

src/cmap/connection_pool.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
import { CancellationToken, TypedEventEmitter } from '../mongo_types';
2929
import type { Server } from '../sdam/server';
3030
import { type Callback, eachAsync, List, makeCounter, TimeoutController } from '../utils';
31-
import { AUTH_PROVIDERS, connect } from './connect';
31+
import { connect, getAuthProvider } from './connect';
3232
import { Connection, type ConnectionEvents, type ConnectionOptions } from './connection';
3333
import {
3434
ConnectionCheckedInEvent,
@@ -622,7 +622,8 @@ export class ConnectionPool extends TypedEventEmitter<ConnectionPoolEvents> {
622622
);
623623
}
624624
const resolvedCredentials = credentials.resolveAuthMechanism(connection.hello);
625-
const provider = AUTH_PROVIDERS.get(resolvedCredentials.mechanism);
625+
// TODO: Use existing auth provider.
626+
const provider = getAuthProvider(resolvedCredentials.mechanism);
626627
if (!provider) {
627628
return callback(
628629
new MongoMissingCredentialsError(
@@ -639,7 +640,7 @@ export class ConnectionPool extends TypedEventEmitter<ConnectionPoolEvents> {
639640
callback(undefined, fnResult);
640641
});
641642
},
642-
error => callback(error)
643+
(error: AnyError | undefined) => callback(error)
643644
);
644645
}
645646

0 commit comments

Comments
 (0)