using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.Commands; using Tango.Core.Cryptography; using Tango.MachineStudio.Common; using Tango.MachineStudio.Common.Authentication; using Tango.MachineStudio.Common.EventLogging; using Tango.MachineStudio.Common.Navigation; using Tango.MachineStudio.Common.Notifications; using Tango.Settings; using Tango.SharedUI; namespace Tango.MachineStudio.UI.ViewModels { /// /// Represents the Machine Studio login view, view model. /// /// public class LoginViewVM : ViewModel { private IAuthenticationProvider _authenticationProvider; private INavigationManager _navigationManager; private INotificationProvider _notificationProvider; private IEventLogger _eventLogger; private Rfc2898Cryptographer cryptographer; private MachineStudioSettings _settings; private String _email; /// /// Gets or sets the email. /// [Required(ErrorMessage = "Email is required")] [EmailAddress(ErrorMessage = "Please enter a valid email")] public String Email { get { return _email; } set { _email = value; RaisePropertyChangedAuto(); } } private String _password; [Required(ErrorMessage = "Password is required")] public String Password { get { return _password; } set { _password = value; RaisePropertyChangedAuto(); } } private bool _isLogging; /// /// Gets or sets a value indicating whether this instance is logging. /// public bool IsLogging { get { return _isLogging; } set { _isLogging = value; RaisePropertyChangedAuto(); } } private bool _rememberMe; /// /// Gets or sets a value indicating whether to remember the last user email and password. /// public bool RememberMe { get { return _rememberMe; } set { _rememberMe = value; RaisePropertyChangedAuto(); } } /// /// Gets or sets the login command. /// public RelayCommand LoginCommand { get; set; } /// /// Initializes a new instance of the class. /// /// The authentication provider. /// The navigation manager. /// The notification provider. public LoginViewVM(IAuthenticationProvider authenticationProvider, INavigationManager navigationManager, INotificationProvider notificationProvider, IEventLogger eventLogger) { _settings = SettingsManager.Default.GetOrCreate(); _notificationProvider = notificationProvider; _navigationManager = navigationManager; _authenticationProvider = authenticationProvider; _eventLogger = eventLogger; LoginCommand = new RelayCommand(Login,() => !IsLogging); cryptographer = new Rfc2898Cryptographer(); Email = _settings.LastLoginEmail; RememberMe = _settings.RememberMe; try { Password = cryptographer.Decrypt(_settings.LastLoginPassword); } catch (Exception ex) { LogManager.Log(ex); } } /// /// Logins the requested user. /// private async void Login() { if (Validate()) { try { IsLogging = true; InvalidateRelayCommands(); await Task.Factory.StartNew(() => { _authenticationProvider.Login(Email, Password); _navigationManager.NavigateTo(NavigationView.MainView); _settings.LastLoginEmail = Email; _settings.RememberMe = RememberMe; _settings.LastLoginPassword = RememberMe ? cryptographer.Encrypt(Password) : null; _settings.Save(); _eventLogger.Log("User logged in"); }); } catch (Exception) { _notificationProvider.ShowError("Invalid credentials. Please try again."); } finally { IsLogging = false; InvalidateRelayCommands(); } } } } }