diff --git a/ModernKeePass/App.xaml b/ModernKeePass/App.xaml
index aca89cf..069b3ad 100644
--- a/ModernKeePass/App.xaml
+++ b/ModernKeePass/App.xaml
@@ -10,6 +10,7 @@
+
diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs
index 0236fc8..06f8fb8 100644
--- a/ModernKeePass/App.xaml.cs
+++ b/ModernKeePass/App.xaml.cs
@@ -11,6 +11,7 @@ using Windows.UI.Xaml.Navigation;
using ModernKeePass.Common;
using ModernKeePass.Exceptions;
using ModernKeePass.Interfaces;
+using ModernKeePass.Services;
// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227
@@ -21,7 +22,7 @@ namespace ModernKeePass
///
sealed partial class App
{
- public DatabaseHelper Database { get; set; } = new DatabaseHelper();
+ public DatabaseService Database { get; set; } = new DatabaseService();
///
/// Initializes the singleton application object. This is the first line of authored code
@@ -48,7 +49,7 @@ namespace ModernKeePass
if (!(realException is SaveException)) return;
unhandledExceptionEventArgs.Handled = true;
- MessageDialogHelper.SaveErrorDialog(realException as SaveException, Database);
+ MessageDialogService.SaveErrorDialog(realException as SaveException, Database);
}
///
diff --git a/ModernKeePass/ModernKeePassApp.csproj b/ModernKeePass/ModernKeePassApp.csproj
index 1c0ce08..d04dbf4 100644
--- a/ModernKeePass/ModernKeePassApp.csproj
+++ b/ModernKeePass/ModernKeePassApp.csproj
@@ -113,14 +113,18 @@
App.xaml
-
-
+
+ DonatePage.xaml
+
+
+
-
+
+
@@ -244,6 +248,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
@@ -299,6 +307,11 @@
MSBuild:Compile
PreserveNewest
+
+ Designer
+ MSBuild:Compile
+ PreserveNewest
+
Designer
MSBuild:Compile
diff --git a/ModernKeePass/Pages/EntryDetailPage.xaml.cs b/ModernKeePass/Pages/EntryDetailPage.xaml.cs
index ba3664e..0456c83 100644
--- a/ModernKeePass/Pages/EntryDetailPage.xaml.cs
+++ b/ModernKeePass/Pages/EntryDetailPage.xaml.cs
@@ -4,6 +4,7 @@ using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using ModernKeePass.Common;
+using ModernKeePass.Services;
using ModernKeePass.ViewModels;
// Pour en savoir plus sur le modèle d'élément Page Détail de l'élément, consultez la page http://go.microsoft.com/fwlink/?LinkId=234232
@@ -76,9 +77,9 @@ namespace ModernKeePass.Pages
? "Are you sure you want to send this entry to the recycle bin?"
: "Are you sure you want to delete this entry?";
var text = isRecycleBinEnabled ? "Item moved to the Recycle bin" : "Item permanently removed";
- MessageDialogHelper.ShowActionDialog("Warning", message, "Delete", "Cancel", a =>
+ MessageDialogService.ShowActionDialog("Warning", message, "Delete", "Cancel", a =>
{
- ToastNotificationHelper.ShowMovedToast(Model, "Deleting", text);
+ ToastNotificationService.ShowMovedToast(Model, "Deleting", text);
Model.MarkForDelete();
if (Frame.CanGoBack) Frame.GoBack();
});
@@ -86,7 +87,7 @@ namespace ModernKeePass.Pages
private void RestoreButton_Click(object sender, RoutedEventArgs e)
{
- ToastNotificationHelper.ShowMovedToast(Model, "Restored", "Item returned to its original group");
+ ToastNotificationService.ShowMovedToast(Model, "Restored", "Item returned to its original group");
if (Frame.CanGoBack) Frame.GoBack();
}
@@ -99,7 +100,7 @@ namespace ModernKeePass.Pages
}
catch (Exception ex)
{
- MessageDialogHelper.ShowErrorDialog(ex);
+ MessageDialogService.ShowErrorDialog(ex);
}
}
}
diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml b/ModernKeePass/Pages/GroupDetailPage.xaml
index 0fdf633..512dfe1 100644
--- a/ModernKeePass/Pages/GroupDetailPage.xaml
+++ b/ModernKeePass/Pages/GroupDetailPage.xaml
@@ -106,7 +106,7 @@
DataContext="{Binding DataContext, ElementName=PageRoot}"
RequestedTheme="Dark"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
- Foreground="{ThemeResource DefaultTextForegroundThemeBrush}">
+ Foreground="{ThemeResource DefaultTextForegroundThemeBrush}" AllowDrop="True" Drop="LeftListView_Drop">
@@ -167,9 +167,12 @@
TabIndex="1"
SelectionChanged="entries_SelectionChanged"
IsSynchronizedWithCurrentItem="False"
- AllowDrop="{Binding IsEditMode}"
- CanReorderItems="{Binding IsEditMode}"
- CanDragItems="{Binding IsEditMode}">
+ BorderBrush="{StaticResource ListViewItemSelectedBackgroundThemeBrush}"
+ AllowDrop="True"
+ CanReorderItems="True"
+ CanDragItems="True"
+ DragItemsStarting="GridView_DragItemsStarting"
+ Drop="GridView_Drop">
@@ -177,22 +180,16 @@
-
+
-
-
-
-
-
-
-
+
+
+
+
+
@@ -260,8 +257,36 @@
OtherItem="{StaticResource GroupOtherItem}" />
-->
- -->
+
@@ -342,5 +367,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml.cs b/ModernKeePass/Pages/GroupDetailPage.xaml.cs
index a3164b2..6137626 100644
--- a/ModernKeePass/Pages/GroupDetailPage.xaml.cs
+++ b/ModernKeePass/Pages/GroupDetailPage.xaml.cs
@@ -6,6 +6,7 @@ using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using ModernKeePass.Common;
using ModernKeePass.Events;
+using ModernKeePass.Services;
using ModernKeePass.ViewModels;
// The Group Detail Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234229
@@ -113,9 +114,9 @@ namespace ModernKeePass.Pages
? "Are you sure you want to send the whole group and all its entries to the recycle bin?"
: "Are you sure you want to delete the whole group and all its entries?";
var text = isRecycleBinEnabled ? "Item moved to the Recycle bin" : "Item permanently removed";
- MessageDialogHelper.ShowActionDialog("Warning", message, "Delete", "Cancel", a =>
+ MessageDialogService.ShowActionDialog("Warning", message, "Delete", "Cancel", a =>
{
- ToastNotificationHelper.ShowMovedToast(Model, "Deleting", text);
+ ToastNotificationService.ShowMovedToast(Model, "Deleting", text);
Model.MarkForDelete();
if (Frame.CanGoBack) Frame.GoBack();
});
@@ -123,7 +124,7 @@ namespace ModernKeePass.Pages
private void RestoreButton_Click(object sender, RoutedEventArgs e)
{
- ToastNotificationHelper.ShowMovedToast(Model, "Restored", "Item returned to its original group");
+ ToastNotificationService.ShowMovedToast(Model, "Restored", "Item returned to its original group");
if (Frame.CanGoBack) Frame.GoBack();
}
@@ -158,5 +159,19 @@ namespace ModernKeePass.Pages
{
Frame.Navigate(typeof(EntryDetailPage), Model.AddNewEntry());
}
+
+ private void GridView_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
+ {
+ e.Cancel = !Model.IsEditMode;
+ }
+
+ private void GridView_Drop(object sender, DragEventArgs e)
+ {
+ }
+
+ private void LeftListView_Drop(object sender, DragEventArgs e)
+ {
+
+ }
}
}
diff --git a/ModernKeePass/Pages/MainPageFrames/DonatePage.xaml b/ModernKeePass/Pages/MainPageFrames/DonatePage.xaml
new file mode 100644
index 0000000..12d92c5
--- /dev/null
+++ b/ModernKeePass/Pages/MainPageFrames/DonatePage.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/ModernKeePass/Pages/MainPageFrames/DonatePage.xaml.cs b/ModernKeePass/Pages/MainPageFrames/DonatePage.xaml.cs
new file mode 100644
index 0000000..b7bad58
--- /dev/null
+++ b/ModernKeePass/Pages/MainPageFrames/DonatePage.xaml.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Data;
+using Windows.UI.Xaml.Input;
+using Windows.UI.Xaml.Media;
+using Windows.UI.Xaml.Navigation;
+
+// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
+
+namespace ModernKeePass.Pages.MainPageFrames
+{
+ ///
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ ///
+ public sealed partial class DonatePage : Page
+ {
+ public DonatePage()
+ {
+ this.InitializeComponent();
+ }
+ }
+}
diff --git a/ModernKeePass/Pages/SettingsPageFrames/SettingsDatabasePage.xaml b/ModernKeePass/Pages/SettingsPageFrames/SettingsDatabasePage.xaml
index 429c2bb..aaa46bd 100644
--- a/ModernKeePass/Pages/SettingsPageFrames/SettingsDatabasePage.xaml
+++ b/ModernKeePass/Pages/SettingsPageFrames/SettingsDatabasePage.xaml
@@ -19,11 +19,11 @@
-
+
-
+
-
+
diff --git a/ModernKeePass/Pages/SettingsPageFrames/SettingsNewDatabasePage.xaml b/ModernKeePass/Pages/SettingsPageFrames/SettingsNewDatabasePage.xaml
index e12f6b3..56d040c 100644
--- a/ModernKeePass/Pages/SettingsPageFrames/SettingsNewDatabasePage.xaml
+++ b/ModernKeePass/Pages/SettingsPageFrames/SettingsNewDatabasePage.xaml
@@ -8,15 +8,15 @@
mc:Ignorable="d">
-
+
-
+
-
-
+
+
diff --git a/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml b/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml
index fc03650..88841a4 100644
--- a/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml
+++ b/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml
@@ -8,7 +8,7 @@
mc:Ignorable="d">
-
+
diff --git a/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml.cs b/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml.cs
index 0a272b0..9c3a570 100644
--- a/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml.cs
+++ b/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml.cs
@@ -2,6 +2,7 @@
using ModernKeePass.Common;
using ModernKeePass.Events;
+using ModernKeePass.Services;
namespace ModernKeePass.Pages
{
@@ -17,7 +18,7 @@ namespace ModernKeePass.Pages
private void CompositeKeyUserControl_OnValidationChecked(object sender, PasswordEventArgs e)
{
- ToastNotificationHelper.ShowGenericToast("Composite key", "Database successfully updated.");
+ ToastNotificationService.ShowGenericToast("Composite key", "Database successfully updated.");
}
}
}
diff --git a/ModernKeePass/Pages/SettingsPageFrames/SettingsWelcomePage.xaml b/ModernKeePass/Pages/SettingsPageFrames/SettingsWelcomePage.xaml
index f46c32f..5b03043 100644
--- a/ModernKeePass/Pages/SettingsPageFrames/SettingsWelcomePage.xaml
+++ b/ModernKeePass/Pages/SettingsPageFrames/SettingsWelcomePage.xaml
@@ -8,7 +8,7 @@
-
-
+
+
diff --git a/ModernKeePass/Common/DatabaseHelper.cs b/ModernKeePass/Services/DatabaseService.cs
similarity index 65%
rename from ModernKeePass/Common/DatabaseHelper.cs
rename to ModernKeePass/Services/DatabaseService.cs
index c708e23..b27ff15 100644
--- a/ModernKeePass/Common/DatabaseHelper.cs
+++ b/ModernKeePass/Services/DatabaseService.cs
@@ -1,18 +1,20 @@
-using System;
+using System;
using Windows.Storage;
using Windows.UI.Xaml.Controls;
using ModernKeePass.Exceptions;
using ModernKeePass.Interfaces;
using ModernKeePass.ViewModels;
using ModernKeePassLib;
+using ModernKeePassLib.Collections;
using ModernKeePassLib.Cryptography.KeyDerivation;
using ModernKeePassLib.Interfaces;
using ModernKeePassLib.Keys;
+using ModernKeePassLib.Security;
using ModernKeePassLib.Serialization;
-namespace ModernKeePass.Common
+namespace ModernKeePass.Services
{
- public class DatabaseHelper: IDatabase
+ public class DatabaseService: IDatabase
{
public enum DatabaseStatus
{
@@ -92,7 +94,20 @@ namespace ModernKeePass.Common
return;
}
var ioConnection = IOConnectionInfo.FromFile(DatabaseFile);
- if (createNew) _pwDatabase.New(ioConnection, key);
+ if (createNew)
+ {
+ _pwDatabase.New(ioConnection, key);
+
+ //Get settings default values
+ if (SettingsService.GetSetting("Sample")) CreateSampleData();
+ var fileFormat = SettingsService.GetSetting("DefaultFileFormat");
+ switch (fileFormat)
+ {
+ case "4":
+ KeyDerivation = KdfPool.Get("Argon2").GetDefaultParameters();
+ break;
+ }
+ }
else _pwDatabase.Open(ioConnection, key, new NullStatusLogger());
if (!_pwDatabase.IsOpen) return;
@@ -174,5 +189,37 @@ namespace ModernKeePass.Common
{
_pwDatabase.MasterKey = key;
}
+
+ private void CreateSampleData()
+ {
+ _pwDatabase.RootGroup.AddGroup(new PwGroup(true, true, "Banking", PwIcon.Count), true);
+ _pwDatabase.RootGroup.AddGroup(new PwGroup(true, true, "Email", PwIcon.EMail), true);
+ _pwDatabase.RootGroup.AddGroup(new PwGroup(true, true, "Internet", PwIcon.World), true);
+
+ var pe = new PwEntry(true, true);
+ pe.Strings.Set(PwDefs.TitleField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectTitle,
+ "Sample Entry"));
+ pe.Strings.Set(PwDefs.UserNameField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectUserName,
+ "Username"));
+ pe.Strings.Set(PwDefs.UrlField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectUrl,
+ PwDefs.HomepageUrl));
+ pe.Strings.Set(PwDefs.PasswordField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectPassword,
+ "Password"));
+ pe.Strings.Set(PwDefs.NotesField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectNotes,
+ "You may safely delete this sample"));
+ _pwDatabase.RootGroup.AddEntry(pe, true);
+
+ pe = new PwEntry(true, true);
+ pe.Strings.Set(PwDefs.TitleField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectTitle,
+ "Sample Entry #2"));
+ pe.Strings.Set(PwDefs.UserNameField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectUserName,
+ "Michael321"));
+ pe.Strings.Set(PwDefs.UrlField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectUrl,
+ PwDefs.HelpUrl + "kb/testform.html"));
+ pe.Strings.Set(PwDefs.PasswordField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectPassword,
+ "12345"));
+ pe.AutoType.Add(new AutoTypeAssociation("*Test Form - KeePass*", string.Empty));
+ _pwDatabase.RootGroup.AddEntry(pe, true);
+ }
}
}
diff --git a/ModernKeePass/Common/MessageDialogHelper.cs b/ModernKeePass/Services/MessageDialogService.cs
similarity index 96%
rename from ModernKeePass/Common/MessageDialogHelper.cs
rename to ModernKeePass/Services/MessageDialogService.cs
index 657d497..5f9619d 100644
--- a/ModernKeePass/Common/MessageDialogHelper.cs
+++ b/ModernKeePass/Services/MessageDialogService.cs
@@ -5,9 +5,9 @@ using Windows.UI.Popups;
using ModernKeePass.Exceptions;
using ModernKeePass.Interfaces;
-namespace ModernKeePass.Common
+namespace ModernKeePass.Services
{
- public static class MessageDialogHelper
+ public static class MessageDialogService
{
public static async void ShowActionDialog(string title, string contentText, string actionButtonText, string cancelButtonText, UICommandInvokedHandler action)
{
diff --git a/ModernKeePass/Services/SettingsService.cs b/ModernKeePass/Services/SettingsService.cs
new file mode 100644
index 0000000..3c6d887
--- /dev/null
+++ b/ModernKeePass/Services/SettingsService.cs
@@ -0,0 +1,28 @@
+using System;
+using Windows.Storage;
+
+namespace ModernKeePass.Services
+{
+ public class SettingsService
+ {
+ public static T GetSetting(string property)
+ {
+ try
+ {
+ return (T)Convert.ChangeType(ApplicationData.Current.LocalSettings.Values[property], typeof(T));
+ }
+ catch (InvalidCastException)
+ {
+ return default(T);
+ }
+ }
+
+ public static void PutSetting(string property, T value)
+ {
+ var localSettings = ApplicationData.Current.LocalSettings;
+ if (localSettings.Values.ContainsKey(property))
+ localSettings.Values[property] = value;
+ else localSettings.Values.Add(property, value);
+ }
+ }
+}
diff --git a/ModernKeePass/Common/ToastNotificationHelper.cs b/ModernKeePass/Services/ToastNotificationService.cs
similarity index 96%
rename from ModernKeePass/Common/ToastNotificationHelper.cs
rename to ModernKeePass/Services/ToastNotificationService.cs
index 8cd25a9..92c07c8 100644
--- a/ModernKeePass/Common/ToastNotificationHelper.cs
+++ b/ModernKeePass/Services/ToastNotificationService.cs
@@ -5,9 +5,9 @@ using Windows.UI.Notifications;
using ModernKeePass.Interfaces;
using ModernKeePass.ViewModels;
-namespace ModernKeePass.Common
+namespace ModernKeePass.Services
{
- public static class ToastNotificationHelper
+ public static class ToastNotificationService
{
public static void ShowMovedToast(IPwEntity entity, string action, string text)
{
diff --git a/ModernKeePass/Strings/en-US/Resources.resw b/ModernKeePass/Strings/en-US/Resources.resw
index f73e323..58c91a0 100644
--- a/ModernKeePass/Strings/en-US/Resources.resw
+++ b/ModernKeePass/Strings/en-US/Resources.resw
@@ -138,6 +138,9 @@
Password
+
+ Like this app? Why not make a small donation to support my work and help this app stay ad-free :) ?
+
Expiration date
@@ -253,7 +256,7 @@
Here, you can change some default options when creating a database.
- Default Key Derivation algorithm
+ File format
Create sample data
diff --git a/ModernKeePass/Styles/TextBlockStyles.xaml b/ModernKeePass/Styles/TextBlockStyles.xaml
new file mode 100644
index 0000000..1e89dc5
--- /dev/null
+++ b/ModernKeePass/Styles/TextBlockStyles.xaml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/ModernKeePass/ViewModels/CompositeKeyVm.cs b/ModernKeePass/ViewModels/CompositeKeyVm.cs
index b61166d..341d941 100644
--- a/ModernKeePass/ViewModels/CompositeKeyVm.cs
+++ b/ModernKeePass/ViewModels/CompositeKeyVm.cs
@@ -5,6 +5,7 @@ using Windows.Storage;
using Windows.UI.Xaml;
using ModernKeePass.Common;
using ModernKeePass.Interfaces;
+using ModernKeePass.Services;
using ModernKeePassLib.Cryptography;
using ModernKeePassLib.Keys;
using ModernKeePassLib.Serialization;
@@ -117,19 +118,19 @@ namespace ModernKeePass.ViewModels
{
error = $"Error: {e.Message}";
}
- switch ((DatabaseHelper.DatabaseStatus)Database.Status)
+ switch ((DatabaseService.DatabaseStatus)Database.Status)
{
- case DatabaseHelper.DatabaseStatus.Opened:
+ case DatabaseService.DatabaseStatus.Opened:
await Task.Run( () => RootGroup = Database.RootGroup);
return true;
- case DatabaseHelper.DatabaseStatus.CompositeKeyError:
+ case DatabaseService.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;
- case DatabaseHelper.DatabaseStatus.Error:
+ case DatabaseService.DatabaseStatus.Error:
UpdateStatus(error, StatusTypes.Error);
break;
}
diff --git a/ModernKeePass/ViewModels/EntryVm.cs b/ModernKeePass/ViewModels/EntryVm.cs
index c7309b1..898c4b5 100644
--- a/ModernKeePass/ViewModels/EntryVm.cs
+++ b/ModernKeePass/ViewModels/EntryVm.cs
@@ -15,17 +15,13 @@ namespace ModernKeePass.ViewModels
public class EntryVm : INotifyPropertyChanged, IPwEntity
{
public GroupVm ParentGroup { get; private set; }
-
public GroupVm PreviousGroup { get; private set; }
-
public System.Drawing.Color? BackgroundColor => _pwEntry?.BackgroundColor;
public System.Drawing.Color? ForegroundColor => _pwEntry?.ForegroundColor;
public bool IsRevealPasswordEnabled => !string.IsNullOrEmpty(Password);
public bool HasExpired => HasExpirationDate && _pwEntry.ExpiryTime < DateTime.Now;
public double PasswordComplexityIndicator => QualityEstimation.EstimatePasswordBits(Password.ToCharArray());
public bool IsFirstItem => _pwEntry == null;
-
-
public bool UpperCasePatternSelected { get; set; } = true;
public bool LowerCasePatternSelected { get; set; } = true;
public bool DigitsPatternSelected { get; set; } = true;
@@ -36,6 +32,7 @@ namespace ModernKeePass.ViewModels
public bool BracketsPatternSelected { get; set; }
public string CustomChars { get; set; } = string.Empty;
public PwUuid IdUuid => _pwEntry?.Uuid;
+ public string Id => _pwEntry?.Uuid.ToHexString();
public double PasswordLength
{
@@ -46,6 +43,7 @@ namespace ModernKeePass.ViewModels
NotifyPropertyChanged("PasswordLength");
}
}
+
public string Name
{
get
@@ -56,7 +54,6 @@ namespace ModernKeePass.ViewModels
set { SetEntryValue(PwDefs.TitleField, value); }
}
- public string Id => _pwEntry?.Uuid.ToHexString();
public string UserName
{
diff --git a/ModernKeePass/ViewModels/GroupVm.cs b/ModernKeePass/ViewModels/GroupVm.cs
index a80dcef..a9c6a06 100644
--- a/ModernKeePass/ViewModels/GroupVm.cs
+++ b/ModernKeePass/ViewModels/GroupVm.cs
@@ -9,6 +9,7 @@ using Windows.UI.Xaml.Controls;
using ModernKeePass.Common;
using ModernKeePass.Interfaces;
using ModernKeePass.Mappings;
+using ModernKeePass.Services;
using ModernKeePassLib;
namespace ModernKeePass.ViewModels
@@ -85,6 +86,7 @@ namespace ModernKeePass.ViewModels
private readonly IDatabase _database;
private bool _isEditMode;
private PwEntry _reorderedEntry;
+ //private int _reorderedEntryIndex;
public GroupVm() {}
@@ -115,7 +117,7 @@ namespace ModernKeePass.ViewModels
_pwGroup.Entries.RemoveAt(oldIndex);
break;
case NotifyCollectionChangedAction.Add:
- if (e.OldStartingIndex == -1) _pwGroup.Entries.Add(((EntryVm)e.NewItems[0]).GetPwEntry());
+ if (_reorderedEntry == null) _pwGroup.AddEntry(((EntryVm) e.NewItems[0]).GetPwEntry(), true);
else _pwGroup.Entries.Insert((uint)e.NewStartingIndex, _reorderedEntry);
break;
}
@@ -184,11 +186,13 @@ namespace ModernKeePass.ViewModels
var comparer = new PwEntryComparer(PwDefs.TitleField, true, true);
try
{
+ // TODO: this throws an exception
_pwGroup.Entries.Sort(comparer);
Entries = new ObservableCollection(Entries.OrderBy(e => e.Name));
}
catch (Exception e)
{
+ MessageDialogService.ShowErrorDialog(e);
}
}
diff --git a/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs b/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs
index 40d8af8..dc57265 100644
--- a/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs
+++ b/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs
@@ -22,7 +22,7 @@ namespace ModernKeePass.ViewModels
set
{
_database.RecycleBinEnabled = value;
- OnPropertyChanged();
+ OnPropertyChanged("HasRecycleBin");
}
}
diff --git a/ModernKeePass/ViewModels/Items/SettingsNewVm.cs b/ModernKeePass/ViewModels/Items/SettingsNewVm.cs
index 8c44868..9ae322d 100644
--- a/ModernKeePass/ViewModels/Items/SettingsNewVm.cs
+++ b/ModernKeePass/ViewModels/Items/SettingsNewVm.cs
@@ -1,47 +1,23 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using Windows.Storage;
-using ModernKeePassLib.Cryptography.KeyDerivation;
+using System.Collections.Generic;
+using ModernKeePass.Services;
namespace ModernKeePass.ViewModels
{
public class SettingsNewVm
{
- private readonly ApplicationDataContainer _localSettings = ApplicationData.Current.LocalSettings;
public bool IsCreateSample
{
- get { return GetSetting("Sample"); }
- set { PutSetting("Sample", value); }
+ get { return SettingsService.GetSetting("Sample"); }
+ set { SettingsService.PutSetting("Sample", value); }
}
- public IEnumerable KeyDerivations => KdfPool.Engines.Select(e => e.Name);
+ public IEnumerable FileFormats => new []{"2", "4"};
- public string KeyDerivationName
+ public string FileFormatVersion
{
- get { return GetSetting("KeyDerivation"); }
- set { PutSetting("KeyDerivation", value); }
- }
-
- // TODO: Move this to a common class
- private T GetSetting(string property)
- {
- try
- {
- return (T)Convert.ChangeType(_localSettings.Values[property], typeof(T));
- }
- catch (InvalidCastException)
- {
- return default(T);
- }
- }
-
- private void PutSetting(string property, T value)
- {
- if (_localSettings.Values.ContainsKey(property))
- _localSettings.Values[property] = value;
- else _localSettings.Values.Add(property, value);
+ get { return SettingsService.GetSetting("DefaultFileFormat"); }
+ set { SettingsService.PutSetting("DefaultFileFormat", value); }
}
}
}
diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs
index 9dc0000..4bcbff0 100644
--- a/ModernKeePass/ViewModels/MainVm.cs
+++ b/ModernKeePass/ViewModels/MainVm.cs
@@ -7,6 +7,7 @@ using Windows.UI.Xaml.Controls;
using ModernKeePass.Common;
using ModernKeePass.Interfaces;
using ModernKeePass.Pages;
+using ModernKeePass.Services;
namespace ModernKeePass.ViewModels
{
@@ -50,14 +51,14 @@ namespace ModernKeePass.ViewModels
public MainVm(Frame referenceFrame, Frame destinationFrame, IDatabase database)
{
var mru = StorageApplicationPermissions.MostRecentlyUsedList;
- var isDatabaseOpen = database != null && database.Status == (int) DatabaseHelper.DatabaseStatus.Opened;
+ var isDatabaseOpen = database != null && database.Status == (int) DatabaseService.DatabaseStatus.Opened;
var mainMenuItems = new ObservableCollection
{
new MainMenuItemVm
{
Title = "Open", PageType = typeof(OpenDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Page2,
- IsSelected = database != null && database.Status == (int) DatabaseHelper.DatabaseStatus.Opening
+ IsSelected = database != null && database.Status == (int) DatabaseService.DatabaseStatus.Opening
},
new MainMenuItemVm
{
@@ -70,7 +71,7 @@ namespace ModernKeePass.ViewModels
},
new MainMenuItemVm {
Title = "Recent" , PageType = typeof(RecentDatabasesPage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Copy,
- IsSelected = (database == null || database.Status == (int) DatabaseHelper.DatabaseStatus.Closed) && mru.Entries.Count > 0, IsEnabled = mru.Entries.Count > 0
+ IsSelected = (database == null || database.Status == (int) DatabaseService.DatabaseStatus.Closed) && mru.Entries.Count > 0, IsEnabled = mru.Entries.Count > 0
},
new MainMenuItemVm
{
@@ -83,7 +84,7 @@ namespace ModernKeePass.ViewModels
};
// Auto-select the Recent Items menu item if the conditions are met
SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
- if (database != null && database.Status == (int) DatabaseHelper.DatabaseStatus.Opened)
+ if (database != null && database.Status == (int) DatabaseService.DatabaseStatus.Opened)
mainMenuItems.Add(new MainMenuItemVm
{
Title = database.Name,
diff --git a/ModernKeePass/ViewModels/OpenVm.cs b/ModernKeePass/ViewModels/OpenVm.cs
index a122b7f..1b6a99c 100644
--- a/ModernKeePass/ViewModels/OpenVm.cs
+++ b/ModernKeePass/ViewModels/OpenVm.cs
@@ -3,12 +3,13 @@ using Windows.Storage.AccessCache;
using Windows.UI.Xaml;
using ModernKeePass.Common;
using ModernKeePass.Interfaces;
+using ModernKeePass.Services;
namespace ModernKeePass.ViewModels
{
public class OpenVm: NotifyPropertyChangedBase
{
- public bool ShowPasswordBox => _database?.Status == (int) DatabaseHelper.DatabaseStatus.Opening;
+ public bool ShowPasswordBox => _database?.Status == (int) DatabaseService.DatabaseStatus.Opening;
public string Name => _database?.Name;
@@ -19,7 +20,7 @@ namespace ModernKeePass.ViewModels
public OpenVm(IDatabase database)
{
_database = database;
- if (database == null || database.Status != (int) DatabaseHelper.DatabaseStatus.Opening) return;
+ if (database == null || database.Status != (int) DatabaseService.DatabaseStatus.Opening) return;
OpenFile(database.DatabaseFile);
}
diff --git a/ModernKeePass/ViewModels/SettingsVm.cs b/ModernKeePass/ViewModels/SettingsVm.cs
index edcc9b1..8bb8a11 100644
--- a/ModernKeePass/ViewModels/SettingsVm.cs
+++ b/ModernKeePass/ViewModels/SettingsVm.cs
@@ -47,7 +47,14 @@ namespace ModernKeePass.ViewModels
{
var menuItems = new ObservableCollection
{
- new ListMenuItemVm { Title = "New", Group = "Application", SymbolIcon = Symbol.Add, PageType = typeof(SettingsNewDatabasePage) }
+ new ListMenuItemVm
+ {
+ Title = "New",
+ Group = "Application",
+ SymbolIcon = Symbol.Add,
+ PageType = typeof(SettingsNewDatabasePage),
+ IsSelected = true
+ }
};
if (database?.Status == 2)
{
@@ -56,8 +63,7 @@ namespace ModernKeePass.ViewModels
Title = "General",
Group = "Database",
SymbolIcon = Symbol.Setting,
- PageType = typeof(SettingsDatabasePage),
- IsSelected = true
+ PageType = typeof(SettingsDatabasePage)
});
menuItems.Add(new ListMenuItemVm
{
diff --git a/ModernKeePassApp.Test/DatabaseTests.cs b/ModernKeePassApp.Test/DatabaseTests.cs
index 83a959d..3dce7ae 100644
--- a/ModernKeePassApp.Test/DatabaseTests.cs
+++ b/ModernKeePassApp.Test/DatabaseTests.cs
@@ -2,7 +2,7 @@
using Windows.ApplicationModel;
using Windows.Storage;
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
-using ModernKeePass.Common;
+using ModernKeePass.Services;
using ModernKeePass.ViewModels;
namespace ModernKeePassApp.Test
@@ -10,25 +10,25 @@ namespace ModernKeePassApp.Test
[TestClass]
public class DatabaseTests
{
- private readonly DatabaseHelper _database = new DatabaseHelper();
+ private readonly DatabaseService _database = new DatabaseService();
[TestMethod]
public void TestCreate()
{
- Assert.AreEqual((int) DatabaseHelper.DatabaseStatus.Closed, _database.Status);
+ Assert.AreEqual((int) DatabaseService.DatabaseStatus.Closed, _database.Status);
_database.DatabaseFile = ApplicationData.Current.TemporaryFolder.CreateFileAsync("NewDatabase.kdbx").GetAwaiter().GetResult();
- Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Opening, _database.Status);
+ Assert.AreEqual((int)DatabaseService.DatabaseStatus.Opening, _database.Status);
OpenOrCreateDatabase(true);
_database.Close();
- Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Closed, _database.Status);
+ Assert.AreEqual((int)DatabaseService.DatabaseStatus.Closed, _database.Status);
}
[TestMethod]
public void TestOpen()
{
- Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Closed, _database.Status);
+ Assert.AreEqual((int)DatabaseService.DatabaseStatus.Closed, _database.Status);
_database.DatabaseFile = Package.Current.InstalledLocation.GetFileAsync(@"Databases\TestDatabase.kdbx").GetAwaiter().GetResult();
- Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Opening, _database.Status);
+ Assert.AreEqual((int)DatabaseService.DatabaseStatus.Opening, _database.Status);
OpenOrCreateDatabase(false);
}
@@ -37,23 +37,23 @@ namespace ModernKeePassApp.Test
{
TestOpen();
_database.Save(ApplicationData.Current.TemporaryFolder.CreateFileAsync("SaveDatabase.kdbx").GetAwaiter().GetResult());
- Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Opened, _database.Status);
+ Assert.AreEqual((int)DatabaseService.DatabaseStatus.Opened, _database.Status);
_database.Close();
- Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Closed, _database.Status);
+ Assert.AreEqual((int)DatabaseService.DatabaseStatus.Closed, _database.Status);
TestOpen();
}
private void OpenOrCreateDatabase(bool createNew)
{
_database.Open(null, createNew);
- Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.NoCompositeKey, _database.Status);
+ Assert.AreEqual((int)DatabaseService.DatabaseStatus.NoCompositeKey, _database.Status);
var compositeKey = new CompositeKeyVm(_database)
{
HasPassword = true,
Password = "test"
};
compositeKey.OpenDatabase(createNew);
- Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Opened, _database.Status);
+ Assert.AreEqual((int)DatabaseService.DatabaseStatus.Opened, _database.Status);
}
}
}