diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs index 07941f2..a44c8cf 100644 --- a/ModernKeePass/App.xaml.cs +++ b/ModernKeePass/App.xaml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Reflection; using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.Data.Json; @@ -29,9 +30,23 @@ namespace ModernKeePass { InitializeComponent(); Suspending += OnSuspending; + UnhandledException += OnUnhandledException; } #region Event Handlers + + private void OnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs) + { + // TODO: catch only save errors for now, rethrow (do not handle) otherwise + var exception = unhandledExceptionEventArgs.Exception; + MessageDialogHelper.ShowErrorDialog( + exception is TargetInvocationException && + exception.InnerException != null + ? exception.InnerException + : exception); + unhandledExceptionEventArgs.Handled = true; + } + /// /// Invoked when the application is launched normally by the end user. Other entry points /// will be used such as when the application is launched to open a specific file. @@ -126,6 +141,7 @@ namespace ModernKeePass private void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); + UnhandledException -= OnUnhandledException; Database.Save(); deferral.Complete(); } @@ -143,6 +159,7 @@ namespace ModernKeePass Window.Current.Content = rootFrame; Window.Current.Activate(); } + #endregion } } diff --git a/ModernKeePass/Common/DatabaseHelper.cs b/ModernKeePass/Common/DatabaseHelper.cs index 668e728..2ac60bc 100644 --- a/ModernKeePass/Common/DatabaseHelper.cs +++ b/ModernKeePass/Common/DatabaseHelper.cs @@ -105,6 +105,7 @@ namespace ModernKeePass.Common catch (Exception ex) { Status = (int)DatabaseStatus.Error; + throw; } } @@ -112,38 +113,20 @@ namespace ModernKeePass.Common /// Save the current database to another file and open it /// /// The new database file - public bool Save(StorageFile file) + public void Save(StorageFile file) { DatabaseFile = file; - try - { - _pwDatabase.SaveAs(IOConnectionInfo.FromFile(DatabaseFile), true, new NullStatusLogger()); - Status = (int)DatabaseStatus.Opened; - return true; - } - catch (Exception ex) - { - return false; - } + _pwDatabase.SaveAs(IOConnectionInfo.FromFile(DatabaseFile), true, new NullStatusLogger()); + Status = (int)DatabaseStatus.Opened; } /// /// Commit the changes to the currently opened database to file /// - public bool Save() + public void Save() { - if (_pwDatabase == null || !_pwDatabase.IsOpen) return false; - try - { - _pwDatabase.Save(new NullStatusLogger()); - return true; - } - catch (Exception ex) - { - return false; - // TODO: put this at a better place (e.g. in views) - MessageDialogHelper.ShowErrorDialog(ex); - } + if (_pwDatabase == null || !_pwDatabase.IsOpen) return; + _pwDatabase.Save(new NullStatusLogger()); } /// diff --git a/ModernKeePass/Common/MessageDialogHelper.cs b/ModernKeePass/Common/MessageDialogHelper.cs index 233bc9c..9027486 100644 --- a/ModernKeePass/Common/MessageDialogHelper.cs +++ b/ModernKeePass/Common/MessageDialogHelper.cs @@ -26,6 +26,7 @@ namespace ModernKeePass.Common public static async void ShowErrorDialog(Exception exception) { + if (exception == null) return; // Create the message dialog and set its content var messageDialog = new MessageDialog(exception.Message, "Error occured"); diff --git a/ModernKeePass/Controls/CompositeKeyUserControl.xaml b/ModernKeePass/Controls/CompositeKeyUserControl.xaml index 0ec71a9..124d848 100644 --- a/ModernKeePass/Controls/CompositeKeyUserControl.xaml +++ b/ModernKeePass/Controls/CompositeKeyUserControl.xaml @@ -48,7 +48,9 @@ Visibility="{Binding ShowComplexityIndicator, ElementName=UserControl, Converter={StaticResource BooleanToVisibilityConverter}}" /> - public sealed partial class NewDatabasePage { - private Frame _mainFrame; - public NewVm Model => (NewVm)DataContext; public NewDatabasePage() @@ -25,12 +20,6 @@ namespace ModernKeePass.Pages InitializeComponent(); } - protected override void OnNavigatedTo(NavigationEventArgs e) - { - base.OnNavigatedTo(e); - _mainFrame = e.Parameter as Frame; - } - private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) { var savePicker = new FileSavePicker diff --git a/ModernKeePass/ViewModels/CompositeKeyVm.cs b/ModernKeePass/ViewModels/CompositeKeyVm.cs index 2a7d91f..23a4479 100644 --- a/ModernKeePass/ViewModels/CompositeKeyVm.cs +++ b/ModernKeePass/ViewModels/CompositeKeyVm.cs @@ -1,4 +1,5 @@ -using System.Text; +using System; +using System.Text; using Windows.Storage; using Windows.UI.Xaml; using ModernKeePass.Common; @@ -105,7 +106,15 @@ namespace ModernKeePass.ViewModels public bool OpenDatabase(bool createNew) { - Database.Open(CreateCompositeKey(), createNew); + var error = string.Empty; + try + { + Database.Open(CreateCompositeKey(), createNew); + } + catch (Exception e) + { + error = $"Error: {e.Message}"; + } switch ((DatabaseHelper.DatabaseStatus)Database.Status) { case DatabaseHelper.DatabaseStatus.Opened: @@ -118,6 +127,9 @@ namespace ModernKeePass.ViewModels if (HasKeyFile) errorMessage.Append("key file"); UpdateStatus(errorMessage.ToString(), StatusTypes.Error); break; + case DatabaseHelper.DatabaseStatus.Error: + UpdateStatus(error, StatusTypes.Error); + break; } return false; } diff --git a/ModernKeePass/ViewModels/SaveVm.cs b/ModernKeePass/ViewModels/SaveVm.cs index 7dd1b48..11dd3be 100644 --- a/ModernKeePass/ViewModels/SaveVm.cs +++ b/ModernKeePass/ViewModels/SaveVm.cs @@ -16,10 +16,11 @@ namespace ModernKeePass.ViewModels public void Save(bool close = true) { - if (close && _database.Save()) _database.Close(); + _database.Save(); + if (close) _database.Close(); } - internal void Save(StorageFile file) + public void Save(StorageFile file) { _database.Save(file); } diff --git a/ModernKeePassApp.Test/DatabaseTests.cs b/ModernKeePassApp.Test/DatabaseTests.cs index d765370..83a959d 100644 --- a/ModernKeePassApp.Test/DatabaseTests.cs +++ b/ModernKeePassApp.Test/DatabaseTests.cs @@ -36,7 +36,8 @@ namespace ModernKeePassApp.Test public void TestSave() { TestOpen(); - Assert.IsTrue(_database.Save(ApplicationData.Current.TemporaryFolder.CreateFileAsync("SaveDatabase.kdbx").GetAwaiter().GetResult())); + _database.Save(ApplicationData.Current.TemporaryFolder.CreateFileAsync("SaveDatabase.kdbx").GetAwaiter().GetResult()); + Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Opened, _database.Status); _database.Close(); Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Closed, _database.Status); TestOpen(); diff --git a/ModernKeePassApp.Test/Mock/DatabaseHelperMock.cs b/ModernKeePassApp.Test/Mock/DatabaseHelperMock.cs index 82604b6..242d300 100644 --- a/ModernKeePassApp.Test/Mock/DatabaseHelperMock.cs +++ b/ModernKeePassApp.Test/Mock/DatabaseHelperMock.cs @@ -48,12 +48,12 @@ namespace ModernKeePassApp.Test.Mock throw new NotImplementedException(); } - public bool Save() + public void Save() { throw new NotImplementedException(); } - public bool Save(StorageFile file) + public void Save(StorageFile file) { throw new NotImplementedException(); }