From 701d85677c3432c132ac719cba1b2bae865e78c3 Mon Sep 17 00:00:00 2001 From: wfurt Date: Sun, 9 Jul 2023 15:20:50 -0700 Subject: [PATCH 1/3] add test for SslClientAuthenticationOptions.ShallowClone --- ...slClientAuthenticationOptionsExtensions.cs | 4 ++- .../SslAuthenticationOptionsTest.cs | 26 +++++++++++++++++++ .../System.Net.Security.Tests.csproj | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/libraries/Common/src/System/Net/Security/SslClientAuthenticationOptionsExtensions.cs b/src/libraries/Common/src/System/Net/Security/SslClientAuthenticationOptionsExtensions.cs index 337fff63df3242..63ea6d87c4e9ea 100644 --- a/src/libraries/Common/src/System/Net/Security/SslClientAuthenticationOptionsExtensions.cs +++ b/src/libraries/Common/src/System/Net/Security/SslClientAuthenticationOptionsExtensions.cs @@ -33,7 +33,9 @@ public static SslClientAuthenticationOptions ShallowClone(this SslClientAuthenti #if DEBUG // Try to detect if a property gets added that we're not copying correctly. - foreach (PropertyInfo pi in typeof(SslClientAuthenticationOptions).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)) + PropertyInfo[] properties = typeof(SslClientAuthenticationOptions).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)!; + Debug.Assert(properties.Length == 13); + foreach (PropertyInfo pi in properties) { object? origValue = pi.GetValue(options); object? cloneValue = pi.GetValue(clone); diff --git a/src/libraries/System.Net.Security/tests/FunctionalTests/SslAuthenticationOptionsTest.cs b/src/libraries/System.Net.Security/tests/FunctionalTests/SslAuthenticationOptionsTest.cs index b026fc03b04a22..7890ae878e2ab6 100644 --- a/src/libraries/System.Net.Security/tests/FunctionalTests/SslAuthenticationOptionsTest.cs +++ b/src/libraries/System.Net.Security/tests/FunctionalTests/SslAuthenticationOptionsTest.cs @@ -144,6 +144,32 @@ await TestConfiguration.WhenAllOrAnyFailedWithTimeout( Assert.Equal(string.Empty, server.TargetHostName); } } + + [Fact] + public void ClientOptions_ShallowCopy_OK() + { + using X509Certificate2 clientCert = Configuration.Certificates.GetClientCertificate(); + + var clientOptions = new SslClientAuthenticationOptions + { + AllowRenegotiation = false, + AllowTlsResume = false, + ApplicationProtocols = new List { SslApplicationProtocol.Http11, SslApplicationProtocol.Http2 }, + CertificateRevocationCheckMode = X509RevocationMode.Online, + ClientCertificates = new X509CertificateCollection() { clientCert }, + EnabledSslProtocols = SslProtocols.Tls12, + EncryptionPolicy = EncryptionPolicy.RequireEncryption, + TargetHost = "foo", + CertificateChainPolicy = new X509ChainPolicy(), + RemoteCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }), + LocalCertificateSelectionCallback = new LocalCertificateSelectionCallback(delegate { return null; }), + ClientCertificateContext = SslStreamCertificateContext.Create(clientCert, null, false), + }; + + // There is consistency check inside of the ShallowClone + _ = clientOptions.ShallowClone(); + } + } public sealed class SslClientAuthenticationOptionsTestBase_Sync : SslClientAuthenticationOptionsTestBase diff --git a/src/libraries/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj b/src/libraries/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj index b72ebc87fa38a4..87685eba5598fe 100644 --- a/src/libraries/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj +++ b/src/libraries/System.Net.Security/tests/FunctionalTests/System.Net.Security.Tests.csproj @@ -99,6 +99,8 @@ Link="ProductionCode\Common\System\Net\MultiArrayBuffer.cs" /> + From 5ff3de51d161d4eb6ebfe1988cc3df2e40674418 Mon Sep 17 00:00:00 2001 From: wfurt Date: Mon, 17 Jul 2023 10:08:22 -0700 Subject: [PATCH 2/3] update comments --- .../Net/Security/SslClientAuthenticationOptionsExtensions.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libraries/Common/src/System/Net/Security/SslClientAuthenticationOptionsExtensions.cs b/src/libraries/Common/src/System/Net/Security/SslClientAuthenticationOptionsExtensions.cs index 63ea6d87c4e9ea..d1ad29435f9be0 100644 --- a/src/libraries/Common/src/System/Net/Security/SslClientAuthenticationOptionsExtensions.cs +++ b/src/libraries/Common/src/System/Net/Security/SslClientAuthenticationOptionsExtensions.cs @@ -14,6 +14,7 @@ internal static class SslClientAuthenticationOptionsExtensions { public static SslClientAuthenticationOptions ShallowClone(this SslClientAuthenticationOptions options) { + // Use non-default values to verify the clone works fine. var clone = new SslClientAuthenticationOptions() { AllowRenegotiation = options.AllowRenegotiation, @@ -33,6 +34,7 @@ public static SslClientAuthenticationOptions ShallowClone(this SslClientAuthenti #if DEBUG // Try to detect if a property gets added that we're not copying correctly. + // The property count is guard for new properties that also needs to be added above. PropertyInfo[] properties = typeof(SslClientAuthenticationOptions).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)!; Debug.Assert(properties.Length == 13); foreach (PropertyInfo pi in properties) From 8286467fed1483d02ac3a07fb4c7c6393474421f Mon Sep 17 00:00:00 2001 From: wfurt Date: Thu, 3 Aug 2023 08:47:23 -0700 Subject: [PATCH 3/3] comment --- .../tests/FunctionalTests/SslAuthenticationOptionsTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Net.Security/tests/FunctionalTests/SslAuthenticationOptionsTest.cs b/src/libraries/System.Net.Security/tests/FunctionalTests/SslAuthenticationOptionsTest.cs index 7890ae878e2ab6..a086f6f123b812 100644 --- a/src/libraries/System.Net.Security/tests/FunctionalTests/SslAuthenticationOptionsTest.cs +++ b/src/libraries/System.Net.Security/tests/FunctionalTests/SslAuthenticationOptionsTest.cs @@ -150,6 +150,7 @@ public void ClientOptions_ShallowCopy_OK() { using X509Certificate2 clientCert = Configuration.Certificates.GetClientCertificate(); + // needs to non-default values so we can verify it was copied correctly. var clientOptions = new SslClientAuthenticationOptions { AllowRenegotiation = false,