mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-13 17:23:02 -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)
|
||||
{
|
||||
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()
|
||||
{ }
|
||||
|
||||
|
||||
@@ -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><default></value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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><default></source>
|
||||
<target state="new"><default></target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user