Skip to content

Commit 632774d

Browse files
committed
feat: use custom aws config in fle
1 parent a7d1802 commit 632774d

File tree

7 files changed

+31
-10
lines changed

7 files changed

+31
-10
lines changed

src/client-side-encryption/auto_encrypter.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
import * as net from 'net';
77

88
import { deserialize, type Document, serialize } from '../bson';
9+
import { type AWSCredentialProvider } from '../cmap/auth/aws_temporary_credentials';
910
import { type CommandOptions, type ProxyOptions } from '../cmap/connection';
1011
import { kDecorateResult } from '../constants';
1112
import { getMongoDBClientEncryption } from '../deps';
@@ -153,6 +154,7 @@ export class AutoEncrypter {
153154
_kmsProviders: KMSProviders;
154155
_bypassMongocryptdAndCryptShared: boolean;
155156
_contextCounter: number;
157+
_awsCredentialProvider?: AWSCredentialProvider;
156158

157159
_mongocryptdManager?: MongocryptdManager;
158160
_mongocryptdClient?: MongoClient;
@@ -237,6 +239,8 @@ export class AutoEncrypter {
237239
this._proxyOptions = options.proxyOptions || {};
238240
this._tlsOptions = options.tlsOptions || {};
239241
this._kmsProviders = options.kmsProviders || {};
242+
this._awsCredentialProvider =
243+
client.options.credentials?.mechanismProperties.AWS_CREDENTIAL_PROVIDER;
240244

241245
const mongoCryptOptions: MongoCryptOptions = {
242246
cryptoCallbacks
@@ -438,7 +442,7 @@ export class AutoEncrypter {
438442
* the original ones.
439443
*/
440444
async askForKMSCredentials(): Promise<KMSProviders> {
441-
return await refreshKMSCredentials(this._kmsProviders);
445+
return await refreshKMSCredentials(this._kmsProviders, this._awsCredentialProvider);
442446
}
443447

444448
/**

src/client-side-encryption/client_encryption.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
type UUID
1616
} from '../bson';
1717
import { type AnyBulkWriteOperation, type BulkWriteResult } from '../bulk/common';
18+
import { type AWSCredentialProvider } from '../cmap/auth/aws_temporary_credentials';
1819
import { type ProxyOptions } from '../cmap/connection';
1920
import { type Collection } from '../collection';
2021
import { type FindCursor } from '../cursor/find_cursor';
@@ -81,6 +82,9 @@ export class ClientEncryption {
8182
/** @internal */
8283
_mongoCrypt: MongoCrypt;
8384

85+
/** @internal */
86+
_awsCredentialProvider?: AWSCredentialProvider;
87+
8488
/** @internal */
8589
static getMongoCrypt(): MongoCryptConstructor {
8690
const encryption = getMongoDBClientEncryption();
@@ -125,6 +129,8 @@ export class ClientEncryption {
125129
this._kmsProviders = options.kmsProviders || {};
126130
const { timeoutMS } = resolveTimeoutOptions(client, options);
127131
this._timeoutMS = timeoutMS;
132+
this._awsCredentialProvider =
133+
client.options.credentials?.mechanismProperties.AWS_CREDENTIAL_PROVIDER;
128134

129135
if (options.keyVaultNamespace == null) {
130136
throw new MongoCryptInvalidArgumentError('Missing required option `keyVaultNamespace`');
@@ -712,7 +718,7 @@ export class ClientEncryption {
712718
* the original ones.
713719
*/
714720
async askForKMSCredentials(): Promise<KMSProviders> {
715-
return await refreshKMSCredentials(this._kmsProviders);
721+
return await refreshKMSCredentials(this._kmsProviders, this._awsCredentialProvider);
716722
}
717723

718724
static get libmongocryptVersion() {

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1-
import { AWSSDKCredentialProvider } from '../../cmap/auth/aws_temporary_credentials';
1+
import {
2+
type AWSCredentialProvider,
3+
AWSSDKCredentialProvider
4+
} from '../../cmap/auth/aws_temporary_credentials';
25
import { type KMSProviders } from '.';
36

47
/**
58
* @internal
69
*/
7-
export async function loadAWSCredentials(kmsProviders: KMSProviders): Promise<KMSProviders> {
8-
const credentialProvider = new AWSSDKCredentialProvider();
10+
export async function loadAWSCredentials(
11+
kmsProviders: KMSProviders,
12+
provider?: AWSCredentialProvider
13+
): Promise<KMSProviders> {
14+
const credentialProvider = new AWSSDKCredentialProvider(provider);
915

1016
// We shouldn't ever receive a response from the AWS SDK that doesn't have a `SecretAccessKey`
1117
// or `AccessKeyId`. However, TS says these fields are optional. We provide empty strings

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Binary } from '../../bson';
2+
import { type AWSCredentialProvider } from '../../cmap/auth/aws_temporary_credentials';
23
import { loadAWSCredentials } from './aws';
34
import { loadAzureCredentials } from './azure';
45
import { loadGCPCredentials } from './gcp';
@@ -176,11 +177,14 @@ export function isEmptyCredentials(
176177
*
177178
* @internal
178179
*/
179-
export async function refreshKMSCredentials(kmsProviders: KMSProviders): Promise<KMSProviders> {
180+
export async function refreshKMSCredentials(
181+
kmsProviders: KMSProviders,
182+
awsProvider?: AWSCredentialProvider
183+
): Promise<KMSProviders> {
180184
let finalKMSProviders = kmsProviders;
181185

182186
if (isEmptyCredentials('aws', kmsProviders)) {
183-
finalKMSProviders = await loadAWSCredentials(finalKMSProviders);
187+
finalKMSProviders = await loadAWSCredentials(finalKMSProviders, awsProvider);
184188
}
185189

186190
if (isEmptyCredentials('gcp', kmsProviders)) {

src/cmap/auth/aws_temporary_credentials.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export interface AWSTempCredentials {
2121
Expiration?: Date;
2222
}
2323

24-
/** @internal */
24+
/** @public **/
2525
export type AWSCredentialProvider = () => Promise<AWSCredentials>;
2626

2727
/**

src/deps.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export function getZstdLibrary(): ZStandardLib | { kModuleError: MongoMissingDep
7878
}
7979

8080
/**
81-
* @internal
81+
* @public
8282
* Copy of the AwsCredentialIdentityProvider interface from [`smithy/types`](https://socket.dev/npm/package/\@smithy/types/files/1.1.1/dist-types/identity/awsCredentialIdentity.d.ts),
8383
* the return type of the aws-sdk's `fromNodeProviderChain().provider()`.
8484
*/

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,11 @@ export { ReadPreferenceMode } from './read_preference';
127127
export { ServerType, TopologyType } from './sdam/common';
128128

129129
// Helper classes
130+
export type { AWSCredentialProvider } from './cmap/auth/aws_temporary_credentials';
131+
export type { AWSCredentials } from './deps';
130132
export { ReadConcern } from './read_concern';
131133
export { ReadPreference } from './read_preference';
132134
export { WriteConcern } from './write_concern';
133-
134135
// events
135136
export {
136137
CommandFailedEvent,

0 commit comments

Comments
 (0)