Skip to content

Commit 187582e

Browse files
introduce KMSCredentialProvider abstraction
1 parent 1d31273 commit 187582e

File tree

3 files changed

+38
-31
lines changed

3 files changed

+38
-31
lines changed

src/client-side-encryption/auto_encrypter.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { MongoDBCollectionNamespace } from '../utils';
1313
import * as cryptoCallbacks from './crypto_callbacks';
1414
import { MongoCryptInvalidArgumentError } from './errors';
1515
import { MongocryptdManager } from './mongocryptd_manager';
16-
import { type KMSProviders, refreshKMSCredentials } from './providers';
16+
import { KMSCredentialProvider, type KMSProviders } from './providers';
1717
import { type CSFLEKMSTlsOptions, StateMachine } from './state_machine';
1818

1919
/** @public */
@@ -233,7 +233,6 @@ export class AutoEncrypter {
233233
_metaDataClient: MongoClient;
234234
_proxyOptions: ProxyOptions;
235235
_tlsOptions: CSFLEKMSTlsOptions;
236-
_kmsProviders: KMSProviders;
237236
_bypassMongocryptdAndCryptShared: boolean;
238237
_contextCounter: number;
239238

@@ -252,6 +251,7 @@ export class AutoEncrypter {
252251
* fields were decrypted.
253252
*/
254253
[kDecorateResult] = false;
254+
_credentialProvider: KMSCredentialProvider;
255255

256256
/** @internal */
257257
static getMongoCrypt(): MongoCryptConstructor {
@@ -319,7 +319,7 @@ export class AutoEncrypter {
319319
this._metaDataClient = options.metadataClient || client;
320320
this._proxyOptions = options.proxyOptions || {};
321321
this._tlsOptions = options.tlsOptions || {};
322-
this._kmsProviders = options.kmsProviders || {};
322+
const kmsProviders = options.kmsProviders || {};
323323

324324
const mongoCryptOptions: MongoCryptOptions = {
325325
cryptoCallbacks
@@ -336,9 +336,9 @@ export class AutoEncrypter {
336336
: (serialize(options.encryptedFieldsMap) as Buffer);
337337
}
338338

339-
mongoCryptOptions.kmsProviders = !Buffer.isBuffer(this._kmsProviders)
340-
? (serialize(this._kmsProviders) as Buffer)
341-
: this._kmsProviders;
339+
mongoCryptOptions.kmsProviders = !Buffer.isBuffer(kmsProviders)
340+
? (serialize(kmsProviders) as Buffer)
341+
: kmsProviders;
342342

343343
if (options.options?.logger) {
344344
mongoCryptOptions.logger = options.options.logger;
@@ -389,6 +389,8 @@ export class AutoEncrypter {
389389

390390
this._mongocryptdClient = new MongoClient(this._mongocryptdManager.uri, clientOptions);
391391
}
392+
393+
this._credentialProvider = new KMSCredentialProvider(kmsProviders);
392394
}
393395

394396
/**
@@ -502,7 +504,7 @@ export class AutoEncrypter {
502504
* the original ones.
503505
*/
504506
async askForKMSCredentials(): Promise<KMSProviders> {
505-
return refreshKMSCredentials(this._kmsProviders);
507+
return this._credentialProvider.refreshCredentials();
506508
}
507509

508510
/**

src/client-side-encryption/client_encryption.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import {
2525
} from './errors';
2626
import {
2727
type ClientEncryptionDataKeyProvider,
28-
type KMSProviders,
29-
refreshKMSCredentials
28+
KMSCredentialProvider,
29+
type KMSProviders
3030
} from './providers/index';
3131
import { type CSFLEKMSTlsOptions, StateMachine } from './state_machine';
3232

@@ -61,8 +61,7 @@ export class ClientEncryption {
6161
/** @internal */
6262
_tlsOptions: CSFLEKMSTlsOptions;
6363
/** @internal */
64-
_kmsProviders: KMSProviders;
65-
64+
_credentialProvider: KMSCredentialProvider;
6665
/** @internal */
6766
_mongoCrypt: MongoCrypt;
6867

@@ -107,7 +106,7 @@ export class ClientEncryption {
107106
this._client = client;
108107
this._proxyOptions = options.proxyOptions ?? {};
109108
this._tlsOptions = options.tlsOptions ?? {};
110-
this._kmsProviders = options.kmsProviders || {};
109+
const kmsProviders = options.kmsProviders || {};
111110

112111
if (options.keyVaultNamespace == null) {
113112
throw new MongoCryptInvalidArgumentError('Missing required option `keyVaultNamespace`');
@@ -116,15 +115,16 @@ export class ClientEncryption {
116115
const mongoCryptOptions: MongoCryptOptions = {
117116
...options,
118117
cryptoCallbacks,
119-
kmsProviders: !Buffer.isBuffer(this._kmsProviders)
120-
? (serialize(this._kmsProviders) as Buffer)
121-
: this._kmsProviders
118+
kmsProviders: !Buffer.isBuffer(kmsProviders)
119+
? (serialize(kmsProviders) as Buffer)
120+
: kmsProviders
122121
};
123122

124123
this._keyVaultNamespace = options.keyVaultNamespace;
125124
this._keyVaultClient = options.keyVaultClient || client;
126125
const MongoCrypt = ClientEncryption.getMongoCrypt();
127126
this._mongoCrypt = new MongoCrypt(mongoCryptOptions);
127+
this._credentialProvider = new KMSCredentialProvider(kmsProviders);
128128
}
129129

130130
/**
@@ -654,7 +654,7 @@ export class ClientEncryption {
654654
* the original ones.
655655
*/
656656
async askForKMSCredentials(): Promise<KMSProviders> {
657-
return refreshKMSCredentials(this._kmsProviders);
657+
return this._credentialProvider.refreshCredentials();
658658
}
659659

660660
static get libmongocryptVersion() {

src/client-side-encryption/providers/index.ts

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -144,25 +144,30 @@ export function isEmptyCredentials(
144144
}
145145

146146
/**
147-
* Load cloud provider credentials for the user provided KMS providers.
148-
* Credentials will only attempt to get loaded if they do not exist
149-
* and no existing credentials will get overwritten.
150-
*
151147
* @internal
152148
*/
153-
export async function refreshKMSCredentials(kmsProviders: KMSProviders): Promise<KMSProviders> {
154-
let finalKMSProviders = kmsProviders;
149+
export class KMSCredentialProvider {
150+
constructor(private readonly kmsProviders: KMSProviders) {}
155151

156-
if (isEmptyCredentials('aws', kmsProviders)) {
157-
finalKMSProviders = await loadAWSCredentials(finalKMSProviders);
158-
}
152+
/**
153+
* Load cloud provider credentials for the user provided KMS providers.
154+
* Credentials will only attempt to get loaded if they do not exist
155+
* and no existing credentials will get overwritten.
156+
*/
157+
async refreshCredentials() {
158+
let finalKMSProviders = this.kmsProviders;
159159

160-
if (isEmptyCredentials('gcp', kmsProviders)) {
161-
finalKMSProviders = await loadGCPCredentials(finalKMSProviders);
162-
}
160+
if (isEmptyCredentials('aws', this.kmsProviders)) {
161+
finalKMSProviders = await loadAWSCredentials(finalKMSProviders);
162+
}
163+
164+
if (isEmptyCredentials('gcp', this.kmsProviders)) {
165+
finalKMSProviders = await loadGCPCredentials(finalKMSProviders);
166+
}
163167

164-
if (isEmptyCredentials('azure', kmsProviders)) {
165-
finalKMSProviders = await loadAzureCredentials(finalKMSProviders);
168+
if (isEmptyCredentials('azure', this.kmsProviders)) {
169+
finalKMSProviders = await loadAzureCredentials(finalKMSProviders);
170+
}
171+
return finalKMSProviders;
166172
}
167-
return finalKMSProviders;
168173
}

0 commit comments

Comments
 (0)