mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 10:58:30 -05:00
[User Management] Fix login handlers (#1896)
* fix default language * fix update * fix server role error with azure
This commit is contained in:
@@ -9709,6 +9709,14 @@ namespace Microsoft.SqlTools.ServiceLayer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string DefaultLanguagePlaceholder
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Keys.GetString(Keys.DefaultLanguagePlaceholder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static string ConnectionServiceListDbErrorNotConnected(string uri)
|
public static string ConnectionServiceListDbErrorNotConnected(string uri)
|
||||||
{
|
{
|
||||||
return Keys.GetString(Keys.ConnectionServiceListDbErrorNotConnected, uri);
|
return Keys.GetString(Keys.ConnectionServiceListDbErrorNotConnected, uri);
|
||||||
@@ -14027,6 +14035,9 @@ namespace Microsoft.SqlTools.ServiceLayer
|
|||||||
public const string ErrorConnectionNotFound = "ErrorConnectionNotFound";
|
public const string ErrorConnectionNotFound = "ErrorConnectionNotFound";
|
||||||
|
|
||||||
|
|
||||||
|
public const string DefaultLanguagePlaceholder = "DefaultLanguagePlaceholder";
|
||||||
|
|
||||||
|
|
||||||
private Keys()
|
private Keys()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|||||||
@@ -5386,4 +5386,8 @@ The Query Processor estimates that implementing the following index could improv
|
|||||||
<value>The connection could not be found</value>
|
<value>The connection could not be found</value>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="DefaultLanguagePlaceholder" xml:space="preserve">
|
||||||
|
<value><default></value>
|
||||||
|
<comment></comment>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2442,4 +2442,9 @@ UnsupportedModelType(string type) = Unsupported model type: {0}.
|
|||||||
GetUserDefinedObjectsFromModelFailed = Failed to get user defined objects from model.
|
GetUserDefinedObjectsFromModelFailed = Failed to get user defined objects from model.
|
||||||
|
|
||||||
#ObjectManagement Service
|
#ObjectManagement Service
|
||||||
ErrorConnectionNotFound = The connection could not be found
|
ErrorConnectionNotFound = The connection could not be found
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
# Security Service
|
||||||
|
DefaultLanguagePlaceholder = <default>
|
||||||
|
|
||||||
|
|||||||
@@ -6566,6 +6566,11 @@ The Query Processor estimates that implementing the following index could improv
|
|||||||
<target state="new">The Enclave Attestation URL must not be specified with Attestation Protocol 'None'. Either set appropriate Attestation Protocol or remove Attestation URL from connection properties.</target>
|
<target state="new">The Enclave Attestation URL must not be specified with Attestation Protocol 'None'. Either set appropriate Attestation Protocol or remove Attestation URL from connection properties.</target>
|
||||||
<note></note>
|
<note></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="DefaultLanguagePlaceholder">
|
||||||
|
<source><default></source>
|
||||||
|
<target state="new"><default></target>
|
||||||
|
<note></note>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
@@ -1363,6 +1363,7 @@ INNER JOIN sys.sql_logins AS sql_logins
|
|||||||
{
|
{
|
||||||
this.server = server;
|
this.server = server;
|
||||||
this.login = login;
|
this.login = login;
|
||||||
|
LoadData();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -2087,7 +2088,10 @@ INNER JOIN sys.sql_logins AS sql_logins
|
|||||||
this.SqlPassword = login.Password;
|
this.SqlPassword = login.Password;
|
||||||
this.OldPassword = login.OldPassword;
|
this.OldPassword = login.OldPassword;
|
||||||
this.LoginType = GetLoginType(login);
|
this.LoginType = GetLoginType(login);
|
||||||
this.DefaultLanguage = login.DefaultLanguage;
|
if (this.DefaultLanguage != null && 0 != String.Compare(login.DefaultLanguage, SR.DefaultLanguagePlaceholder, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
this.DefaultLanguage = login.DefaultLanguage.Split(" - ")[1];
|
||||||
|
}
|
||||||
this.DefaultDatabase = login.DefaultDatabase;
|
this.DefaultDatabase = login.DefaultDatabase;
|
||||||
this.EnforcePolicy = login.EnforcePasswordPolicy;
|
this.EnforcePolicy = login.EnforcePasswordPolicy;
|
||||||
this.EnforceExpiration = login.EnforcePasswordPolicy ? login.EnforcePasswordExpiration : false;
|
this.EnforceExpiration = login.EnforcePasswordPolicy ? login.EnforcePasswordExpiration : false;
|
||||||
@@ -2350,6 +2354,12 @@ INNER JOIN sys.sql_logins AS sql_logins
|
|||||||
// get the login
|
// get the login
|
||||||
Login login = server.Logins[this.LoginName];
|
Login login = server.Logins[this.LoginName];
|
||||||
|
|
||||||
|
if (server.DatabaseEngineType == DatabaseEngineType.SqlAzureDatabase)
|
||||||
|
{
|
||||||
|
ApplyServerRoleChangesForAzure(server);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// foreach server role
|
// foreach server role
|
||||||
foreach (ServerRole role in server.Roles)
|
foreach (ServerRole role in server.Roles)
|
||||||
{
|
{
|
||||||
@@ -2374,6 +2384,28 @@ INNER JOIN sys.sql_logins AS sql_logins
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ApplyServerRoleChangesForAzure(Microsoft.SqlServer.Management.Smo.Server server)
|
||||||
|
{
|
||||||
|
// foreach server role
|
||||||
|
foreach (string role in this.ServerRoles.ServerRoleNames)
|
||||||
|
{
|
||||||
|
bool wasOriginallyARoleMember = this.originalState.ServerRoles.IsMember(role);
|
||||||
|
bool isCurrentlyARoleMember = this.currentState.ServerRoles.IsMember(role);
|
||||||
|
|
||||||
|
|
||||||
|
// if the login is currently a member of the role, but wasn't originally a member, add the login to the role
|
||||||
|
if (isCurrentlyARoleMember && !wasOriginallyARoleMember)
|
||||||
|
{
|
||||||
|
//run query to add
|
||||||
|
}
|
||||||
|
// if the login is not currently a member of the role, but originally was a member, remove the login from the role
|
||||||
|
else if (!isCurrentlyARoleMember && wasOriginallyARoleMember)
|
||||||
|
{
|
||||||
|
//run query to drop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set the login's database role membership
|
/// Set the login's database role membership
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -200,7 +200,10 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
|
|||||||
|
|
||||||
var login = parameters.Login;
|
var login = parameters.Login;
|
||||||
prototype.SqlPassword = login.Password;
|
prototype.SqlPassword = login.Password;
|
||||||
prototype.DefaultLanguage = login.DefaultLanguage;
|
if (0 != String.Compare(login.DefaultLanguage, SR.DefaultLanguagePlaceholder, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
prototype.DefaultLanguage = login.DefaultLanguage.Split(" - ")[1];
|
||||||
|
}
|
||||||
prototype.DefaultDatabase = login.DefaultDatabase;
|
prototype.DefaultDatabase = login.DefaultDatabase;
|
||||||
prototype.EnforcePolicy = login.EnforcePasswordPolicy;
|
prototype.EnforcePolicy = login.EnforcePasswordPolicy;
|
||||||
prototype.EnforceExpiration = login.EnforcePasswordPolicy ? login.EnforcePasswordExpiration : false;
|
prototype.EnforceExpiration = login.EnforcePasswordPolicy ? login.EnforcePasswordExpiration : false;
|
||||||
@@ -257,12 +260,14 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
|
|||||||
{
|
{
|
||||||
databases[i] = dataContainer.Server.Databases[i].Name;
|
databases[i] = dataContainer.Server.Databases[i].Name;
|
||||||
}
|
}
|
||||||
string[] languages = new string[dataContainer.Server.Languages.Count];
|
|
||||||
for (int i = 0; i < dataContainer.Server.Languages.Count; i++)
|
|
||||||
{
|
|
||||||
languages[i] = dataContainer.Server.Languages[i].Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
var languageOptions = GetDefaultLanguageOptions(dataContainer);
|
||||||
|
var languageOptionsList = languageOptions.Select(FormatLanguageDisplay).ToList();
|
||||||
|
if (parameters.IsNewObject)
|
||||||
|
{
|
||||||
|
languageOptionsList.Insert(0, SR.DefaultLanguagePlaceholder);
|
||||||
|
}
|
||||||
|
string[] languages = languageOptionsList.ToArray();
|
||||||
LoginPrototype prototype = parameters.IsNewObject
|
LoginPrototype prototype = parameters.IsNewObject
|
||||||
? new LoginPrototype(dataContainer.Server)
|
? new LoginPrototype(dataContainer.Server)
|
||||||
: new LoginPrototype(dataContainer.Server, dataContainer.Server.Logins[parameters.Name]);
|
: new LoginPrototype(dataContainer.Server, dataContainer.Server.Logins[parameters.Name]);
|
||||||
@@ -286,7 +291,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
|
|||||||
EnforcePasswordPolicy = prototype.EnforcePolicy,
|
EnforcePasswordPolicy = prototype.EnforcePolicy,
|
||||||
MustChangePassword = prototype.MustChange,
|
MustChangePassword = prototype.MustChange,
|
||||||
DefaultDatabase = prototype.DefaultDatabase,
|
DefaultDatabase = prototype.DefaultDatabase,
|
||||||
DefaultLanguage = prototype.DefaultDatabase,
|
DefaultLanguage = FormatLanguageDisplay(languageOptions.FirstOrDefault(o => o?.Language.Name == prototype.DefaultLanguage || o?.Language.Alias == prototype.DefaultLanguage, null)),
|
||||||
ServerRoles = loginServerRoles.ToArray(),
|
ServerRoles = loginServerRoles.ToArray(),
|
||||||
ConnectPermission = prototype.WindowsGrantAccess,
|
ConnectPermission = prototype.WindowsGrantAccess,
|
||||||
IsEnabled = !prototype.IsDisabled,
|
IsEnabled = !prototype.IsDisabled,
|
||||||
@@ -330,6 +335,12 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
|
|||||||
{
|
{
|
||||||
await requestContext.SendResult(new object());
|
await requestContext.SendResult(new object());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string FormatLanguageDisplay(LanguageDisplay? l)
|
||||||
|
{
|
||||||
|
if (l == null) return null;
|
||||||
|
return string.Format("{0} - {1}", l.Language.Alias, l.Language.Name);
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region "User Handlers"
|
#region "User Handlers"
|
||||||
@@ -556,7 +567,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GetDefaultLanguageOptions(CDataContainer dataContainer)
|
private IList<LanguageDisplay> GetDefaultLanguageOptions(CDataContainer dataContainer)
|
||||||
{
|
{
|
||||||
// this.defaultLanguageComboBox.Items.Clear();
|
// this.defaultLanguageComboBox.Items.Clear();
|
||||||
// this.defaultLanguageComboBox.Items.Add(defaultLanguagePlaceholder);
|
// this.defaultLanguageComboBox.Items.Add(defaultLanguagePlaceholder);
|
||||||
@@ -574,11 +585,13 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the language display objects to the combo box
|
IList<LanguageDisplay> res = new List<LanguageDisplay>();
|
||||||
foreach (LanguageDisplay languageDisplay in sortedLanguages.Values)
|
foreach (LanguageDisplay ld in sortedLanguages.Values)
|
||||||
{
|
{
|
||||||
//this.defaultLanguageComboBox.Items.Add(languageDisplay);
|
res.Add(ld);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// code needs to be ported into the useraction class
|
// code needs to be ported into the useraction class
|
||||||
|
|||||||
Reference in New Issue
Block a user