aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2020-01-27 09:19:11 +0200
committerShlomo Hecht <shlomo@twine-s.com>2020-01-27 09:19:11 +0200
commitddda6089bff56e80703c8d2dce297919edc58bf1 (patch)
tree7702c5cf169124d522eacc7f1a9e0878373baedd /Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs
parent1d4d327571d4c0c9f4e17411551bd4dae1e2aed0 (diff)
parentbf2f3245339b9fd9148a2ad25b5ba3320e970cc1 (diff)
downloadTango-ddda6089bff56e80703c8d2dce297919edc58bf1.tar.gz
Tango-ddda6089bff56e80703c8d2dce297919edc58bf1.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs')
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs166
1 files changed, 164 insertions, 2 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs
index cf34764d9..c00caf72a 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs
@@ -22,6 +22,9 @@ using Tango.MachineStudio.UI.Messages;
using Tango.Settings;
using Tango.SharedUI;
using Tango.Web;
+using SimpleValidator.Extensions;
+using Tango.BL.Entities;
+using System.Data.Entity;
namespace Tango.MachineStudio.UI.ViewModels
{
@@ -38,6 +41,7 @@ namespace Tango.MachineStudio.UI.ViewModels
private Rfc2898Cryptographer cryptographer;
private MachineStudioSettings _settings;
private MachineStudioWebClient _machineStudioWebClient;
+ private TaskCompletionSource<object> _updatePasswordCompletionSource;
private String _email;
/// <summary>
@@ -82,6 +86,14 @@ namespace Tango.MachineStudio.UI.ViewModels
set { _isLogging = value; RaisePropertyChangedAuto(); }
}
+ private bool _showLogginDetails;
+ public bool ShowLoggingDetails
+ {
+ get { return _showLogginDetails; }
+ set { _showLogginDetails = value; RaisePropertyChangedAuto(); }
+ }
+
+
private bool _rememberMe;
/// <summary>
/// Gets or sets a value indicating whether to remember the last user email and password.
@@ -102,6 +114,47 @@ namespace Tango.MachineStudio.UI.ViewModels
set { _enableSlotSelection = value; RaisePropertyChangedAuto(); }
}
+ private bool _isActiveDirectory;
+ public bool IsActiveDirectory
+ {
+ get { return _isActiveDirectory; }
+ set { _isActiveDirectory = value; RaisePropertyChangedAuto(); if (value) IsStandardUser = false; }
+ }
+
+ private bool _isStandardUser;
+ public bool IsStandardUser
+ {
+ get { return _isStandardUser; }
+ set { _isStandardUser = value; RaisePropertyChangedAuto(); if (value) IsActiveDirectory = false; }
+ }
+
+ private String _progressLog;
+ public String ProgressLog
+ {
+ get { return _progressLog; }
+ set { _progressLog = value; RaisePropertyChangedAuto(); }
+ }
+
+ private bool _isChangingPassword;
+ public bool IsChangingPassword
+ {
+ get { return _isChangingPassword; }
+ set { _isChangingPassword = value; RaisePropertyChangedAuto(); }
+ }
+
+ private String _newPassword1;
+ public String NewPassword1
+ {
+ get { return _newPassword1; }
+ set { _newPassword1 = value; RaisePropertyChangedAuto(); }
+ }
+
+ private String _newPassword2;
+ public String NewPassword2
+ {
+ get { return _newPassword2; }
+ set { _newPassword2 = value; RaisePropertyChangedAuto(); }
+ }
/// <summary>
/// Gets or sets the login command.
@@ -109,6 +162,11 @@ namespace Tango.MachineStudio.UI.ViewModels
public RelayCommand LoginCommand { get; set; }
/// <summary>
+ /// Gets or sets the update password command.
+ /// </summary>
+ public RelayCommand UpdatePasswordCommand { get; set; }
+
+ /// <summary>
/// Initializes a new instance of the <see cref="LoginViewVM"/> class.
/// </summary>
/// <param name="authenticationProvider">The authentication provider.</param>
@@ -117,6 +175,7 @@ namespace Tango.MachineStudio.UI.ViewModels
public LoginViewVM(MachineStudioWebClient machineStudioWebClient, IAuthenticationProvider authenticationProvider, INavigationManager navigationManager, INotificationProvider notificationProvider, IEventLogger eventLogger)
{
EnableSlotSelection = true;
+ ShowLoggingDetails = true;
_machineStudioWebClient = machineStudioWebClient;
_settings = SettingsManager.Default.GetOrCreate<MachineStudioSettings>();
@@ -126,12 +185,22 @@ namespace Tango.MachineStudio.UI.ViewModels
_authenticationProvider = authenticationProvider;
_eventLogger = eventLogger;
LoginCommand = new RelayCommand(Login, () => !IsLogging);
+ UpdatePasswordCommand = new RelayCommand(UpdatePassword, () => IsChangingPassword);
cryptographer = new Rfc2898Cryptographer();
Email = _settings.LastLoginEmail;
DeploymentSlot = _settings.DeploymentSlot;
RememberMe = _settings.RememberMe;
+ if (_settings.LastLoginMethod == LoginMethod.ActiveDirectory)
+ {
+ IsActiveDirectory = true;
+ }
+ else
+ {
+ IsStandardUser = true;
+ }
+
try
{
Password = cryptographer.Decrypt(_settings.LastLoginPassword);
@@ -152,13 +221,22 @@ namespace Tango.MachineStudio.UI.ViewModels
try
{
IsLogging = true;
+ ShowLoggingDetails = false;
+ NewPassword1 = String.Empty;
+ NewPassword2 = String.Empty;
+
InvalidateRelayCommands();
+ LoginMethod loginMethod = IsActiveDirectory ? LoginMethod.ActiveDirectory : LoginMethod.StandardUser;
+
await Task.Factory.StartNew(() =>
{
_settings.DeploymentSlot = DeploymentSlot;
- LoginResponse result = _authenticationProvider.Login(Email, Password, _settings.ByPassEnvironmentVersionCheck).Response;
+ LoginResponse result = _authenticationProvider.Login(Email, Password, loginMethod, _settings.ByPassEnvironmentVersionCheck, (progress) =>
+ {
+ ProgressLog = progress;
+ }).Response;
if (result.VersionChangeRequired && !_settings.ByPassEnvironmentVersionCheck)
{
@@ -177,31 +255,115 @@ namespace Tango.MachineStudio.UI.ViewModels
return;
}
+ if (result.PasswordChangeRequired)
+ {
+ StartUpdatePassword().Task.GetAwaiter().GetResult();
+ Password = NewPassword1;
+ Login();
+ return;
+ }
+
_eventLogger.Log(EventTypes.APPLICATION_STARTED, "Application Started!");
_navigationManager.NavigateTo(NavigationView.MainView);
_settings.LastLoginEmail = Email;
_settings.RememberMe = RememberMe;
+ _settings.LastLoginMethod = loginMethod;
_settings.LastLoginPassword = RememberMe ? cryptographer.Encrypt(Password) : null;
_settings.Save();
_eventLogger.Log("User logged in.");
EnableSlotSelection = false;
+
+ IsLogging = false;
+ ShowLoggingDetails = true;
+ IsChangingPassword = false;
+ InvalidateRelayCommands();
});
}
catch (Exception ex)
{
+ IsLogging = false;
+ ShowLoggingDetails = true;
+ IsChangingPassword = false;
+ InvalidateRelayCommands();
LogManager.Log(ex, "Login Error.");
_notificationProvider.ShowError($"An error occurred while trying to perform the log-in operation.\n{ex.FlattenMessage()}");
}
- finally
+ }
+ }
+
+ private TaskCompletionSource<object> StartUpdatePassword()
+ {
+ _updatePasswordCompletionSource = new TaskCompletionSource<object>();
+
+ IsChangingPassword = true;
+ ShowLoggingDetails = false;
+ IsLogging = false;
+ InvalidateRelayCommands();
+
+ return _updatePasswordCompletionSource;
+ }
+
+ private async void UpdatePassword()
+ {
+ await Task.Factory.StartNew(() =>
+ {
+ try
+ {
+ if (!Validate())
+ {
+ return;
+ }
+
+ ProgressLog = "Updating your password...";
+ IsChangingPassword = false;
+ IsLogging = true;
+ InvalidateRelayCommands();
+
+ using (var db = ObservablesContext.CreateDefault())
+ {
+ var user = db.Users.SingleOrDefault(x => x.Email == Email);
+ user.PasswordChangeRequired = false;
+ user.Password = User.GetPasswordHash(NewPassword1);
+ db.SaveChanges();
+ }
+
+ _updatePasswordCompletionSource.SetResult(true);
+ }
+ catch (Exception ex)
{
IsLogging = false;
+ IsChangingPassword = false;
+ ShowLoggingDetails = true;
InvalidateRelayCommands();
+ _updatePasswordCompletionSource.SetException(ex);
+ }
+ finally
+ {
+ InvalidateRelayCommands();
+ }
+ });
+ }
+
+ protected override void OnValidating()
+ {
+ if (IsChangingPassword)
+ {
+ if (!NewPassword1.IsBetweenLength(6, 8))
+ {
+ InsertError(nameof(NewPassword1), "Password must be 6 to 8 characters long");
+ }
+
+ if (NewPassword1 != NewPassword2)
+ {
+ InsertError(nameof(NewPassword2), "Passwords do not match");
}
}
+
+ base.OnValidating();
}
}
}