diff --git a/ModernKeePass/Common/DatabaseHelper.cs b/ModernKeePass/Common/DatabaseHelper.cs
index a65b4d2..9afae3d 100644
--- a/ModernKeePass/Common/DatabaseHelper.cs
+++ b/ModernKeePass/Common/DatabaseHelper.cs
@@ -14,6 +14,9 @@ namespace ModernKeePass.Common
{
public enum DatabaseStatus
{
+ Error = -3,
+ NoCompositeKey = -2,
+ CompositeKeyError = -1,
Closed = 0,
Opening = 1,
Opened = 2
@@ -77,11 +80,11 @@ namespace ModernKeePass.Common
/// The database composite key
/// True to create a new database before opening it
/// An error message, if any
- public string Open(CompositeKey key, bool createNew = false)
+ public void Open(CompositeKey key, bool createNew = false)
{
try
{
- if (key == null) return "No composite key";
+ if (key == null) Status = DatabaseStatus.NoCompositeKey;
var ioConnection = IOConnectionInfo.FromFile(DatabaseFile);
if (createNew) _pwDatabase.New(ioConnection, key);
else _pwDatabase.Open(ioConnection, key, new NullStatusLogger());
@@ -92,19 +95,14 @@ namespace ModernKeePass.Common
RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null);
}
}
- catch (ArgumentNullException)
- {
- return "Password cannot be empty";
- }
catch (InvalidCompositeKeyException)
{
- return "Wrong password";
+ Status = DatabaseStatus.CompositeKeyError;
}
catch (Exception ex)
{
- return ex.Message;
+ Status = DatabaseStatus.Error;
}
- return string.Empty;
}
///
@@ -121,11 +119,19 @@ namespace ModernKeePass.Common
///
/// Commit the changes to the currently opened database to file
///
- public void Save()
+ public bool Save()
{
- // TODO: Save is disabled for now for Argon2Kdf because it corrupts DB (read works)
- if (_pwDatabase == null || !_pwDatabase.IsOpen /*|| KdfPool.Get(KeyDerivation.KdfUuid) is Argon2Kdf*/) return;
- _pwDatabase.Save(new NullStatusLogger());
+ if (_pwDatabase == null || !_pwDatabase.IsOpen) return false;
+ try
+ {
+ _pwDatabase.Save(new NullStatusLogger());
+ return true;
+ }
+ catch (Exception ex)
+ {
+ MessageDialogHelper.ShowErrorDialog(ex);
+ }
+ return false;
}
///
diff --git a/ModernKeePass/Common/MessageDialogHelper.cs b/ModernKeePass/Common/MessageDialogHelper.cs
index 0ad69af..233bc9c 100644
--- a/ModernKeePass/Common/MessageDialogHelper.cs
+++ b/ModernKeePass/Common/MessageDialogHelper.cs
@@ -23,5 +23,17 @@ namespace ModernKeePass.Common
// Show the message dialog
await messageDialog.ShowAsync();
}
+
+ public static async void ShowErrorDialog(Exception exception)
+ {
+ // Create the message dialog and set its content
+ var messageDialog = new MessageDialog(exception.Message, "Error occured");
+
+ // Add commands and set their callbacks; both buttons use the same callback function instead of inline event handlers
+ messageDialog.Commands.Add(new UICommand("OK"));
+
+ // Show the message dialog
+ await messageDialog.ShowAsync();
+ }
}
}
diff --git a/ModernKeePass/Controls/CompositeKeyUserControl.xaml b/ModernKeePass/Controls/CompositeKeyUserControl.xaml
index 5fd5667..ebe555b 100644
--- a/ModernKeePass/Controls/CompositeKeyUserControl.xaml
+++ b/ModernKeePass/Controls/CompositeKeyUserControl.xaml
@@ -47,7 +47,7 @@
Foreground="{Binding PasswordComplexityIndicator, ConverterParameter=128, Converter={StaticResource DoubleToForegroungBrushConverter}}"
Visibility="{Binding ShowComplexityIndicator, ElementName=UserControl, Converter={StaticResource BooleanToVisibilityConverter}}" />
-
+
diff --git a/ModernKeePass/Controls/CompositeKeyUserControl.xaml.cs b/ModernKeePass/Controls/CompositeKeyUserControl.xaml.cs
index 1a4d982..e590698 100644
--- a/ModernKeePass/Controls/CompositeKeyUserControl.xaml.cs
+++ b/ModernKeePass/Controls/CompositeKeyUserControl.xaml.cs
@@ -3,7 +3,6 @@ using Windows.Storage.Pickers;
using Windows.System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Input;
-using ModernKeePass.Common;
using ModernKeePass.Events;
using ModernKeePass.ViewModels;
@@ -56,7 +55,7 @@ namespace ModernKeePass.Controls
ValidationChecking?.Invoke(this, new EventArgs());
if (UpdateKey) Model.UpdateKey();
- else if (Model.OpenDatabase(CreateNew) == DatabaseHelper.DatabaseStatus.Opened)
+ else if (Model.OpenDatabase(CreateNew))
{
ValidationChecked?.Invoke(this, new PasswordEventArgs(Model.RootGroup));
}
@@ -78,7 +77,9 @@ namespace ModernKeePass.Controls
picker.FileTypeFilter.Add(".key");
// Application now has read/write access to the picked file
- Model.KeyFile = await picker.PickSingleFileAsync();
+ var file = await picker.PickSingleFileAsync();
+ if (file == null) return;
+ Model.KeyFile = file;
}
}
}
diff --git a/ModernKeePass/ViewModels/CompositeKeyVm.cs b/ModernKeePass/ViewModels/CompositeKeyVm.cs
index 46944a0..8927b24 100644
--- a/ModernKeePass/ViewModels/CompositeKeyVm.cs
+++ b/ModernKeePass/ViewModels/CompositeKeyVm.cs
@@ -1,4 +1,5 @@
-using Windows.Storage;
+using System.Text;
+using Windows.Storage;
using Windows.UI.Xaml;
using ModernKeePass.Common;
using ModernKeePassLib.Cryptography;
@@ -24,6 +25,7 @@ namespace ModernKeePass.ViewModels
private string _status;
private StatusTypes _statusType;
private StorageFile _keyFile;
+ private string _keyFileText = "Select key file from disk...";
public bool HasPassword
{
@@ -45,7 +47,7 @@ namespace ModernKeePass.ViewModels
}
}
- public bool IsValid => HasPassword || HasKeyFile;
+ public bool IsValid => HasPassword || HasKeyFile && KeyFile != null;
public string Status
{
@@ -76,18 +78,37 @@ namespace ModernKeePass.ViewModels
set
{
_keyFile = value;
- UpdateStatus($"Key file: {value.Name}", StatusTypes.Normal);
+ KeyFileText = value?.Name;
+ OnPropertyChanged("IsValid");
}
}
+ public string KeyFileText
+ {
+ get { return _keyFileText; }
+ set { SetProperty(ref _keyFileText, value); }
+ }
+
public GroupVm RootGroup { get; set; }
public double PasswordComplexityIndicator => QualityEstimation.EstimatePasswordBits(Password?.ToCharArray());
- public DatabaseHelper.DatabaseStatus OpenDatabase(bool createNew)
+ public bool OpenDatabase(bool createNew)
{
- UpdateStatus(_app.Database.Open(CreateCompositeKey(), createNew), StatusTypes.Error);
- RootGroup = _app.Database.RootGroup;
- return _app.Database.Status;
+ _app.Database.Open(CreateCompositeKey(), createNew);
+ switch (_app.Database.Status)
+ {
+ case DatabaseHelper.DatabaseStatus.Opened:
+ RootGroup = _app.Database.RootGroup;
+ return true;
+ case DatabaseHelper.DatabaseStatus.CompositeKeyError:
+ var errorMessage = new StringBuilder("Error: wrong ");
+ if (HasPassword) errorMessage.Append("password");
+ if (HasPassword && HasKeyFile) errorMessage.Append(" or ");
+ if (HasKeyFile) errorMessage.Append("key file");
+ UpdateStatus(errorMessage.ToString(), StatusTypes.Error);
+ break;
+ }
+ return false;
}
public void UpdateKey()
diff --git a/ModernKeePass/ViewModels/SaveVm.cs b/ModernKeePass/ViewModels/SaveVm.cs
index e10863e..26b6502 100644
--- a/ModernKeePass/ViewModels/SaveVm.cs
+++ b/ModernKeePass/ViewModels/SaveVm.cs
@@ -8,9 +8,7 @@ namespace ModernKeePass.ViewModels
public void Save(bool close = true)
{
var app = (App)Application.Current;
- app.Database.Save();
- if (!close) return;
- app.Database.Close();
+ if (close && app.Database.Save()) app.Database.Close();
}
internal void Save(StorageFile file)