Skip to content

Commit 788d933

Browse files
committed
CSHARP-1861: Fix NullReferenceException when using X509 authentication.
1 parent 4bf6280 commit 788d933

File tree

4 files changed

+9
-9
lines changed

4 files changed

+9
-9
lines changed

src/MongoDB.Driver.Core/Core/Authentication/MongoDBX509Authenticator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void Authenticate(IConnection connection, ConnectionDescription descripti
6767
{
6868
Ensure.IsNotNull(connection, nameof(connection));
6969
Ensure.IsNotNull(description, nameof(description));
70-
EnsureUsernameIsNotNullOrNullIsSupported(connection);
70+
EnsureUsernameIsNotNullOrNullIsSupported(connection, description);
7171

7272
try
7373
{
@@ -85,7 +85,7 @@ public async Task AuthenticateAsync(IConnection connection, ConnectionDescriptio
8585
{
8686
Ensure.IsNotNull(connection, nameof(connection));
8787
Ensure.IsNotNull(description, nameof(description));
88-
EnsureUsernameIsNotNullOrNullIsSupported(connection);
88+
EnsureUsernameIsNotNullOrNullIsSupported(connection, description);
8989

9090
try
9191
{
@@ -124,9 +124,9 @@ private MongoAuthenticationException CreateException(IConnection connection, Exc
124124
return new MongoAuthenticationException(connection.ConnectionId, message, ex);
125125
}
126126

127-
private void EnsureUsernameIsNotNullOrNullIsSupported(IConnection connection)
127+
private void EnsureUsernameIsNotNullOrNullIsSupported(IConnection connection, ConnectionDescription description)
128128
{
129-
var serverVersion = connection.Description.ServerVersion;
129+
var serverVersion = description.ServerVersion;
130130
if (_username == null && !Feature.ServerExtractsUsernameFromX509Certificate.IsSupported(serverVersion))
131131
{
132132
var message = $"Username cannot be null for server version {serverVersion}.";

src/MongoDB.Driver.Core/Core/Misc/Feature.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public class Feature
5050
private static readonly Feature __partialIndexes = new Feature("PartialIndexes", new SemanticVersion(3, 2, 0));
5151
private static readonly ReadConcernFeature __readConcern = new ReadConcernFeature("ReadConcern", new SemanticVersion(3, 2, 0));
5252
private static readonly Feature __scramSha1Authentication = new Feature("ScramSha1Authentication", new SemanticVersion(3, 0, 0));
53-
private static readonly Feature __serverExtractsUsernameFromX509Certificate = new Feature("ServerExtractsUsernameFromX509Certificate", new SemanticVersion(3, 4, 0));
53+
private static readonly Feature __serverExtractsUsernameFromX509Certificate = new Feature("ServerExtractsUsernameFromX509Certificate", new SemanticVersion(3, 3, 12));
5454
private static readonly Feature __userManagementCommands = new Feature("UserManagementCommands", new SemanticVersion(2, 6, 0));
5555
private static readonly Feature __views = new Feature("Views", new SemanticVersion(3, 3, 11));
5656
private static readonly Feature __writeCommands = new Feature("WriteCommands", new SemanticVersion(2, 6, 0));

src/MongoDB.Driver/MongoIdentity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public bool Equals(MongoIdentity rhs)
130130
public override int GetHashCode()
131131
{
132132
var hash = 17;
133-
hash += 37 * _username.GetHashCode();
133+
hash += 37 * (_username == null ? 0 :_username.GetHashCode());
134134
hash += 37 * _source.GetHashCode();
135135
return hash;
136136
}

tests/MongoDB.Driver.Core.Tests/Core/Authentication/MongoDBX509AuthenticatorTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,17 +142,17 @@ public void Authenticate_should_not_throw_when_username_is_null_and_server_suppo
142142
RawBsonDocumentHelper.FromJson("{ok: 1}"));
143143

144144
var connection = new MockConnection(__serverId);
145-
connection.Description = CreateConnectionDescription(new SemanticVersion(3, 4, 0));
146145
connection.EnqueueReplyMessage(reply);
146+
var description = CreateConnectionDescription(new SemanticVersion(3, 4, 0));
147147

148148
Exception exception;
149149
if (async)
150150
{
151-
exception = Record.Exception(() => subject.AuthenticateAsync(connection, __description, CancellationToken.None).GetAwaiter().GetResult());
151+
exception = Record.Exception(() => subject.AuthenticateAsync(connection, description, CancellationToken.None).GetAwaiter().GetResult());
152152
}
153153
else
154154
{
155-
exception = Record.Exception(() => subject.Authenticate(connection, __description, CancellationToken.None));
155+
exception = Record.Exception(() => subject.Authenticate(connection, description, CancellationToken.None));
156156
}
157157

158158
exception.Should().BeNull();

0 commit comments

Comments
 (0)