From: Nabeel Valley <36758308+nabeelvalley@users.noreply.github.com> Date: Wed, 2 Oct 2019 01:07:26 +0000 (+0200) Subject: Prevent Setting SmtpClient.UseDefaultCredentials clearing Credentials (dotnet/corefx... X-Git-Tag: submit/tizen/20210909.063632~11031^2~374 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e8c8a056def5b8020ac4a839214babee3b0bb1e5;p=platform%2Fupstream%2Fdotnet%2Fruntime.git Prevent Setting SmtpClient.UseDefaultCredentials clearing Credentials (dotnet/corefx#41271) * Ensure setting UseDefaultCredentials to False does not clear Credentials * Remove reference comments * Rename tests to align with convention * Correctly set _transport.Credentials * Include SmtpClient._transport.Credentials in tests, move tests to own file * Change filename and refactor UN/PW Commit migrated from https://github.com/dotnet/corefx/commit/dcc9f626eeb0751d4ba4499f623aac42d2e95c10 --- diff --git a/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs b/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs index 8852e4b..d67a266 100644 --- a/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs +++ b/src/libraries/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs @@ -61,6 +61,8 @@ namespace System.Net.Mail // ports above this limit are invalid private const int MaxPortValue = 65535; public event SendCompletedEventHandler SendCompleted; + private bool _useDefaultCredentials; + private ICredentialsByHost _customCredentials; public SmtpClient() { @@ -229,7 +231,7 @@ namespace System.Net.Mail { get { - return ReferenceEquals(_transport.Credentials, CredentialCache.DefaultNetworkCredentials); + return _useDefaultCredentials; } set { @@ -238,7 +240,8 @@ namespace System.Net.Mail throw new InvalidOperationException(SR.SmtpInvalidOperationDuringSend); } - _transport.Credentials = value ? CredentialCache.DefaultNetworkCredentials : null; + _useDefaultCredentials = value; + UpdateTransportCredentials(); } } @@ -255,10 +258,16 @@ namespace System.Net.Mail throw new InvalidOperationException(SR.SmtpInvalidOperationDuringSend); } - _transport.Credentials = value; + _customCredentials = value; + UpdateTransportCredentials(); } } + private void UpdateTransportCredentials() + { + _transport.Credentials = _useDefaultCredentials ? CredentialCache.DefaultNetworkCredentials : _customCredentials; + } + public int Timeout { get diff --git a/src/libraries/System.Net.Mail/tests/Functional/SmtpClientCredentialsTest.cs b/src/libraries/System.Net.Mail/tests/Functional/SmtpClientCredentialsTest.cs new file mode 100644 index 0000000..4b2d507 --- /dev/null +++ b/src/libraries/System.Net.Mail/tests/Functional/SmtpClientCredentialsTest.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Net.Mail.Functional.Tests +{ + public class SmtpClientCredentialsTest + { + private readonly string UserName = "user"; + private readonly string Password = Guid.NewGuid().ToString(); + + [Fact] + public void Credentials_Unset_Null() + { + SmtpClient client = new SmtpClient(); + + ICredentialsByHost transportCredentials = GetTransportCredentials(client); + + Assert.Null(client.Credentials); + Assert.Null(transportCredentials); + } + + [Fact] + public void DefaultCredentials_True_DefaultCredentials() + { + NetworkCredential expectedCredentials = CredentialCache.DefaultNetworkCredentials; + + SmtpClient client = new SmtpClient(); + client.UseDefaultCredentials = true; + + ICredentialsByHost transportCredentials = GetTransportCredentials(client); + + Assert.Equal(expectedCredentials, client.Credentials); + Assert.Equal(expectedCredentials, transportCredentials); + } + + [Fact] + public void UseDefaultCredentials_False_Null() + { + SmtpClient client = new SmtpClient(); + client.UseDefaultCredentials = false; + + ICredentialsByHost transportCredentials = GetTransportCredentials(client); + + Assert.Null(client.Credentials); + Assert.Null(transportCredentials); + } + + [Fact] + public void Credentials_UseDefaultCredentialsSetFalseBeforeCredentials_Credentials() + { + NetworkCredential expectedCredentials = new NetworkCredential(UserName, Password); + + SmtpClient client = new SmtpClient(); + client.UseDefaultCredentials = false; + client.Credentials = expectedCredentials; + + ICredentialsByHost transportCredentials = GetTransportCredentials(client); + + Assert.NotNull(client.Credentials); + Assert.Equal(expectedCredentials, client.Credentials); + Assert.Equal(expectedCredentials, transportCredentials); + } + + [Fact] + public void Credentials_UseDefaultCredentialsSetFalseAfterCredentials_Credentials() + { + NetworkCredential expectedCredentials = new NetworkCredential(UserName, Password); + + SmtpClient client = new SmtpClient(); + client.Credentials = expectedCredentials; + client.UseDefaultCredentials = false; + + ICredentialsByHost transportCredentials = GetTransportCredentials(client); + + Assert.NotNull(client.Credentials); + Assert.Equal(expectedCredentials, client.Credentials); + Assert.Equal(expectedCredentials, transportCredentials); + } + + [Fact] + public void Credentials_UseDefaultCredentialsSetTrueBeforeCredentials_DefaultNetworkCredentials() + { + NetworkCredential expectedCredentials = CredentialCache.DefaultNetworkCredentials; + + SmtpClient client = new SmtpClient(); + client.UseDefaultCredentials = true; + client.Credentials = new NetworkCredential(UserName, Password); + + ICredentialsByHost transportCredentials = GetTransportCredentials(client); + + Assert.Equal(expectedCredentials, client.Credentials); + Assert.Equal(expectedCredentials, transportCredentials); + } + + [Fact] + public void Credentials_UseDefaultCredentialsSetTrueAfterCredentials_DefaultNetworkCredentials() + { + NetworkCredential expectedCredentials = CredentialCache.DefaultNetworkCredentials; + + SmtpClient client = new SmtpClient(); + client.Credentials = new NetworkCredential(UserName, Password); + client.UseDefaultCredentials = true; + + ICredentialsByHost transportCredentials = GetTransportCredentials(client); + + Assert.Equal(expectedCredentials, client.Credentials); + Assert.Equal(expectedCredentials, transportCredentials); + } + + private ICredentialsByHost GetTransportCredentials(SmtpClient client) + { + Type smtpTransportType = (typeof(SmtpClient)).Assembly.GetType("System.Net.Mail.SmtpTransport"); + + var transport = typeof(SmtpClient) + .GetField("_transport", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance) + .GetValue(client); + + var transportCredentials = smtpTransportType + .GetProperty("Credentials", BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance) + .GetValue(transport); + + return (ICredentialsByHost)transportCredentials; + } + } +} diff --git a/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs b/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs index 675daeb..dd72e7e 100644 --- a/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs +++ b/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs @@ -9,7 +9,6 @@ // (C) 2006 John Luke // -using System.Collections.Generic; using System.IO; using System.Net.NetworkInformation; using System.Net.Sockets; diff --git a/src/libraries/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj b/src/libraries/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj index 5d0f22f..2380601 100644 --- a/src/libraries/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj +++ b/src/libraries/System.Net.Mail/tests/Functional/System.Net.Mail.Functional.Tests.csproj @@ -10,6 +10,7 @@ +