8000 ssl connection string options · mysql-net/MySqlConnector@6d6357f · GitHub
[go: up one dir, main page]

Skip to content

Commit 6d6357f

Browse files
committed
ssl connection string options
1 parent aa5c148 commit 6d6357f

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed

src/MySqlConnector/MySqlClient/MySqlConnectionStringBuilder.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,18 @@
22
using System.Collections.Generic;
33
using System.Data.Common;
44
using System.Globalization;
5+
using System.Reflection;
56

67
namespace MySql.Data.MySqlClient
78
{
9+
public enum SslMode
10+
{
11+
None,
12+
Required,
13+
VerifyCa,
14+
VerifyFull,
15+
}
16+
817
public sealed class MySqlConnectionStringBuilder : DbConnectionStringBuilder
918
{
1019
public MySqlConnectionStringBuilder()
@@ -82,6 +91,24 @@ public bool UseCompression
8291
set { MySqlConnectionStringOption.UseCompression.SetValue(this, value); }
8392
}
8493

94+
public SslMode SslMode
95+
{
96+
get { return MySqlConnectionStringOption.SslMode.GetValue(this); }
97+
set { MySqlConnectionStringOption.SslMode.SetValue(this, value); }
98+
}
99+
100+
public string CertificateFile
101+
{
102+
get { return MySqlConnectionStringOption.CertificateFile.GetValue(this); }
103+
set { MySqlConnectionStringOption.CertificateFile.SetValue(this, value); }
104+
}
105+
106+
public string CertificatePassword
107+
{
108+
get { return MySqlConnectionStringOption.CertificatePassword.GetValue(this); }
109+
set { MySqlConnectionStringOption.CertificatePassword.SetValue(this, value); }
110+
}
111+
85112
public bool Pooling
86113
{
87114
get { return MySqlConnectionStringOption.Pooling.GetValue(this); }
@@ -179,6 +206,9 @@ internal abstract class MySqlConnectionStringOption
179206
public static readonly MySqlConnectionStringOption<bool> OldGuids;
180207
public static readonly MySqlConnectionStringOption<bool> PersistSecurityInfo;
181208
public static readonly MySqlConnectionStringOption<bool> UseCompression;
209+
public static readonly MySqlConnectionStringOption<SslMode> SslMode;
210+
public static readonly MySqlConnectionStringOption<string> CertificateFile;
211+
public static readonly MySqlConnectionStringOption<string> CertificatePassword;
182212
public static readonly MySqlConnectionStringOption<bool> Pooling;
183213
public static readonly MySqlConnectionStringOption<bool> ConnectionReset;
184214
public static readonly MySqlConnectionStringOption<uint> ConnectionTimeout;
@@ -265,6 +295,18 @@ static MySqlConnectionStringOption()
265295
keys: new[] { "Compress", "Use Compression", "UseCompression" },
266296
defaultValue: false));
267297

298+
AddOption(CertificateFile = new MySqlConnectionStringOption<string>(
299+
keys: new[] { "CertificateFile", "Certificate File" },
300+
defaultValue: ""));
301+
302+
AddOption(CertificatePassword = new MySqlConnectionStringOption<string>(
303+
keys: new[] { "CertificatePassword", "Certificate Password" },
304+
defaultValue: ""));
305+
306+
AddOption(SslMode = new MySqlConnectionStringOption<SslMode>(
307+
keys: new[] { "SSL Mode", "SslMode" },
308+
defaultValue: MySqlClient.SslMode.None));
309+
268310
AddOption(Pooling = new MySqlConnectionStringOption<bool>(
269311
keys: new[] { "Pooling" },
270312
defaultValue: true));
@@ -334,6 +376,16 @@ private static T ChangeType(object objectValue)
334376
return (T) (object) false;
335377
}
336378

