You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
import * as crypto from 'crypto';
|
|
|
|
import { MongoMissingCredentialsError } from '../../error';
|
|
import { ns } from '../../utils';
|
|
import { type AuthContext, AuthProvider } from './auth_provider';
|
|
|
|
export class MongoCR extends AuthProvider {
|
|
override async auth(authContext: AuthContext): Promise<void> {
|
|
const { connection, credentials } = authContext;
|
|
if (!credentials) {
|
|
throw new MongoMissingCredentialsError('AuthContext must provide credentials.');
|
|
}
|
|
|
|
const { username, password, source } = credentials;
|
|
|
|
const { nonce } = await connection.commandAsync(
|
|
ns(`${source}.$cmd`),
|
|
{ getnonce: 1 },
|
|
undefined
|
|
);
|
|
|
|
const hashPassword = crypto
|
|
.createHash('md5')
|
|
.update(`${username}:mongo:${password}`, 'utf8')
|
|
.digest('hex');
|
|
|
|
// Final key
|
|
const key = crypto
|
|
.createHash('md5')
|
|
.update(`${nonce}${username}${hashPassword}`, 'utf8')
|
|
.digest('hex');
|
|
|
|
const authenticateCommand = {
|
|
authenticate: 1,
|
|
user: username,
|
|
nonce,
|
|
key
|
|
};
|
|
|
|
await connection.commandAsync(ns(`${source}.$cmd`), authenticateCommand, undefined);
|
|
}
|
|
}
|