Skip to content

Commit bff931c

Browse files
DmitryLukyanovrstam
authored andcommitted
CSHARP-2749: Driver should hide credentials in exception message.
1 parent f5b9db9 commit bff931c

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

src/MongoDB.Driver.Core/Core/Configuration/ConnectionString.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -776,16 +776,17 @@ private void Parse()
776776
var invalidPercentPattern = @"%$|%.$|%[^0-9a-fA-F]|%[0-9a-fA-F][^0-9a-fA-F]";
777777
if (Regex.IsMatch(_originalConnectionString, invalidPercentPattern))
778778
{
779-
var message = string.Format("The connection string '{0}' contains an invalid '%' escape sequence.",
780-
_originalConnectionString);
779+
var protectedConnectionString = protectConnectionString(_originalConnectionString);
780+
var message = $"The connection string '{protectedConnectionString}' contains an invalid '%' escape sequence.";
781781
throw new MongoConfigurationException(message);
782782
}
783783
}
784784

785785
var match = Regex.Match(_originalConnectionString, pattern);
786786
if (!match.Success)
787787
{
788-
var message = string.Format("The connection string '{0}' is not valid.", _originalConnectionString);
788+
var protectedConnectionString = protectConnectionString(_originalConnectionString);
789+
var message = $"The connection string '{protectedConnectionString}' is not valid.";
789790
throw new MongoConfigurationException(message);
790791
}
791792

@@ -799,6 +800,12 @@ private void Parse()
799800
{
800801
throw new MongoConfigurationException("This is an invalid w and journal pair.");
801802
}
803+
804+
string protectConnectionString(string connectionString)
805+
{
806+
var protectedString = Regex.Replace(connectionString, @"(?<=://)[^/]*(?=@)", "<hidden>");
807+
return protectedString;
808+
}
802809
}
803810

804811
private void ParseOption(string name, string value)

tests/MongoDB.Driver.Core.Tests/Core/Configuration/ConnectionStringTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,20 @@ public void When_compressor_is_specified_with_unsupported_value_the_value_should
462462
subject.Compressors.Should().BeEmpty();
463463
}
464464

465+
[Theory]
466+
[InlineData("mongodb://nam!@#$%^&*())e:password@localhost", "mongodb://<hidden>@localhost")]
467+
[InlineData("://nam!@#$%^&*())e:password@loc", "://<hidden>@loc")]
468+
[InlineData("://nam!@#$%^&*())e@loc", "://<hidden>@loc")]
469+
[InlineData("mongodb://nameloc@", "mongodb://<hidden>@")]
470+
[InlineData("mongodb+srv://nameloc@", "mongodb+srv://<hidden>@")]
471+
[InlineData("ongodb://username:password@localhost/?replicaSet=@x", "ongodb://<hidden>@localhost/?replicaSet=@x")]
472+
public void When_connectionstring_invalid_security_data_should_be_protected(string connectionString, string protectedConnectionString)
473+
{
474+
var exception = Record.Exception(() => new ConnectionString(connectionString));
475+
var e = exception.Should().BeOfType<MongoConfigurationException>().Subject;
476+
e.Message.Should().StartWith($"The connection string '{protectedConnectionString}'");
477+
}
478+
465479
[Theory]
466480
[InlineData("mongodb://localhost?connect=automatic", ClusterConnectionMode.Automatic)]
467481
[InlineData("mongodb://localhost?connect=direct", ClusterConnectionMode.Direct)]

0 commit comments

Comments
 (0)