Use proper SecureString construction to avoid empty password issues (#417)

This commit is contained in:
Matt Irvine
2017-07-18 13:40:26 -07:00
committed by GitHub
parent d5b2bcdcb7
commit 58a342a51b

View File

@@ -175,26 +175,23 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin
internal static DatabaseTaskHelper CreateDatabaseTaskHelper(ConnectionInfo connInfo, bool databaseExists = false) internal static DatabaseTaskHelper CreateDatabaseTaskHelper(ConnectionInfo connInfo, bool databaseExists = false)
{ {
XmlDocument xmlDoc = CreateDataContainerDocument(connInfo, databaseExists); XmlDocument xmlDoc = CreateDataContainerDocument(connInfo, databaseExists);
char[] passwordArray = connInfo.ConnectionDetails.Password.ToCharArray();
CDataContainer dataContainer; CDataContainer dataContainer;
// check if the connection is using SQL Auth or Integrated Auth // check if the connection is using SQL Auth or Integrated Auth
if (string.Equals(connInfo.ConnectionDetails.AuthenticationType, "SqlLogin", StringComparison.OrdinalIgnoreCase)) if (string.Equals(connInfo.ConnectionDetails.AuthenticationType, "SqlLogin", StringComparison.OrdinalIgnoreCase))
{ {
unsafe var passwordSecureString = new System.Security.SecureString();
{ foreach (char c in connInfo.ConnectionDetails.Password) {
fixed (char* passwordPtr = passwordArray) passwordSecureString.AppendChar(c);
{ }
dataContainer = new CDataContainer( dataContainer = new CDataContainer(
CDataContainer.ServerType.SQL, CDataContainer.ServerType.SQL,
connInfo.ConnectionDetails.ServerName, connInfo.ConnectionDetails.ServerName,
false, false,
connInfo.ConnectionDetails.UserName, connInfo.ConnectionDetails.UserName,
new System.Security.SecureString(passwordPtr, passwordArray.Length), passwordSecureString,
xmlDoc.InnerXml); xmlDoc.InnerXml);
} }
}
}
else else
{ {
dataContainer = new CDataContainer( dataContainer = new CDataContainer(