379+
if (typeof(T).GetTypeInfo().IsSubclassOf(typeof(Enum)) && objectValue is string)
380+
{
381+
foreach (var val in Enum.GetValues(typeof(T)))
382+
{
383+
if (string.Equals((string) objectValue, val.ToString(), StringComparison.OrdinalIgnoreCase))
384+
return (T) val;
385+
}
386+
throw new InvalidOperationException("Value '{0}' not supported for option '{1}'.".FormatInvariant(objectValue, typeof(T).GetTypeInfo().Name));
387+
}
388+
337389
return (T) Convert.ChangeType(objectValue, typeof(T), CultureInfo.InvariantCulture);
338390
}
339391

src/MySqlConnector/project.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"System.Linq": "4.1.0",
4040
"System.Net.NameResolution": "4.0.0",
4141
"System.Net.Sockets": "4.1.0",
42+
"System.Reflection": "4.1.0",
4243
"System.Runtime": "4.1.0",
4344
"System.Runtime.Extensions": "4.1.0",
4445
"System.Security.Cryptography.Algorithms": "4.2.0",

tests/MySqlConnector.Tests/MySqlConnectionStringBuilderTests.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public void Defaults()
3535
Assert.Equal("", csb.Server);
3636
Assert.Equal(false, csb.UseCompression);
3737
Assert.Equal("", csb.UserID);
38+
Assert.Equal(SslMode.None, csb.SslMode);
39+
Assert.Equal("", csb.CertificateFile);
40+
Assert.Equal("", csb.CertificatePassword);
3841
#if !BASELINE
3942
Assert.Equal(false, csb.ForceSynchronous);
4043
#endif
@@ -45,7 +48,7 @@ public void ParseConnectionString()
4548
{
4649
var csb = new MySqlConnectionStringBuilder
4750
{
48-
ConnectionString = "Data Source=db-server;Port=1234;Uid=username;pwd=Pass1234;Initial Catalog=schema_name;Allow User Variables=true;Character Set=latin1;Convert Zero Datetime=true;Pooling=no;OldGuids=true;Compress=true;ConnectionReset=false;minpoolsize=5;maxpoolsize=15;persistsecurityinfo=yes;useaffectedrows=false;connect timeout=30"
51+
ConnectionString = "Data Source=db-server;Port=1234;Uid=username;pwd=Pass1234;Initial Catalog=schema_name;Allow User Variables=true;Character Set=latin1;Convert Zero Datetime=true;Pooling=no;OldGuids=true;Compress=true;ConnectionReset=false;minpoolsize=5;maxpoolsize=15;persistsecurityinfo=yes;useaffectedrows=false;connect timeout=30;ssl mode=verifyca;certificate file=file.pfx;certificate password=Pass1234"
4952
#if !BASELINE
5053
+ ";forcesynchronous=true"
5154
#endif
@@ -67,6 +70,9 @@ public void ParseConnectionString()
6770
Assert.Equal(false, csb.UseAffectedRows);
6871
Assert.Equal(true, csb.UseCompression);
6972
Assert.Equal("username", csb.UserID);
73+
Assert.Equal(SslMode.VerifyCa, csb.SslMode);
74+
Assert.Equal("file.pfx", csb.CertificateFile);
75+
Assert.Equal("Pass1234", csb.CertificatePassword);
7076
#if !BASELINE
7177
Assert.Equal(true, csb.ForceSynchronous);
7278
#endif
@@ -92,6 +98,13 @@ public void UseAffectedRowsNotSupported()
9298
};
9399
Assert.Throws<NotSupportedException>(() => new MySqlConnection(csb.ConnectionString));
94100
}
101+
102+
[Fact]
103+
public void SslModePreferredInvalidOperation()
104+
{
105+
var csb = new MySqlConnectionStringBuilder("ssl mode=preferred;");
106+
Assert.Throws<InvalidOperationException>(() => csb.SslMode);
107+
}
95108
#endif
96109
}
97110
}

0 commit comments

Comments
 (0)
0