mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-13 17:23:02 -05:00
Fix app name and connection string defaults to match extension defaults (#2132)
This commit is contained in:
@@ -13,7 +13,6 @@ namespace Microsoft.SqlTools.Hosting.Protocol
|
|||||||
public const string ContentLengthFormatString = "Content-Length: {0}\r\n\r\n";
|
public const string ContentLengthFormatString = "Content-Length: {0}\r\n\r\n";
|
||||||
public static readonly JsonSerializerSettings JsonSerializerSettings;
|
public static readonly JsonSerializerSettings JsonSerializerSettings;
|
||||||
|
|
||||||
public static readonly string DefaultApplicationName = "azdata";
|
|
||||||
public static readonly string SqlLoginAuthenticationType = "SqlLogin";
|
public static readonly string SqlLoginAuthenticationType = "SqlLogin";
|
||||||
|
|
||||||
// Feature names
|
// Feature names
|
||||||
|
|||||||
@@ -63,6 +63,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static ConnectionService Instance => instance.Value;
|
public static ConnectionService Instance => instance.Value;
|
||||||
|
|
||||||
|
private static readonly SqlConnectionStringBuilder defaultBuilder = new SqlConnectionStringBuilder();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// IV and Key as received from Encryption Key Notification event.
|
/// IV and Key as received from Encryption Key Notification event.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -165,6 +167,10 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
|
|
||||||
return response.Token;
|
return response.Token;
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Default Application name as received in service startup
|
||||||
|
/// </summary>
|
||||||
|
public static string ApplicationName { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enables configured 'Sql Authentication Provider' for 'Active Directory Interactive' authentication mode to be used
|
/// Enables configured 'Sql Authentication Provider' for 'Active Directory Interactive' authentication mode to be used
|
||||||
@@ -482,9 +488,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
// Connection Service will not set custom application name if connection pooling is enabled on service.
|
// Connection Service will not set custom application name if connection pooling is enabled on service.
|
||||||
if (!EnableConnectionPooling && !string.IsNullOrWhiteSpace(applicationName) && !string.IsNullOrWhiteSpace(featureName) && !applicationName.EndsWith(featureName))
|
if (!EnableConnectionPooling && !string.IsNullOrWhiteSpace(applicationName) && !string.IsNullOrWhiteSpace(featureName) && !applicationName.EndsWith(featureName))
|
||||||
{
|
{
|
||||||
int azdataStartIndex = applicationName.IndexOf(Constants.DefaultApplicationName);
|
int appNameStartIndex = applicationName.IndexOf(ApplicationName);
|
||||||
string originalAppName = azdataStartIndex != -1
|
string originalAppName = appNameStartIndex != -1
|
||||||
? applicationName.Substring(0, azdataStartIndex + Constants.DefaultApplicationName.Length)
|
? applicationName.Substring(0, appNameStartIndex + ApplicationName.Length)
|
||||||
: applicationName; // Reset to default if azdata not found.
|
: applicationName; // Reset to default if azdata not found.
|
||||||
appNameWithFeature = $"{originalAppName}-{featureName}";
|
appNameWithFeature = $"{originalAppName}-{featureName}";
|
||||||
}
|
}
|
||||||
@@ -1096,6 +1102,13 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
|
|
||||||
if (commandOptions != null)
|
if (commandOptions != null)
|
||||||
{
|
{
|
||||||
|
ApplicationName = commandOptions.ApplicationName switch
|
||||||
|
{
|
||||||
|
"azuredatastudio" => "azdata",
|
||||||
|
"code" => "vscode-mssql",
|
||||||
|
_ => "sqltools" // fallback
|
||||||
|
};
|
||||||
|
|
||||||
if (commandOptions.EnableSqlAuthenticationProvider)
|
if (commandOptions.EnableSqlAuthenticationProvider)
|
||||||
{
|
{
|
||||||
// Register SqlAuthenticationProvider with SqlConnection for AAD Interactive (MFA) authentication.
|
// Register SqlAuthenticationProvider with SqlConnection for AAD Interactive (MFA) authentication.
|
||||||
@@ -1636,7 +1649,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
// default connection string application name to always be included unless set to false
|
// default connection string application name to always be included unless set to false
|
||||||
if (connStringBuilder.ApplicationName == null && (!connStringParams.IncludeApplicationName.HasValue || connStringParams.IncludeApplicationName.Value == true))
|
if (connStringBuilder.ApplicationName == null && (!connStringParams.IncludeApplicationName.HasValue || connStringParams.IncludeApplicationName.Value == true))
|
||||||
{
|
{
|
||||||
connStringBuilder.ApplicationName = Constants.DefaultApplicationName;
|
connStringBuilder.ApplicationName = ApplicationName;
|
||||||
}
|
}
|
||||||
connectionString = connStringBuilder.ConnectionString;
|
connectionString = connStringBuilder.ConnectionString;
|
||||||
|
|
||||||
@@ -1665,41 +1678,43 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
public ConnectionDetails ParseConnectionString(string connectionString)
|
public ConnectionDetails ParseConnectionString(string connectionString)
|
||||||
{
|
{
|
||||||
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
|
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
|
||||||
|
|
||||||
|
// Set defaults as per MSSQL connection property defaults, not SqlClient's Connection string buider defaults
|
||||||
ConnectionDetails details = new ConnectionDetails()
|
ConnectionDetails details = new ConnectionDetails()
|
||||||
{
|
{
|
||||||
ApplicationIntent = builder.ApplicationIntent.ToString(),
|
ApplicationIntent = defaultBuilder.ApplicationIntent != builder.ApplicationIntent ? builder.ApplicationIntent.ToString() : null,
|
||||||
ApplicationName = builder.ApplicationName,
|
ApplicationName = defaultBuilder.ApplicationName != builder.ApplicationName ? builder.ApplicationName : ApplicationName,
|
||||||
AttachDbFilename = builder.AttachDBFilename,
|
AttachDbFilename = defaultBuilder.AttachDBFilename != builder.AttachDBFilename ? builder.AttachDBFilename.ToString() : null,
|
||||||
AuthenticationType = builder.IntegratedSecurity ? "Integrated" :
|
AuthenticationType = builder.IntegratedSecurity ? "Integrated" :
|
||||||
(builder.Authentication == SqlAuthenticationMethod.ActiveDirectoryInteractive
|
(builder.Authentication == SqlAuthenticationMethod.ActiveDirectoryInteractive
|
||||||
? "ActiveDirectoryInteractive" : "SqlLogin"),
|
? "AzureMFA" : "SqlLogin"),
|
||||||
ConnectRetryCount = builder.ConnectRetryCount,
|
ConnectRetryCount = defaultBuilder.ConnectRetryCount != builder.ConnectRetryCount ? builder.ConnectRetryCount : 1,
|
||||||
ConnectRetryInterval = builder.ConnectRetryInterval,
|
ConnectRetryInterval = defaultBuilder.ConnectRetryInterval != builder.ConnectRetryInterval ? builder.ConnectRetryInterval : 10,
|
||||||
ConnectTimeout = builder.ConnectTimeout,
|
ConnectTimeout = defaultBuilder.ConnectTimeout != builder.ConnectTimeout ? builder.ConnectTimeout : 30,
|
||||||
CommandTimeout = builder.CommandTimeout,
|
CommandTimeout = defaultBuilder.CommandTimeout != builder.CommandTimeout ? builder.CommandTimeout : 30,
|
||||||
CurrentLanguage = builder.CurrentLanguage,
|
CurrentLanguage = defaultBuilder.CurrentLanguage != builder.CurrentLanguage ? builder.CurrentLanguage : null,
|
||||||
DatabaseName = builder.InitialCatalog,
|
DatabaseName = defaultBuilder.InitialCatalog != builder.InitialCatalog ? builder.InitialCatalog : null,
|
||||||
ColumnEncryptionSetting = builder.ColumnEncryptionSetting.ToString(),
|
ColumnEncryptionSetting = defaultBuilder.ColumnEncryptionSetting != builder.ColumnEncryptionSetting ? builder.ColumnEncryptionSetting.ToString() : null,
|
||||||
EnclaveAttestationProtocol = builder.AttestationProtocol == SqlConnectionAttestationProtocol.NotSpecified ? null : builder.AttestationProtocol.ToString(),
|
EnclaveAttestationProtocol = defaultBuilder.AttestationProtocol != builder.AttestationProtocol ? builder.AttestationProtocol.ToString() : null,
|
||||||
EnclaveAttestationUrl = builder.EnclaveAttestationUrl,
|
EnclaveAttestationUrl = defaultBuilder.EnclaveAttestationUrl != builder.EnclaveAttestationUrl ? builder.EnclaveAttestationUrl : null,
|
||||||
Encrypt = builder.Encrypt.ToString(),
|
Encrypt = defaultBuilder.Encrypt != builder.Encrypt ? builder.Encrypt.ToString() : Boolean.TrueString.ToLower(CultureInfo.InvariantCulture),
|
||||||
FailoverPartner = builder.FailoverPartner,
|
FailoverPartner = defaultBuilder.FailoverPartner != builder.FailoverPartner ? builder.FailoverPartner : null,
|
||||||
HostNameInCertificate = builder.HostNameInCertificate,
|
HostNameInCertificate = defaultBuilder.HostNameInCertificate != builder.HostNameInCertificate ? builder.HostNameInCertificate : null,
|
||||||
LoadBalanceTimeout = builder.LoadBalanceTimeout,
|
LoadBalanceTimeout = defaultBuilder.LoadBalanceTimeout != builder.LoadBalanceTimeout ? builder.LoadBalanceTimeout : null,
|
||||||
MaxPoolSize = builder.MaxPoolSize,
|
MaxPoolSize = defaultBuilder.MaxPoolSize != builder.MaxPoolSize ? builder.MaxPoolSize : null,
|
||||||
MinPoolSize = builder.MinPoolSize,
|
MinPoolSize = defaultBuilder.MinPoolSize != builder.MinPoolSize ? builder.MinPoolSize : null,
|
||||||
MultipleActiveResultSets = builder.MultipleActiveResultSets,
|
MultipleActiveResultSets = defaultBuilder.MultipleActiveResultSets != builder.MultipleActiveResultSets ? builder.MultipleActiveResultSets : null,
|
||||||
MultiSubnetFailover = builder.MultiSubnetFailover,
|
MultiSubnetFailover = defaultBuilder.MultiSubnetFailover != builder.MultiSubnetFailover ? builder.MultiSubnetFailover : null,
|
||||||
PacketSize = builder.PacketSize,
|
PacketSize = defaultBuilder.PacketSize != builder.PacketSize ? builder.PacketSize : null,
|
||||||
Password = !builder.IntegratedSecurity ? builder.Password : string.Empty,
|
Password = !builder.IntegratedSecurity ? builder.Password : null,
|
||||||
PersistSecurityInfo = builder.PersistSecurityInfo,
|
PersistSecurityInfo = defaultBuilder.PersistSecurityInfo != builder.PersistSecurityInfo ? builder.PersistSecurityInfo : null,
|
||||||
Pooling = builder.Pooling,
|
Pooling = defaultBuilder.Pooling != builder.Pooling ? builder.Pooling : null,
|
||||||
Replication = builder.Replication,
|
Replication = defaultBuilder.Replication != builder.Replication ? builder.Replication : null,
|
||||||
ServerName = builder.DataSource,
|
ServerName = defaultBuilder.DataSource != builder.DataSource ? builder.DataSource : null,
|
||||||
TrustServerCertificate = builder.TrustServerCertificate,
|
TrustServerCertificate = defaultBuilder.TrustServerCertificate != builder.TrustServerCertificate ? builder.TrustServerCertificate : false,
|
||||||
TypeSystemVersion = builder.TypeSystemVersion,
|
TypeSystemVersion = defaultBuilder.TypeSystemVersion != builder.TypeSystemVersion ? builder.TypeSystemVersion : null,
|
||||||
UserName = builder.UserID,
|
UserName = defaultBuilder.UserID != builder.UserID ? builder.UserID : null,
|
||||||
WorkstationId = builder.WorkstationID,
|
WorkstationId = defaultBuilder.WorkstationID != builder.WorkstationID ? builder.WorkstationID : null
|
||||||
};
|
};
|
||||||
|
|
||||||
return details;
|
return details;
|
||||||
@@ -1853,8 +1868,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// capture original values
|
// capture original values
|
||||||
int? originalTimeout = connInfo.ConnectionDetails.ConnectTimeout;
|
|
||||||
int? originalCommandTimeout = connInfo.ConnectionDetails.CommandTimeout;
|
|
||||||
bool? originalPersistSecurityInfo = connInfo.ConnectionDetails.PersistSecurityInfo;
|
bool? originalPersistSecurityInfo = connInfo.ConnectionDetails.PersistSecurityInfo;
|
||||||
bool? originalPooling = connInfo.ConnectionDetails.Pooling;
|
bool? originalPooling = connInfo.ConnectionDetails.Pooling;
|
||||||
|
|
||||||
@@ -1862,8 +1875,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
bool shouldForceDisablePooling = !EnableConnectionPooling && featureName != Constants.LanguageServiceFeature;
|
bool shouldForceDisablePooling = !EnableConnectionPooling && featureName != Constants.LanguageServiceFeature;
|
||||||
|
|
||||||
// increase the connection and command timeout to at least 30 seconds and and build connection string
|
// increase the connection and command timeout to at least 30 seconds and and build connection string
|
||||||
connInfo.ConnectionDetails.ConnectTimeout = Math.Max(30, originalTimeout ?? 0);
|
connInfo.ConnectionDetails.ConnectTimeout = Math.Max(30, connInfo.ConnectionDetails.ConnectTimeout ?? 0);
|
||||||
connInfo.ConnectionDetails.CommandTimeout = Math.Max(30, originalCommandTimeout ?? 0);
|
connInfo.ConnectionDetails.CommandTimeout = Math.Max(30, connInfo.ConnectionDetails.CommandTimeout ?? 0);
|
||||||
// enable PersistSecurityInfo to handle issues in SMO where the connection context is lost in reconnections
|
// enable PersistSecurityInfo to handle issues in SMO where the connection context is lost in reconnections
|
||||||
connInfo.ConnectionDetails.PersistSecurityInfo = true;
|
connInfo.ConnectionDetails.PersistSecurityInfo = true;
|
||||||
|
|
||||||
@@ -1878,8 +1891,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
string connectionString = ConnectionService.BuildConnectionString(connInfo.ConnectionDetails, shouldForceDisablePooling);
|
string connectionString = ConnectionService.BuildConnectionString(connInfo.ConnectionDetails, shouldForceDisablePooling);
|
||||||
|
|
||||||
// restore original values
|
// restore original values
|
||||||
connInfo.ConnectionDetails.ConnectTimeout = originalTimeout;
|
|
||||||
connInfo.ConnectionDetails.CommandTimeout = originalCommandTimeout;
|
|
||||||
connInfo.ConnectionDetails.PersistSecurityInfo = originalPersistSecurityInfo;
|
connInfo.ConnectionDetails.PersistSecurityInfo = originalPersistSecurityInfo;
|
||||||
connInfo.ConnectionDetails.Pooling = originalPooling;
|
connInfo.ConnectionDetails.Pooling = originalPooling;
|
||||||
|
|
||||||
|
|||||||
@@ -1807,9 +1807,9 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
|
|||||||
Assert.That(details.DatabaseName, Is.EqualTo("{databasename}"), "Unexpected database name");
|
Assert.That(details.DatabaseName, Is.EqualTo("{databasename}"), "Unexpected database name");
|
||||||
Assert.That(details.UserName, Is.EqualTo("{your_username}"), "Unexpected username");
|
Assert.That(details.UserName, Is.EqualTo("{your_username}"), "Unexpected username");
|
||||||
Assert.That(details.Password, Is.EqualTo("{your_password}"), "Unexpected password");
|
Assert.That(details.Password, Is.EqualTo("{your_password}"), "Unexpected password");
|
||||||
Assert.That(details.PersistSecurityInfo, Is.False, "Unexpected Persist Security Info");
|
Assert.That(details.PersistSecurityInfo, Is.Null, "Unexpected Persist Security Info");
|
||||||
Assert.That(details.MultipleActiveResultSets, Is.False, "Unexpected Multiple Active Result Sets value");
|
Assert.That(details.MultipleActiveResultSets, Is.Null, "Unexpected Multiple Active Result Sets value");
|
||||||
Assert.That(details.Encrypt, Is.EqualTo("True"), "Unexpected Encrypt value");
|
Assert.That(details.Encrypt, Is.EqualTo("true"), "Unexpected Encrypt value");
|
||||||
Assert.That(details.TrustServerCertificate, Is.False, "Unexpected database name value");
|
Assert.That(details.TrustServerCertificate, Is.False, "Unexpected database name value");
|
||||||
Assert.That(details.HostNameInCertificate, Is.EqualTo("{servername}"), "Unexpected Host Name in Certificate value");
|
Assert.That(details.HostNameInCertificate, Is.EqualTo("{servername}"), "Unexpected Host Name in Certificate value");
|
||||||
Assert.That(details.ConnectTimeout, Is.EqualTo(30), "Unexpected Connect Timeout value");
|
Assert.That(details.ConnectTimeout, Is.EqualTo(30), "Unexpected Connect Timeout value");
|
||||||
@@ -1832,8 +1832,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
|
|||||||
Assert.That(details.DatabaseName, Is.EqualTo("{databasename}"), "Unexpected database name");
|
Assert.That(details.DatabaseName, Is.EqualTo("{databasename}"), "Unexpected database name");
|
||||||
Assert.That(details.UserName, Is.EqualTo("{your_username}"), "Unexpected username");
|
Assert.That(details.UserName, Is.EqualTo("{your_username}"), "Unexpected username");
|
||||||
Assert.That(details.Password, Is.EqualTo("{your_password}"), "Unexpected password");
|
Assert.That(details.Password, Is.EqualTo("{your_password}"), "Unexpected password");
|
||||||
Assert.That(details.PersistSecurityInfo, Is.False, "Unexpected Persist Security Info");
|
Assert.That(details.PersistSecurityInfo, Is.Null, "Unexpected Persist Security Info");
|
||||||
Assert.That(details.MultipleActiveResultSets, Is.False, "Unexpected Multiple Active Result Sets value");
|
Assert.That(details.MultipleActiveResultSets, Is.Null, "Unexpected Multiple Active Result Sets value");
|
||||||
Assert.That(details.Encrypt, Is.EqualTo(SqlConnectionEncryptOption.Strict.ToString()), "Unexpected Encrypt value");
|
Assert.That(details.Encrypt, Is.EqualTo(SqlConnectionEncryptOption.Strict.ToString()), "Unexpected Encrypt value");
|
||||||
Assert.That(details.TrustServerCertificate, Is.False, "Unexpected database name value");
|
Assert.That(details.TrustServerCertificate, Is.False, "Unexpected database name value");
|
||||||
Assert.That(details.HostNameInCertificate, Is.EqualTo("{servername}"), "Unexpected Host Name in Certificate value");
|
Assert.That(details.HostNameInCertificate, Is.EqualTo("{servername}"), "Unexpected Host Name in Certificate value");
|
||||||
|
|||||||
Reference in New Issue
Block a user