Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/Npgsql/Internal/NpgsqlConnector.Auth.cs
Original file line number Diff line number Diff line change
Expand Up @@ -335,8 +335,7 @@ async Task AuthenticateGSS(bool async)
}
}

if (password is null)
password = PostgresEnvironment.Password;
password ??= PostgresEnvironment.Password;

if (password != null)
return password;
Expand Down
6 changes: 2 additions & 4 deletions src/Npgsql/NpgsqlConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -482,8 +482,6 @@ public override string ConnectionString
/// </summary>
public string? UserName => Settings.Username;

internal string? Password => Settings.Password;

// The following two lines are here for backwards compatibility with the EF6 provider
// ReSharper disable UnusedMember.Global
internal string? EntityTemplateDatabase => Settings.EntityTemplateDatabase;
Expand Down Expand Up @@ -1972,10 +1970,10 @@ public NpgsqlConnection CloneWith(string connectionString)
{
CheckDisposed();
var csb = new NpgsqlConnectionStringBuilder(connectionString);
if (csb.Password == null && Password != null)
csb.Password = Password;
csb.Password ??= _dataSource?.GetPassword(async: false).GetAwaiter().GetResult();
if (csb.PersistSecurityInfo && !Settings.PersistSecurityInfo)
csb.PersistSecurityInfo = false;

return new NpgsqlConnection(csb.ToString()) {
ProvideClientCertificatesCallback = ProvideClientCertificatesCallback,
UserCertificateValidationCallback = UserCertificateValidationCallback,
Expand Down
18 changes: 18 additions & 0 deletions test/Npgsql.Tests/ConnectionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1036,6 +1036,24 @@ public void Clone_with_PersistSecurityInfo()
Assert.That(clonedConn.ConnectionString, Does.Not.Contain("Password="));
}

[Test]
public async Task CloneWith_and_data_source_with_password()
{
var dataSourceBuilder = new NpgsqlDataSourceBuilder(ConnectionString);
// Set the password via the data source property later to make sure that's picked up by CloneWith
var password = dataSourceBuilder.ConnectionStringBuilder.Password!;
dataSourceBuilder.ConnectionStringBuilder.Password = null;
await using var dataSource = dataSourceBuilder.Build();

await using var connection = dataSource.CreateConnection();
dataSource.Password = password;

// Test that the up-to-date password gets copied to the clone, as if we opened the original connection instead of cloning it
using var _ = CreateTempPool(new NpgsqlConnectionStringBuilder(ConnectionString) { Password = null }, out var tempConnectionString);
await using var clonedConnection = connection.CloneWith(tempConnectionString);
await clonedConnection.OpenAsync();
}

#endregion PersistSecurityInfo

[Test]
Expand Down