Skip to content

Commit fbefa6b

Browse files
W-A-Jameskggaubaileympearson
authored
fix(NODE-6407): use conversationId returned from server in saslContinue (#4368)
Co-authored-by: kggau <[email protected]> Co-authored-by: Bailey Pearson <[email protected]>
1 parent f82aa57 commit fbefa6b

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

src/cmap/auth/mongodb_aws.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ export class MongoDBAWS extends AuthProvider {
148148

149149
const saslContinue = {
150150
saslContinue: 1,
151-
conversationId: 1,
151+
conversationId: saslStartResponse.conversationId,
152152
payload: BSON.serialize(payload, bsonOptions)
153153
};
154154

test/integration/auth/mongodb_aws.test.ts

+75
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@ import * as sinon from 'sinon';
99
import { refreshKMSCredentials } from '../../../src/client-side-encryption/providers';
1010
import {
1111
AWSTemporaryCredentialProvider,
12+
type CommandOptions,
13+
Connection,
14+
type Document,
1215
MongoAWSError,
1316
type MongoClient,
1417
MongoDBAWS,
18+
type MongoDBNamespace,
19+
type MongoDBResponseConstructor,
1520
MongoMissingCredentialsError,
1621
MongoServerError,
1722
setDifference
@@ -61,6 +66,76 @@ describe('MONGODB-AWS', function () {
6166
expect(result).to.be.a('number');
6267
});
6368

69+
describe('ConversationId', function () {
70+
let commandStub: sinon.SinonStub<
71+
[
72+
ns: MongoDBNamespace,
73+
command: Document,
74+
options?: CommandOptions,
75+
responseType?: MongoDBResponseConstructor
76+
],
77+
Promise<any>
78+
>;
79+
80+
let saslStartResult, saslContinue;
81+
82+
beforeEach(function () {
83+
// spy on connection.command, filter for saslStart and saslContinue commands
84+
commandStub = sinon.stub(Connection.prototype, 'command').callsFake(async function (
85+
ns: MongoDBNamespace,
86+
command: Document,
87+
options: CommandOptions,
88+
responseType?: MongoDBResponseConstructor
89+
) {
90+
if (command.saslContinue != null) {
91+
saslContinue = { ...command };
92+
}
93+
94+
const result = await commandStub.wrappedMethod.call(
95+
this,
96+
ns,
97+
command,
98+
options,
99+
responseType
100+
);
101+
102+
if (command.saslStart != null) {
103+
// Modify the result of the saslStart to check if the saslContinue uses it
104+
result.conversationId = 999;
105+
saslStartResult = { ...result };
106+
}
107+
108+
return result;
109+
});
110+
});
111+
112+
afterEach(function () {
113+
commandStub.restore();
114+
sinon.restore();
115+
});
116+
117+
it('should use conversationId returned by saslStart in saslContinue', async function () {
118+
client = this.configuration.newClient(process.env.MONGODB_URI); // use the URI built by the test environment
119+
120+
const err = await client
121+
.db('aws')
122+
.collection('aws_test')
123+
.estimatedDocumentCount()
124+
.catch(e => e);
125+
126+
// Expecting the saslContinue to fail since we changed the conversationId
127+
expect(err).to.be.instanceof(MongoServerError);
128+
expect(err.message).to.match(/Mismatched conversation id/);
129+
130+
expect(saslStartResult).to.not.be.undefined;
131+
expect(saslContinue).to.not.be.undefined;
132+
133+
expect(saslStartResult).to.have.property('conversationId', 999);
134+
135+
expect(saslContinue).to.have.property('conversationId').equal(saslStartResult.conversationId);
136+
});
137+
});
138+
64139
it('should allow empty string in authMechanismProperties.AWS_SESSION_TOKEN to override AWS_SESSION_TOKEN environment variable', function () {
65140
client = this.configuration.newClient(this.configuration.url(), {
66141
authMechanismProperties: { AWS_SESSION_TOKEN: '' }

0 commit comments

Comments
 (0)