diff --git a/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs b/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs index 3e4c83c..057104c 100644 --- a/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs +++ b/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs @@ -22,7 +22,7 @@ namespace ModernKeePass.Application.Common.Interfaces Task Open(byte[] file, Credentials credentials); Task ReOpen(byte[] file); - Task Create(Credentials credentials, string name, DatabaseVersion version = DatabaseVersion.V2); + Task Create(Credentials credentials, string name, DatabaseVersion version = DatabaseVersion.V3); Task SaveDatabase(); Task SaveDatabase(byte[] newFileContents); void UpdateCredentials(Credentials credentials); diff --git a/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommand.cs b/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommand.cs index 0ddeccb..1a96008 100644 --- a/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommand.cs +++ b/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommand.cs @@ -13,6 +13,7 @@ namespace ModernKeePass.Application.Database.Commands.CreateDatabase public string Password { get; set; } public string KeyFilePath { get; set; } public string Name { get; set; } + public string Version { get; set; } public bool CreateSampleData { get; set; } public class CreateDatabaseCommandHandler : IAsyncRequestHandler @@ -30,12 +31,25 @@ namespace ModernKeePass.Application.Database.Commands.CreateDatabase { if (_database.IsOpen) throw new DatabaseOpenException(); + var version = DatabaseVersion.V2; + switch (message.Version) + { + case "4": + version = DatabaseVersion.V4; + break; + case "3": + version = DatabaseVersion.V3; + break; + } + await _database.Create(new Credentials { KeyFileContents = !string.IsNullOrEmpty(message.KeyFilePath) ? await _file.OpenBinaryFile(message.KeyFilePath) : null, Password = message.Password - }, message.Name); + }, message.Name, version); _database.FileAccessToken = message.FilePath; + var contents = await _database.SaveDatabase(); + await _file.WriteBinaryContentsToFile(_database.FileAccessToken, contents); if (message.CreateSampleData) { diff --git a/ModernKeePass.Domain/AOP/NotifyPropertyChangedBase.cs b/ModernKeePass.Domain/AOP/NotifyPropertyChangedBase.cs deleted file mode 100644 index c9ab235..0000000 --- a/ModernKeePass.Domain/AOP/NotifyPropertyChangedBase.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace ModernKeePass.Domain.AOP -{ - public class NotifyPropertyChangedBase : INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; - - protected void OnPropertyChanged(string propertyName = "") - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - protected bool SetProperty(ref T property, T value, [CallerMemberName] string propertyName = "") - { - if (EqualityComparer.Default.Equals(property, value)) - { - return false; - } - - property = value; - OnPropertyChanged(propertyName); - return true; - } - } -} diff --git a/ModernKeePass.Domain/Domain.csproj b/ModernKeePass.Domain/Domain.csproj index 2b52280..14eff4a 100644 --- a/ModernKeePass.Domain/Domain.csproj +++ b/ModernKeePass.Domain/Domain.csproj @@ -75,7 +75,6 @@ - diff --git a/ModernKeePass.Domain/Enums/DatabaseVersion.cs b/ModernKeePass.Domain/Enums/DatabaseVersion.cs index 591d3f3..b62c103 100644 --- a/ModernKeePass.Domain/Enums/DatabaseVersion.cs +++ b/ModernKeePass.Domain/Enums/DatabaseVersion.cs @@ -3,6 +3,7 @@ public enum DatabaseVersion { V2, + V3, V4 } } \ No newline at end of file diff --git a/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs b/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs index 26e8103..20bd9e2 100644 --- a/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs +++ b/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs @@ -11,6 +11,7 @@ using ModernKeePass.Domain.Enums; using ModernKeePass.Domain.Interfaces; using ModernKeePassLib; using ModernKeePassLib.Collections; +using ModernKeePassLib.Cryptography.Cipher; using ModernKeePassLib.Cryptography.KeyDerivation; using ModernKeePassLib.Interfaces; using ModernKeePassLib.Keys; @@ -112,7 +113,7 @@ namespace ModernKeePass.Infrastructure.KeePass await Open(file, _credentials); } - public async Task Create(Credentials credentials, string name, DatabaseVersion version = DatabaseVersion.V2) + public async Task Create(Credentials credentials, string name, DatabaseVersion version = DatabaseVersion.V4) { try { @@ -131,6 +132,7 @@ namespace ModernKeePass.Infrastructure.KeePass { case DatabaseVersion.V4: _pwDatabase.KdfParameters = KdfPool.Get("Argon2").GetDefaultParameters(); + _pwDatabase.DataCipherUuid = CipherPool.GlobalPool[1].CipherUuid; break; } }); diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs index 4a2d026..64afcb9 100644 --- a/ModernKeePass/App.xaml.cs +++ b/ModernKeePass/App.xaml.cs @@ -116,6 +116,10 @@ namespace ModernKeePass } }); } + else + { + await _dialog.ShowError(realException, realException.Message, "OK", () => {}); + } } /// diff --git a/ModernKeePass/ViewModels/CompositeKeyVm.cs b/ModernKeePass/ViewModels/CompositeKeyVm.cs index 306e9e3..94f165a 100644 --- a/ModernKeePass/ViewModels/CompositeKeyVm.cs +++ b/ModernKeePass/ViewModels/CompositeKeyVm.cs @@ -1,6 +1,7 @@ using System; using System.Text; using System.Threading.Tasks; +using GalaSoft.MvvmLight; using MediatR; using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Common.Interfaces; @@ -10,12 +11,11 @@ using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.OpenDatabase; using ModernKeePass.Application.Security.Commands.GenerateKeyFile; using ModernKeePass.Application.Security.Queries.EstimatePasswordComplexity; -using ModernKeePass.Domain.AOP; using ModernKeePass.Domain.Dtos; namespace ModernKeePass.ViewModels { - public class CompositeKeyVm: NotifyPropertyChangedBase + public class CompositeKeyVm: ObservableObject { public enum StatusTypes { @@ -30,8 +30,8 @@ namespace ModernKeePass.ViewModels get { return _hasPassword; } set { - SetProperty(ref _hasPassword, value); - OnPropertyChanged(nameof(IsValid)); + Set(() => HasPassword, ref _hasPassword, value); + RaisePropertyChanged(nameof(IsValid)); } } @@ -40,8 +40,8 @@ namespace ModernKeePass.ViewModels get { return _hasKeyFile; } set { - SetProperty(ref _hasKeyFile, value); - OnPropertyChanged(nameof(IsValid)); + Set(() => HasKeyFile, ref _hasKeyFile, value); + RaisePropertyChanged(nameof(IsValid)); } } @@ -50,13 +50,13 @@ namespace ModernKeePass.ViewModels public string Status { get { return _status; } - set { SetProperty(ref _status, value); } + set { Set(() => Status, ref _status, value); } } public int StatusType { - get { return (int)_statusType; } - set { SetProperty(ref _statusType, (StatusTypes)value); } + get { return _statusType; } + set { Set(() => StatusType, ref _statusType, value); } } public string Password @@ -65,7 +65,7 @@ namespace ModernKeePass.ViewModels set { _password = value; - OnPropertyChanged(nameof(PasswordComplexityIndicator)); + RaisePropertyChanged(nameof(PasswordComplexityIndicator)); StatusType = (int)StatusTypes.Normal; Status = string.Empty; } @@ -77,14 +77,14 @@ namespace ModernKeePass.ViewModels set { _keyFilePath = value; - OnPropertyChanged(nameof(IsValid)); + RaisePropertyChanged(nameof(IsValid)); } } public string KeyFileText { get { return _keyFileText; } - set { SetProperty(ref _keyFileText, value); } + set { Set(() => KeyFileText, ref _keyFileText, value); } } public string RootGroupId { get; set; } @@ -96,7 +96,7 @@ namespace ModernKeePass.ViewModels private bool _isOpening; private string _password = string.Empty; private string _status; - private StatusTypes _statusType; + private int _statusType; private string _keyFilePath; private string _keyFileText; private readonly IMediator _mediator; @@ -121,7 +121,7 @@ namespace ModernKeePass.ViewModels try { _isOpening = true; - OnPropertyChanged(nameof(IsValid)); + RaisePropertyChanged(nameof(IsValid)); if (createNew) { await _mediator.Send(new CreateDatabaseCommand @@ -159,7 +159,7 @@ namespace ModernKeePass.ViewModels finally { _isOpening = false; - OnPropertyChanged(nameof(IsValid)); + RaisePropertyChanged(nameof(IsValid)); } return false; } diff --git a/ModernKeePass/ViewModels/EntryDetailVm.cs b/ModernKeePass/ViewModels/EntryDetailVm.cs index 45bcf7d..c95e935 100644 --- a/ModernKeePass/ViewModels/EntryDetailVm.cs +++ b/ModernKeePass/ViewModels/EntryDetailVm.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Threading.Tasks; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; +using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Views; using MediatR; using Microsoft.Extensions.DependencyInjection; @@ -27,13 +28,12 @@ using ModernKeePass.Application.Security.Queries.EstimatePasswordComplexity; using ModernKeePass.Domain.Enums; using ModernKeePass.Interfaces; using ModernKeePass.Application.Group.Models; -using ModernKeePass.Domain.AOP; using ModernKeePass.Extensions; using RelayCommand = GalaSoft.MvvmLight.Command.RelayCommand; namespace ModernKeePass.ViewModels { - public class EntryDetailVm : NotifyPropertyChangedBase, IVmEntity + public class EntryDetailVm : ObservableObject, IVmEntity { public bool IsRevealPasswordEnabled => !string.IsNullOrEmpty(Password); public bool HasExpired => HasExpirationDate && ExpiryDate < DateTime.Now; @@ -71,8 +71,8 @@ namespace ModernKeePass.ViewModels get { return _selectedItem; } set { - SetProperty(ref _selectedItem, value); - if (value != null) OnPropertyChanged(); + Set(() => SelectedItem, ref _selectedItem, value); + if (value != null) RaisePropertyChanged(); } } public int SelectedIndex @@ -80,15 +80,15 @@ namespace ModernKeePass.ViewModels get { return _selectedIndex; } set { - SetProperty(ref _selectedIndex, value); - OnPropertyChanged(nameof(IsCurrentEntry)); + Set(() => SelectedIndex, ref _selectedIndex, value); + RaisePropertyChanged(nameof(IsCurrentEntry)); } } public double PasswordLength { get { return _passwordLength; } - set { SetProperty(ref _passwordLength, value); } + set { Set(() => PasswordLength, ref _passwordLength, value); } } public string Title @@ -114,8 +114,8 @@ namespace ModernKeePass.ViewModels { SelectedItem.Password = value; SetFieldValue(nameof(Password), value).Wait(); - OnPropertyChanged(nameof(Password)); - OnPropertyChanged(nameof(PasswordComplexityIndicator)); + RaisePropertyChanged(nameof(Password)); + RaisePropertyChanged(nameof(PasswordComplexityIndicator)); } } @@ -180,7 +180,7 @@ namespace ModernKeePass.ViewModels { SelectedItem.HasExpirationDate = value; SetFieldValue(nameof(HasExpirationDate), value).Wait(); - OnPropertyChanged(nameof(HasExpirationDate)); + RaisePropertyChanged(nameof(HasExpirationDate)); } } @@ -208,13 +208,13 @@ namespace ModernKeePass.ViewModels public bool IsEditMode { get { return IsCurrentEntry && _isEditMode; } - set { SetProperty(ref _isEditMode, value); } + set { Set(() => IsEditMode, ref _isEditMode, value); } } public bool IsRevealPassword { get { return _isRevealPassword; } - set { SetProperty(ref _isRevealPassword, value); } + set { Set(() => IsRevealPassword, ref _isRevealPassword, value); } } public RelayCommand SaveCommand { get; } @@ -332,7 +332,7 @@ namespace ModernKeePass.ViewModels UnderscorePatternSelected = UnderscorePatternSelected, UpperCasePatternSelected = UpperCasePatternSelected }); - OnPropertyChanged(nameof(IsRevealPasswordEnabled)); + RaisePropertyChanged(nameof(IsRevealPasswordEnabled)); } public async Task Move(GroupVm destination) diff --git a/ModernKeePass/ViewModels/GroupDetailVm.cs b/ModernKeePass/ViewModels/GroupDetailVm.cs index 22b3a7e..a706387 100644 --- a/ModernKeePass/ViewModels/GroupDetailVm.cs +++ b/ModernKeePass/ViewModels/GroupDetailVm.cs @@ -5,6 +5,7 @@ using System.Collections.Specialized; using System.Linq; using System.Threading.Tasks; using Windows.UI.Xaml.Controls; +using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Views; using MediatR; using Microsoft.Extensions.DependencyInjection; @@ -27,7 +28,6 @@ using ModernKeePass.Application.Group.Models; using ModernKeePass.Application.Group.Queries.GetGroup; using ModernKeePass.Application.Group.Queries.SearchEntries; using ModernKeePass.Common; -using ModernKeePass.Domain.AOP; using ModernKeePass.Domain.Enums; using ModernKeePass.Interfaces; using ModernKeePass.Models; @@ -35,7 +35,7 @@ using RelayCommand = GalaSoft.MvvmLight.Command.RelayCommand; namespace ModernKeePass.ViewModels { - public class GroupDetailVm : NotifyPropertyChangedBase, IVmEntity + public class GroupDetailVm : ObservableObject, IVmEntity { public ObservableCollection Entries { get; } @@ -75,7 +75,7 @@ namespace ModernKeePass.ViewModels get { return _isEditMode; } set { - SetProperty(ref _isEditMode, value); + Set(() => IsEditMode, ref _isEditMode, value); SortEntriesCommand.RaiseCanExecuteChanged(); SortGroupsCommand.RaiseCanExecuteChanged(); } @@ -234,14 +234,14 @@ namespace ModernKeePass.ViewModels private async Task SortEntriesAsync() { await _mediator.Send(new SortEntriesCommand {Group = _group}); - OnPropertyChanged(nameof(Entries)); + RaisePropertyChanged(nameof(Entries)); SaveCommand.RaiseCanExecuteChanged(); } private async Task SortGroupsAsync() { await _mediator.Send(new SortGroupsCommand {Group = _group}); - OnPropertyChanged(nameof(Groups)); + RaisePropertyChanged(nameof(Groups)); SaveCommand.RaiseCanExecuteChanged(); } } diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs index 2393fdf..4716967 100644 --- a/ModernKeePass/ViewModels/MainVm.cs +++ b/ModernKeePass/ViewModels/MainVm.cs @@ -2,11 +2,11 @@ using System.Linq; using Windows.ApplicationModel; using Windows.UI.Xaml.Controls; +using GalaSoft.MvvmLight; using MediatR; using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Database.Queries.GetDatabase; -using ModernKeePass.Domain.AOP; using ModernKeePass.Domain.Dtos; using ModernKeePass.Domain.Interfaces; using ModernKeePass.Models; @@ -15,17 +15,17 @@ using ModernKeePass.Views; namespace ModernKeePass.ViewModels { - public class MainVm : NotifyPropertyChangedBase, IHasSelectableObject + public class MainVm : ObservableObject, IHasSelectableObject { private IOrderedEnumerable> _mainMenuItems; - private MainMenuItemVm _selectedItem; + private ISelectableModel _selectedItem; public string Name { get; } = Package.Current.DisplayName; public IOrderedEnumerable> MainMenuItems { get { return _mainMenuItems; } - set { SetProperty(ref _mainMenuItems, value); } + set { Set(() => MainMenuItems, ref _mainMenuItems, value); } } public ISelectableModel SelectedItem @@ -39,7 +39,7 @@ namespace ModernKeePass.ViewModels _selectedItem.IsSelected = false; } - SetProperty(ref _selectedItem, (MainMenuItemVm)value); + Set(() => SelectedItem, ref _selectedItem, value); if (_selectedItem != null) { diff --git a/ModernKeePass/ViewModels/NewVm.cs b/ModernKeePass/ViewModels/NewVm.cs deleted file mode 100644 index 4e4253b..0000000 --- a/ModernKeePass/ViewModels/NewVm.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Windows.Storage; -using ModernKeePass.Application.Common.Interfaces; - -namespace ModernKeePass.ViewModels -{ - public class NewVm : OpenVm - { - private string _importFormatHelp; - - public bool IsImportChecked { get; set; } - - public IStorageFile ImportFile { get; set; } - - public string ImportFileExtensionFilter { get; set; } = "*"; - - public IImportFormat ImportFormat { get; set; } - - public string ImportFormatHelp - { - get { return _importFormatHelp; } - set - { - _importFormatHelp = value; - OnPropertyChanged(nameof(ImportFormatHelp)); - } - } - } -} diff --git a/ModernKeePass/ViewModels/SettingsVm.cs b/ModernKeePass/ViewModels/SettingsVm.cs index 998ba59..e9167d7 100644 --- a/ModernKeePass/ViewModels/SettingsVm.cs +++ b/ModernKeePass/ViewModels/SettingsVm.cs @@ -1,27 +1,27 @@ using System.Collections.ObjectModel; using System.Linq; using Windows.UI.Xaml.Controls; +using GalaSoft.MvvmLight; using MediatR; using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Database.Queries.GetDatabase; -using ModernKeePass.Domain.AOP; using ModernKeePass.Domain.Interfaces; using ModernKeePass.ViewModels.ListItems; using ModernKeePass.Views; namespace ModernKeePass.ViewModels { - public class SettingsVm : NotifyPropertyChangedBase, IHasSelectableObject + public class SettingsVm : ObservableObject, IHasSelectableObject { - private ListMenuItemVm _selectedItem; + private ISelectableModel _selectedItem; private IOrderedEnumerable> _menuItems; public IOrderedEnumerable> MenuItems { get { return _menuItems; } - set { SetProperty(ref _menuItems, value); } + set { Set(() => MenuItems, ref _menuItems, value); } } public ISelectableModel SelectedItem @@ -35,7 +35,7 @@ namespace ModernKeePass.ViewModels _selectedItem.IsSelected = false; } - SetProperty(ref _selectedItem, (ListMenuItemVm)value); + Set(() => SelectedItem, ref _selectedItem, value); if (_selectedItem != null) { diff --git a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml index ccb8709..7dfa220 100644 --- a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml @@ -7,29 +7,19 @@ xmlns:converters="using:ModernKeePass.Converters" xmlns:viewModels="using:ModernKeePass.ViewModels" xmlns:userControls="using:ModernKeePass.Views.UserControls" - xmlns:interactivity="using:Microsoft.Xaml.Interactivity" - xmlns:core="using:Microsoft.Xaml.Interactions.Core" mc:Ignorable="d"> + - - - - + - - - - - - - + diff --git a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs index bb49628..89f9399 100644 --- a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs @@ -20,7 +20,7 @@ namespace ModernKeePass.Views public sealed partial class NewDatabasePage { private readonly IResourceProxy _resource; - public NewVm Model => (NewVm)DataContext; + private NewVm Model => (NewVm)Resources["ViewModel"]; public NewDatabasePage(): this(App.Services.GetRequiredService()) { } public NewDatabasePage(IResourceProxy resource) diff --git a/ModernKeePass/Views/SettingsPageFrames/SettingsDatabasePage.xaml b/ModernKeePass/Views/SettingsPageFrames/SettingsDatabasePage.xaml index 1969574..b3db427 100644 --- a/ModernKeePass/Views/SettingsPageFrames/SettingsDatabasePage.xaml +++ b/ModernKeePass/Views/SettingsPageFrames/SettingsDatabasePage.xaml @@ -8,16 +8,18 @@ xmlns:listItems="using:ModernKeePass.ViewModels.ListItems" mc:Ignorable="d"> - - - - + + + + + + diff --git a/ModernKeePass/Views/SettingsPageFrames/SettingsNewDatabasePage.xaml b/ModernKeePass/Views/SettingsPageFrames/SettingsNewDatabasePage.xaml index 6597175..5aaa0a6 100644 --- a/ModernKeePass/Views/SettingsPageFrames/SettingsNewDatabasePage.xaml +++ b/ModernKeePass/Views/SettingsPageFrames/SettingsNewDatabasePage.xaml @@ -7,11 +7,13 @@ xmlns:listItems="using:ModernKeePass.ViewModels.ListItems" mc:Ignorable="d"> - + + + @@ -21,7 +23,7 @@ - +