[User Management] Fix login handlers (#1896)

* fix default language

* fix update

* fix server role error with azure
This commit is contained in:
Hai Cao
2023-03-02 17:51:31 -08:00
committed by GitHub
parent bb838269ac
commit bec0877e32
6 changed files with 83 additions and 13 deletions

View File

@@ -9709,6 +9709,14 @@ namespace Microsoft.SqlTools.ServiceLayer
}
}
public static string DefaultLanguagePlaceholder
{
get
{
return Keys.GetString(Keys.DefaultLanguagePlaceholder);
}
}
public static string ConnectionServiceListDbErrorNotConnected(string uri)
{
return Keys.GetString(Keys.ConnectionServiceListDbErrorNotConnected, uri);
@@ -14027,6 +14035,9 @@ namespace Microsoft.SqlTools.ServiceLayer
public const string ErrorConnectionNotFound = "ErrorConnectionNotFound";
public const string DefaultLanguagePlaceholder = "DefaultLanguagePlaceholder";
private Keys()
{ }

View File

@@ -5386,4 +5386,8 @@ The Query Processor estimates that implementing the following index could improv
<value>The connection could not be found</value>
<comment></comment>
</data>
<data name="DefaultLanguagePlaceholder" xml:space="preserve">
<value>&lt;default&gt;</value>
<comment></comment>
</data>
</root>

View File

@@ -2442,4 +2442,9 @@ UnsupportedModelType(string type) = Unsupported model type: {0}.
GetUserDefinedObjectsFromModelFailed = Failed to get user defined objects from model.
#ObjectManagement Service
ErrorConnectionNotFound = The connection could not be found
ErrorConnectionNotFound = The connection could not be found
############################################################################
# Security Service
DefaultLanguagePlaceholder = <default>

View File

@@ -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>
<note></note>
</trans-unit>
<trans-unit id="DefaultLanguagePlaceholder">
<source>&lt;default&gt;</source>
<target state="new">&lt;default&gt;</target>
<note></note>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1363,6 +1363,7 @@ INNER JOIN sys.sql_logins AS sql_logins
{
this.server = server;
this.login = login;
LoadData();
}
/// <summary>
@@ -2087,7 +2088,10 @@ INNER JOIN sys.sql_logins AS sql_logins
this.SqlPassword = login.Password;
this.OldPassword = login.OldPassword;
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.EnforcePolicy = login.EnforcePasswordPolicy;
this.EnforceExpiration = login.EnforcePasswordPolicy ? login.EnforcePasswordExpiration : false;
@@ -2350,6 +2354,12 @@ INNER JOIN sys.sql_logins AS sql_logins
// get the login
Login login = server.Logins[this.LoginName];
if (server.DatabaseEngineType == DatabaseEngineType.SqlAzureDatabase)
{
ApplyServerRoleChangesForAzure(server);
return;
}
// foreach server role
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>
/// Set the login's database role membership
/// </summary>

View File

@@ -200,7 +200,10 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
var login = parameters.Login;
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.EnforcePolicy = login.EnforcePasswordPolicy;
prototype.EnforceExpiration = login.EnforcePasswordPolicy ? login.EnforcePasswordExpiration : false;
@@ -257,12 +260,14 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
{
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
? new LoginPrototype(dataContainer.Server)
: new LoginPrototype(dataContainer.Server, dataContainer.Server.Logins[parameters.Name]);
@@ -286,7 +291,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
EnforcePasswordPolicy = prototype.EnforcePolicy,
MustChangePassword = prototype.MustChange,
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(),
ConnectPermission = prototype.WindowsGrantAccess,
IsEnabled = !prototype.IsDisabled,
@@ -330,6 +335,12 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
{
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
#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.Add(defaultLanguagePlaceholder);
@@ -574,11 +585,13 @@ namespace Microsoft.SqlTools.ServiceLayer.Security
}
}
// add the language display objects to the combo box
foreach (LanguageDisplay languageDisplay in sortedLanguages.Values)
IList<LanguageDisplay> res = new List<LanguageDisplay>();
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