From 4f565ae7883d5c0dc0349bf919e00a91b20593af Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 22 Sep 2022 22:53:10 -0700 Subject: [PATCH 1/5] Make SqlConnectionEncryptOption string parser public --- .../SqlConnectionEncryptOption.xml | 25 +++++++++++ .../netcore/ref/Microsoft.Data.SqlClient.cs | 4 ++ .../netfx/ref/Microsoft.Data.SqlClient.cs | 6 +++ .../SqlClient/SqlConnectionEncryptOption.cs | 21 +++++++++- .../SqlConnectionStringBuilderTest.cs | 41 +++++++++++++++++++ 5 files changed, 95 insertions(+), 2 deletions(-) diff --git a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml index f5f40255a3..0ca8ccefad 100644 --- a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml +++ b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml @@ -12,6 +12,31 @@ Implicit conversions have been added to maintain backwards compatibility with bo ]]> + + + Converts the specified string representation of a logical value to its equivalent. + + A string containing the value to convert. + + An object that equivalent to contained in . + + + Throws exception if provided is not convertible to type. + + + + + Converts the specified string representation of a logical value to its equivalent and returns a value that indicates whether the conversion succeeded. + + A string containing the value to convert. + + An object that equivalent to contained in . if conversion fails. + + + if the parameter was converted successfully; otherwise, . + + This method does not throw an exception if conversion fails. + Specifies that TLS encryption is optional when connecting to the server. If the server requires encryption, encryption will be negotiated. diff --git a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs index deb4ad0bf9..efc60a6fec 100644 --- a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs @@ -506,6 +506,10 @@ public enum SqlConnectionIPAddressPreference /// public sealed class SqlConnectionEncryptOption { + /// + public static SqlConnectionEncryptOption Parse(string value) => null; + /// + public static bool? TryParse(string value, out SqlConnectionEncryptOption result) => throw null; /// public static SqlConnectionEncryptOption Optional => throw null; diff --git a/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs index 29cd583c94..0863a61254 100644 --- a/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs @@ -923,6 +923,12 @@ public enum SqlConnectionIPAddressPreference /// public sealed class SqlConnectionEncryptOption { + /// + public static SqlConnectionEncryptOption Parse(string value) => null; + + /// + public static bool? TryParse(string value, out SqlConnectionEncryptOption result) => throw null; + /// public static SqlConnectionEncryptOption Optional => throw null; diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs index 6d488ce872..6b8c5e4577 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; using Microsoft.Data.Common; namespace Microsoft.Data.SqlClient @@ -29,9 +30,10 @@ private SqlConnectionEncryptOption(string value) _value = value; } - internal static SqlConnectionEncryptOption Parse(string value) + /// + public static SqlConnectionEncryptOption Parse(string value) { - switch (value.ToLower()) + switch (value?.ToLower()) { case TRUE_LOWER: case YES_LOWER: @@ -54,6 +56,21 @@ internal static SqlConnectionEncryptOption Parse(string value) } } + /// + public static bool TryParse(string value, out SqlConnectionEncryptOption result) + { + result = null; + try + { + result = Parse(value); + return true; + } + catch + { + return false; + } + } + /// public static SqlConnectionEncryptOption Optional => s_optional; diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 14247ac8a5..828152c4ab 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -385,6 +385,47 @@ public void ConnectionBuilderEncryptBackwardsCompatibility() Assert.True(builder.Encrypt); } + [Theory] + [InlineData("true", "True")] + [InlineData("mandatory", "True")] + [InlineData("yes", "True")] + [InlineData("false", "False")] + [InlineData("optional", "False")] + [InlineData("no", "False")] + [InlineData("strict", "Strict")] + public void EncryptParserValidValuesParsesSuccessfully(string value, string expectedValue) + => Assert.Equal(expectedValue, SqlConnectionEncryptOption.Parse(value).ToString()); + + [Theory] + [InlineData("something")] + [InlineData("")] + [InlineData(null)] + [InlineData(" true ")] + public void EncryptParserInvalidValuesThrowsException(string value) + => Assert.Throws(() => SqlConnectionEncryptOption.Parse(value)); + + [Theory] + [InlineData("true", "True")] + [InlineData("mandatory", "True")] + [InlineData("yes", "True")] + [InlineData("false", "False")] + [InlineData("optional", "False")] + [InlineData("no", "False")] + [InlineData("strict", "Strict")] + public void EncryptTryParseValidValuesReturnsTrue(string value, string expectedValue) + { + Assert.True(SqlConnectionEncryptOption.TryParse(value, out var result)); + Assert.Equal(expectedValue, result.ToString()); + } + + [Theory] + [InlineData("something")] + [InlineData("")] + [InlineData(null)] + [InlineData(" true ")] + public void EncryptTryParseInvalidValuesReturnsFalse(string value) + => Assert.False(SqlConnectionEncryptOption.TryParse(value, out _)); + internal void ExecuteConnectionStringTests(string connectionString) { SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString); From 238daf313bbe7cf5f2179f9250733f997ae89cdc Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Fri, 23 Sep 2022 11:02:53 -0700 Subject: [PATCH 2/5] Address feedback --- .../SqlClient/SqlConnectionEncryptOption.cs | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs index 6b8c5e4577..ee4ce0df1f 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs @@ -32,6 +32,19 @@ private SqlConnectionEncryptOption(string value) /// public static SqlConnectionEncryptOption Parse(string value) + { + if (TryParse(value, out var result)) + { + return result; + } + else + { + throw ADP.InvalidConnectionOptionValue(SqlConnectionString.KEY.Encrypt); + } + } + + /// + public static bool TryParse(string value, out SqlConnectionEncryptOption result) { switch (value?.ToLower()) { @@ -39,35 +52,24 @@ public static SqlConnectionEncryptOption Parse(string value) case YES_LOWER: case MANDATORY_LOWER: { - return Mandatory; + result = Mandatory; + return true; } case FALSE_LOWER: case NO_LOWER: case OPTIONAL_LOWER: { - return Optional; + result = Optional; + return true; } case STRICT_LOWER: { - return Strict; + result = Strict; + return true; } default: - throw ADP.InvalidConnectionOptionValue(SqlConnectionString.KEY.Encrypt); - } - } - - /// - public static bool TryParse(string value, out SqlConnectionEncryptOption result) - { - result = null; - try - { - result = Parse(value); - return true; - } - catch - { - return false; + result = null; + return false; } } From 04e2df2ce4f3639da681e2cd735dd043bb611766 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Fri, 23 Sep 2022 11:04:50 -0700 Subject: [PATCH 3/5] Fix non-nullables --- .../netcore/ref/Microsoft.Data.SqlClient.cs | 2 +- .../netfx/ref/Microsoft.Data.SqlClient.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs index efc60a6fec..0f9701d3cc 100644 --- a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs @@ -509,7 +509,7 @@ public sealed class SqlConnectionEncryptOption /// public static SqlConnectionEncryptOption Parse(string value) => null; /// - public static bool? TryParse(string value, out SqlConnectionEncryptOption result) => throw null; + public static bool TryParse(string value, out SqlConnectionEncryptOption result) => throw null; /// public static SqlConnectionEncryptOption Optional => throw null; diff --git a/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs index 0863a61254..894ffe6789 100644 --- a/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs @@ -927,7 +927,7 @@ public sealed class SqlConnectionEncryptOption public static SqlConnectionEncryptOption Parse(string value) => null; /// - public static bool? TryParse(string value, out SqlConnectionEncryptOption result) => throw null; + public static bool TryParse(string value, out SqlConnectionEncryptOption result) => throw null; /// public static SqlConnectionEncryptOption Optional => throw null; From 0a3e7692f8bf18763a68e0f1f96f924e0147a345 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Fri, 23 Sep 2022 11:19:36 -0700 Subject: [PATCH 4/5] Fix docs --- .../Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml index 0ca8ccefad..6db9533606 100644 --- a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml +++ b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOption.xml @@ -18,9 +18,9 @@ Implicit conversions have been added to maintain backwards compatibility with bo A string containing the value to convert. - An object that equivalent to contained in . + An object that is equivalent to contained in . - + Throws exception if provided is not convertible to type. @@ -30,7 +30,7 @@ Implicit conversions have been added to maintain backwards compatibility with bo A string containing the value to convert. - An object that equivalent to contained in . if conversion fails. + An object that is equivalent to contained in . if conversion fails. if the parameter was converted successfully; otherwise, . From a55245c473c2c20bf0447858001423eb290911db Mon Sep 17 00:00:00 2001 From: Cheena Malhotra <13396919+cheenamalhotra@users.noreply.github.com> Date: Mon, 26 Sep 2022 12:59:59 -0700 Subject: [PATCH 5/5] Apply suggestions from code review Co-authored-by: DavoudEshtehari <61173489+DavoudEshtehari@users.noreply.github.com> --- .../netcore/ref/Microsoft.Data.SqlClient.cs | 2 +- .../netfx/ref/Microsoft.Data.SqlClient.cs | 2 +- .../src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs index 0f9701d3cc..db0842d4f2 100644 --- a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs @@ -507,7 +507,7 @@ public enum SqlConnectionIPAddressPreference public sealed class SqlConnectionEncryptOption { /// - public static SqlConnectionEncryptOption Parse(string value) => null; + public static SqlConnectionEncryptOption Parse(string value) => throw null; /// public static bool TryParse(string value, out SqlConnectionEncryptOption result) => throw null; /// diff --git a/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs index 894ffe6789..5d78fb574e 100644 --- a/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs @@ -924,7 +924,7 @@ public enum SqlConnectionIPAddressPreference public sealed class SqlConnectionEncryptOption { /// - public static SqlConnectionEncryptOption Parse(string value) => null; + public static SqlConnectionEncryptOption Parse(string value) => throw null; /// public static bool TryParse(string value, out SqlConnectionEncryptOption result) => throw null; diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs index ee4ce0df1f..fde49b3980 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs @@ -33,7 +33,7 @@ private SqlConnectionEncryptOption(string value) /// public static SqlConnectionEncryptOption Parse(string value) { - if (TryParse(value, out var result)) + if (TryParse(value, out SqlConnectionEncryptOption result)) { return result; }