diff options
author | Neale Ferguson <neale@sinenomine.net> | 2014-09-19 19:42:55 +0400 |
---|---|---|
committer | Neale Ferguson <neale@sinenomine.net> | 2014-09-19 19:52:52 +0400 |
commit | a83e9cf4aaaef69d3eabbca2de74005ed207374f (patch) | |
tree | 1f138b1165884790ac5dcba75d3437eeeaa17cc0 /mcs/class/Mono.Data.Tds | |
parent | fcb9de513afcb651b050fc7af5587e052be7352a (diff) |
Add SqlCredential support -
- Tds.cs: Use SecureString objects for passwords; Add method to retrieve string from SecureString
- Tds42.cs: Use SecureString for passwords
- Tds50.cs: Use SecureString for passwords
- Tds70.cs: Use SecureString for passwords
- TdsConnectionParameters.cs: Use SecureString for passwords; Initialize Password parameter as cleared string; Add indicator for when password is set
- SqlConnection.cs: Use SecureString for passwords; Add SqlConnect method that accepts an SqlCredential along with the Connection string; Perform checking of parameters to ensure user/password not specified in connection string if credentials have been specified or using credentials when domain login is specified.
- SqlCredential.cs: Add new class with support for credentials
- System.Data.dll.sources: Add SqlCredential.cs to the build list
Diffstat (limited to 'mcs/class/Mono.Data.Tds')
5 files changed, 32 insertions, 9 deletions
diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs index 6865df9adbe..f06932c8026 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs @@ -41,7 +41,9 @@ using System.ComponentModel; using System.Diagnostics; using System.Net.Sockets; using System.Globalization; +using System.Security; using System.Text; +using System.Runtime.InteropServices; namespace Mono.Data.Tds.Protocol { @@ -1468,7 +1470,7 @@ namespace Mono.Data.Tds.Protocol t3.Domain = this.connectionParms.DefaultDomain; t3.Host = this.connectionParms.Hostname; t3.Username = this.connectionParms.User; - t3.Password = this.connectionParms.Password; + t3.Password = GetPlainPassword(this.connectionParms.Password); Comm.StartPacket (TdsPacketType.SspAuth); // 0x11 Comm.Append (t3.GetBytes ()); @@ -1919,6 +1921,20 @@ namespace Mono.Data.Tds.Protocol comm.Skip(4); } + public static string GetPlainPassword(SecureString secPass) + { + IntPtr plainString = IntPtr.Zero; + try + { + plainString = Marshal.SecureStringToGlobalAllocUnicode(secPass); + return Marshal.PtrToStringUni(plainString); + } + finally + { + Marshal.ZeroFreeGlobalAllocUnicode(plainString); + } + } + #endregion // Private Methods #if NET_2_0 diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds42.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds42.cs index fdca83087b1..fb517d013d5 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds42.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds42.cs @@ -29,6 +29,7 @@ // using System; +using System.Security; namespace Mono.Data.Tds.Protocol { public sealed class Tds42 : Tds @@ -77,7 +78,7 @@ namespace Mono.Data.Tds.Protocol { Comm.Append ((byte) (tmp.Length < 30 ? tmp.Length : 30)); // password (offset 62 0x3e) - tmp = Comm.Append (connectionParameters.Password, 30, pad); + tmp = Comm.Append (GetPlainPassword(connectionParameters.Password), 30, pad); Comm.Append ((byte) (tmp.Length < 30 ? tmp.Length : 30)); // hostproc (offset 93 0x5d) @@ -145,7 +146,7 @@ namespace Mono.Data.Tds.Protocol { // remote passwords Comm.Append (empty, 2, pad); - tmp = Comm.Append (connectionParameters.Password, 253, pad); + tmp = Comm.Append (GetPlainPassword(connectionParameters.Password), 253, pad); Comm.Append ((byte) (tmp.Length < 253 ? tmp.Length + 2 : 253 + 2)); // tds version diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds50.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds50.cs index 0d0e86c023d..88219125df5 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds50.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds50.cs @@ -31,6 +31,7 @@ using Mono.Data.Tds; using System; using System.Text; +using System.Security; namespace Mono.Data.Tds.Protocol { @@ -118,7 +119,7 @@ namespace Mono.Data.Tds.Protocol // password (offset 62 0x3e) // 62-92 - tmp = Comm.Append (connectionParameters.Password, 30, pad); + tmp = Comm.Append (GetPlainPassword(connectionParameters.Password), 30, pad); Comm.Append ((byte) (tmp.Length < 30 ? tmp.Length : 30)); // hostproc (offset 93 0x5d) @@ -187,7 +188,7 @@ namespace Mono.Data.Tds.Protocol // remote passwords // 202-457 Comm.Append (empty, 2, pad); - tmp = Comm.Append (connectionParameters.Password, 253, pad); + tmp = Comm.Append (GetPlainPassword(connectionParameters.Password), 253, pad); Comm.Append ((byte) (tmp.Length < 253 ? tmp.Length + 2 : 253 + 2)); // tds version diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs index c67b6e8c3bb..991727bbc00 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs @@ -37,6 +37,7 @@ using System; using System.Globalization; using System.Text; +using System.Security; using Mono.Security.Protocol.Ntlm; @@ -392,11 +393,12 @@ namespace Mono.Data.Tds.Protocol return IsConnected; } - private static string EncryptPassword (string pass) + private static string EncryptPassword (SecureString secPass) { int xormask = 0x5a5a; - int len = pass.Length; + int len = secPass.Length; char[] chars = new char[len]; + string pass = GetPlainPassword(secPass); for (int i = 0; i < len; ++i) { int c = ((int) (pass[i])) ^ xormask; diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsConnectionParameters.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsConnectionParameters.cs index 19f676077d7..e3b83aa257c 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsConnectionParameters.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsConnectionParameters.cs @@ -31,6 +31,7 @@ // using System; +using System.Security; namespace Mono.Data.Tds.Protocol { @@ -42,7 +43,8 @@ namespace Mono.Data.Tds.Protocol public string Hostname; public string Language; public string LibraryName; - public string Password; + public SecureString Password; + public bool PasswordSet; public string ProgName; public string User; public bool DomainLogin; @@ -62,7 +64,8 @@ namespace Mono.Data.Tds.Protocol Hostname = System.Net.Dns.GetHostName(); Language = String.Empty; LibraryName = "Mono"; - Password = String.Empty; + Password = new SecureString(); + PasswordSet = false; ProgName = "Mono"; User = String.Empty; DomainLogin = false; |