Add change password function and handling (#1771)

* added ChangePassword to connectionService

* added changepasswordparams

* added more code

* added more changes to connectionservice

* added more changes

* added small test

* added changepasswordrequest

* added different ServerConnection constructor

* consolidated changepassword

* added exception catch

* added passwordChangeFail params

* added changePassword to it's own function

* simplified changePassword

* made fixes to test

* added new test

* added one additional connection test

* added response callback

* removed unnecessary SendError

* added localized empty password error

* added updated error messages

* added small fix to check

* added changes based on feedback

* added minor change

* fix tests

* renamed messages to errorDetails

* simplified error message

* small change to connectionservice message

* error message change

* added environment newline

* added error retry messages to STS

* added regex

* added newline handling
This commit is contained in:
Alex Ma
2022-12-07 14:24:26 -08:00
committed by GitHub
parent d761e56354
commit 7eee5180a2
9 changed files with 322 additions and 0 deletions

View File

@@ -22,6 +22,7 @@ using Microsoft.SqlTools.ServiceLayer.LanguageServices.Contracts;
using Microsoft.SqlTools.ServiceLayer.Utility;
using Microsoft.SqlTools.Utility;
using System.Diagnostics;
using System.Text.RegularExpressions;
namespace Microsoft.SqlTools.ServiceLayer.Connection
{
@@ -1060,6 +1061,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
// Register request and event handlers with the Service Host
serviceHost.SetRequestHandler(ConnectionRequest.Type, HandleConnectRequest);
serviceHost.SetRequestHandler(CancelConnectRequest.Type, HandleCancelConnectRequest);
serviceHost.SetRequestHandler(ChangePasswordRequest.Type, HandleChangePasswordRequest);
serviceHost.SetRequestHandler(DisconnectRequest.Type, HandleDisconnectRequest);
serviceHost.SetRequestHandler(ListDatabasesRequest.Type, HandleListDatabasesRequest);
serviceHost.SetRequestHandler(ChangeDatabaseRequest.Type, HandleChangeDatabaseRequest);
@@ -1137,6 +1139,65 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
}).ContinueWithOnFaulted(null);
}
/// <summary>
/// Handle new change password requests
/// </summary>
/// <param name="connectParams"></param>
/// <param name="requestContext"></param>
/// <returns></returns>
protected async Task HandleChangePasswordRequest(
ChangePasswordParams changePasswordParams,
RequestContext<PasswordChangeResponse> requestContext)
{
Logger.Write(TraceEventType.Verbose, "HandleChangePasswordRequest");
PasswordChangeResponse newResponse = new PasswordChangeResponse();
try
{
ChangePassword(changePasswordParams);
newResponse.Result = true;
}
catch (Exception ex)
{
newResponse.Result = false;
newResponse.ErrorMessage = ex.InnerException != null ? (ex.Message + Environment.NewLine + Environment.NewLine + ex.InnerException.Message) : ex.Message;
newResponse.ErrorMessage = Regex.Replace(newResponse.ErrorMessage, @"\r?\nChanged database context to '\w+'\.", "");
newResponse.ErrorMessage = Regex.Replace(newResponse.ErrorMessage, @"\r?\nChanged language setting to \w+\.", "");
if (newResponse.ErrorMessage.Equals(SR.PasswordChangeEmptyPassword))
{
newResponse.ErrorMessage += Environment.NewLine + Environment.NewLine + SR.PasswordChangeEmptyPasswordRetry;
}
else if (newResponse.ErrorMessage.Contains(SR.PasswordChangeDNMReqs))
{
newResponse.ErrorMessage += Environment.NewLine + Environment.NewLine + SR.PasswordChangeDNMReqsRetry;
}
else if (newResponse.ErrorMessage.Contains(SR.PasswordChangePWCannotBeUsed))
{
newResponse.ErrorMessage += Environment.NewLine + Environment.NewLine + SR.PasswordChangePWCannotBeUsedRetry;
}
}
await requestContext.SendResult(newResponse);
}
public void ChangePassword(ChangePasswordParams changePasswordParams)
{
// Empty passwords are not valid.
if (string.IsNullOrEmpty(changePasswordParams.NewPassword))
{
throw new Exception(SR.PasswordChangeEmptyPassword);
}
// result is null if the ConnectParams was successfully validated
ConnectionCompleteParams result = ValidateConnectParams(changePasswordParams);
if (result != null)
{
throw new Exception(result.ErrorMessage, new Exception(result.Messages));
}
// Change the password of the connection
ServerConnection serverConnection = new ServerConnection(changePasswordParams.Connection.ServerName, changePasswordParams.Connection.UserName, changePasswordParams.Connection.Password);
serverConnection.ChangePassword(changePasswordParams.NewPassword);
}
/// <summary>
/// Handle cancel connect requests
/// </summary>