mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-03 23:50:18 -04:00
Changed most services to singletons
Refactor the Database Service (no more enum, ...) Restored the Donate page with Paypal web page Added (but not working) MS App Center integration Corrected tests accordingly WIP AOP to detect database changes
This commit is contained in:
14
ModernKeePass/Aop/DatabaseChanged.cs
Normal file
14
ModernKeePass/Aop/DatabaseChanged.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Attributes
|
||||||
|
{
|
||||||
|
[AttributeUsage(AttributeTargets.All)]
|
||||||
|
public class DatabaseChangedAttribute: Attribute
|
||||||
|
{
|
||||||
|
public DatabaseChangedAttribute()
|
||||||
|
{
|
||||||
|
DatabaseService.Instance.HasChanged = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
ModernKeePass/Aop/DatabaseChangedProxy.cs
Normal file
26
ModernKeePass/Aop/DatabaseChangedProxy.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Aop
|
||||||
|
{
|
||||||
|
public class DatabaseChangedProxy<T>: IProxyInvocationHandler
|
||||||
|
{
|
||||||
|
private readonly T _decorated;
|
||||||
|
private readonly IDatabaseService _databaseService;
|
||||||
|
|
||||||
|
public DatabaseChangedProxy(T decorated, IDatabaseService databaseService)
|
||||||
|
{
|
||||||
|
_decorated = decorated;
|
||||||
|
_databaseService = databaseService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object Invoke(object proxy, MethodInfo method, object[] parameters)
|
||||||
|
{
|
||||||
|
object retVal = null;
|
||||||
|
retVal = method.Invoke(proxy, parameters);
|
||||||
|
_databaseService.HasChanged = true;
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -6,6 +6,9 @@ using Windows.Storage;
|
|||||||
using Windows.UI.Xaml;
|
using Windows.UI.Xaml;
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
using Windows.UI.Xaml.Navigation;
|
using Windows.UI.Xaml.Navigation;
|
||||||
|
using Microsoft.AppCenter;
|
||||||
|
using Microsoft.AppCenter.Analytics;
|
||||||
|
using Microsoft.AppCenter.Push;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Exceptions;
|
using ModernKeePass.Exceptions;
|
||||||
using ModernKeePass.Services;
|
using ModernKeePass.Services;
|
||||||
@@ -20,18 +23,16 @@ namespace ModernKeePass
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
sealed partial class App
|
sealed partial class App
|
||||||
{
|
{
|
||||||
public DatabaseService Database { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes the singleton application object. This is the first line of authored code
|
/// Initializes the singleton application object. This is the first line of authored code
|
||||||
/// executed, and as such is the logical equivalent of main() or WinMain().
|
/// executed, and as such is the logical equivalent of main() or WinMain().
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public App()
|
public App()
|
||||||
{
|
{
|
||||||
|
AppCenter.Start("79d23520-a486-4f63-af81-8d90bf4e1bea", typeof(Analytics), typeof(Push));
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Suspending += OnSuspending;
|
Suspending += OnSuspending;
|
||||||
UnhandledException += OnUnhandledException;
|
UnhandledException += OnUnhandledException;
|
||||||
Database = new DatabaseService();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Event Handlers
|
#region Event Handlers
|
||||||
@@ -49,12 +50,12 @@ namespace ModernKeePass
|
|||||||
if (realException is SaveException)
|
if (realException is SaveException)
|
||||||
{
|
{
|
||||||
unhandledExceptionEventArgs.Handled = true;
|
unhandledExceptionEventArgs.Handled = true;
|
||||||
MessageDialogHelper.SaveErrorDialog(realException as SaveException, Database);
|
MessageDialogHelper.SaveErrorDialog(realException as SaveException, DatabaseService.Instance);
|
||||||
}
|
}
|
||||||
else if (realException is DatabaseOpenedException)
|
else if (realException is DatabaseOpenedException)
|
||||||
{
|
{
|
||||||
unhandledExceptionEventArgs.Handled = true;
|
unhandledExceptionEventArgs.Handled = true;
|
||||||
MessageDialogHelper.SaveUnchangedDialog(realException as DatabaseOpenedException, Database);
|
MessageDialogHelper.SaveUnchangedDialog(realException as DatabaseOpenedException, DatabaseService.Instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,8 +154,9 @@ namespace ModernKeePass
|
|||||||
{
|
{
|
||||||
var deferral = e.SuspendingOperation.GetDeferral();
|
var deferral = e.SuspendingOperation.GetDeferral();
|
||||||
UnhandledException -= OnUnhandledException;
|
UnhandledException -= OnUnhandledException;
|
||||||
Database.Save();
|
var database = DatabaseService.Instance;
|
||||||
await Database.Close();
|
database.Save();
|
||||||
|
await database.Close();
|
||||||
deferral.Complete();
|
deferral.Complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +168,7 @@ namespace ModernKeePass
|
|||||||
{
|
{
|
||||||
base.OnFileActivated(args);
|
base.OnFileActivated(args);
|
||||||
var rootFrame = new Frame();
|
var rootFrame = new Frame();
|
||||||
Database.DatabaseFile = args.Files[0] as StorageFile;
|
DatabaseService.Instance.DatabaseFile = args.Files[0] as StorageFile;
|
||||||
rootFrame.Navigate(typeof(MainPage), args);
|
rootFrame.Navigate(typeof(MainPage), args);
|
||||||
Window.Current.Content = rootFrame;
|
Window.Current.Content = rootFrame;
|
||||||
Window.Current.Activate();
|
Window.Current.Activate();
|
||||||
|
@@ -22,7 +22,7 @@ namespace ModernKeePass.Common
|
|||||||
await messageDialog.ShowAsync();
|
await messageDialog.ShowAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SaveErrorDialog(SaveException exception, IDatabase database)
|
public static void SaveErrorDialog(SaveException exception, IDatabaseService database)
|
||||||
{
|
{
|
||||||
ShowActionDialog("Save error", exception.InnerException.Message, "Save as", "Discard", async command =>
|
ShowActionDialog("Save error", exception.InnerException.Message, "Save as", "Discard", async command =>
|
||||||
{
|
{
|
||||||
@@ -38,7 +38,7 @@ namespace ModernKeePass.Common
|
|||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SaveUnchangedDialog(DatabaseOpenedException exception, IDatabase database)
|
public static void SaveUnchangedDialog(DatabaseOpenedException exception, IDatabaseService database)
|
||||||
{
|
{
|
||||||
ShowActionDialog("Opened database", $"Database {database.Name} is currently opened. What to you wish to do?", "Save changes", "Discard", command =>
|
ShowActionDialog("Opened database", $"Database {database.Name} is currently opened. What to you wish to do?", "Save changes", "Discard", command =>
|
||||||
{
|
{
|
||||||
|
@@ -7,7 +7,7 @@ using ModernKeePassLib.Keys;
|
|||||||
|
|
||||||
namespace ModernKeePass.Interfaces
|
namespace ModernKeePass.Interfaces
|
||||||
{
|
{
|
||||||
public interface IDatabase
|
public interface IDatabaseService
|
||||||
{
|
{
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
bool RecycleBinEnabled { get; set; }
|
bool RecycleBinEnabled { get; set; }
|
||||||
@@ -21,6 +21,7 @@ namespace ModernKeePass.Interfaces
|
|||||||
bool IsOpen { get; }
|
bool IsOpen { get; }
|
||||||
bool IsFileOpen { get; }
|
bool IsFileOpen { get; }
|
||||||
bool IsClosed { get; }
|
bool IsClosed { get; }
|
||||||
|
bool HasChanged { get; set; }
|
||||||
|
|
||||||
Task Open(CompositeKey key, bool createNew);
|
Task Open(CompositeKey key, bool createNew);
|
||||||
void UpdateCompositeKey(CompositeKey key);
|
void UpdateCompositeKey(CompositeKey key);
|
9
ModernKeePass/Interfaces/IProxyInvocationHandler.cs
Normal file
9
ModernKeePass/Interfaces/IProxyInvocationHandler.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Interfaces
|
||||||
|
{
|
||||||
|
public interface IProxyInvocationHandler
|
||||||
|
{
|
||||||
|
object Invoke(object proxy, MethodInfo method, object[] parameters);
|
||||||
|
}
|
||||||
|
}
|
@@ -4,7 +4,7 @@ using Windows.Storage;
|
|||||||
|
|
||||||
namespace ModernKeePass.Interfaces
|
namespace ModernKeePass.Interfaces
|
||||||
{
|
{
|
||||||
public interface IRecent
|
public interface IRecentService
|
||||||
{
|
{
|
||||||
int EntryCount { get; }
|
int EntryCount { get; }
|
||||||
Task<IStorageItem> GetFileAsync(string token);
|
Task<IStorageItem> GetFileAsync(string token);
|
@@ -1,6 +1,6 @@
|
|||||||
namespace ModernKeePass.Interfaces
|
namespace ModernKeePass.Interfaces
|
||||||
{
|
{
|
||||||
public interface IResource
|
public interface IResourceService
|
||||||
{
|
{
|
||||||
string GetResourceValue(string key);
|
string GetResourceValue(string key);
|
||||||
}
|
}
|
@@ -1,6 +1,6 @@
|
|||||||
namespace ModernKeePass.Interfaces
|
namespace ModernKeePass.Interfaces
|
||||||
{
|
{
|
||||||
public interface ISettings
|
public interface ISettingsService
|
||||||
{
|
{
|
||||||
T GetSetting<T>(string property);
|
T GetSetting<T>(string property);
|
||||||
void PutSetting<T>(string property, T value);
|
void PutSetting<T>(string property, T value);
|
@@ -111,21 +111,24 @@
|
|||||||
<Compile Include="Actions\ClipboardAction.cs" />
|
<Compile Include="Actions\ClipboardAction.cs" />
|
||||||
<Compile Include="Actions\NavigateToUrlAction.cs" />
|
<Compile Include="Actions\NavigateToUrlAction.cs" />
|
||||||
<Compile Include="Actions\SetupFocusAction.cs" />
|
<Compile Include="Actions\SetupFocusAction.cs" />
|
||||||
|
<Compile Include="Aop\DatabaseChangedProxy.cs" />
|
||||||
<Compile Include="App.xaml.cs">
|
<Compile Include="App.xaml.cs">
|
||||||
<DependentUpon>App.xaml</DependentUpon>
|
<DependentUpon>App.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Aop\DatabaseChanged.cs" />
|
||||||
<Compile Include="Exceptions\DatabaseOpenedException.cs" />
|
<Compile Include="Exceptions\DatabaseOpenedException.cs" />
|
||||||
<Compile Include="Interfaces\ILicenseService.cs" />
|
<Compile Include="Interfaces\ILicenseService.cs" />
|
||||||
<Compile Include="Interfaces\IRecent.cs" />
|
<Compile Include="Interfaces\IProxyInvocationHandler.cs" />
|
||||||
|
<Compile Include="Interfaces\IRecentService.cs" />
|
||||||
<Compile Include="Interfaces\IRecentItem.cs" />
|
<Compile Include="Interfaces\IRecentItem.cs" />
|
||||||
<Compile Include="Interfaces\IResource.cs" />
|
<Compile Include="Interfaces\IResourceService.cs" />
|
||||||
|
<Compile Include="Services\SingletonServiceBase.cs" />
|
||||||
<Compile Include="TemplateSelectors\SelectableDataTemplateSelector.cs" />
|
<Compile Include="TemplateSelectors\SelectableDataTemplateSelector.cs" />
|
||||||
<Compile Include="ViewModels\DonateVm.cs" />
|
|
||||||
<Compile Include="Views\MainPageFrames\DonatePage.xaml.cs">
|
<Compile Include="Views\MainPageFrames\DonatePage.xaml.cs">
|
||||||
<DependentUpon>DonatePage.xaml</DependentUpon>
|
<DependentUpon>DonatePage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Services\DatabaseService.cs" />
|
<Compile Include="Services\DatabaseService.cs" />
|
||||||
<Compile Include="Interfaces\ISettings.cs" />
|
<Compile Include="Interfaces\ISettingsService.cs" />
|
||||||
<Compile Include="Common\MessageDialogHelper.cs" />
|
<Compile Include="Common\MessageDialogHelper.cs" />
|
||||||
<Compile Include="Common\NavigationHelper.cs" />
|
<Compile Include="Common\NavigationHelper.cs" />
|
||||||
<Compile Include="Common\NotifyPropertyChangedBase.cs" />
|
<Compile Include="Common\NotifyPropertyChangedBase.cs" />
|
||||||
@@ -142,7 +145,7 @@
|
|||||||
<Compile Include="Converters\NullToBooleanConverter.cs" />
|
<Compile Include="Converters\NullToBooleanConverter.cs" />
|
||||||
<Compile Include="Exceptions\SaveException.cs" />
|
<Compile Include="Exceptions\SaveException.cs" />
|
||||||
<Compile Include="Extensions\DispatcherTaskExtensions.cs" />
|
<Compile Include="Extensions\DispatcherTaskExtensions.cs" />
|
||||||
<Compile Include="Interfaces\IDatabase.cs" />
|
<Compile Include="Interfaces\IDatabaseService.cs" />
|
||||||
<Compile Include="Interfaces\IHasSelectableObject.cs" />
|
<Compile Include="Interfaces\IHasSelectableObject.cs" />
|
||||||
<Compile Include="Interfaces\ISelectableModel.cs" />
|
<Compile Include="Interfaces\ISelectableModel.cs" />
|
||||||
<Compile Include="Views\BasePages\LayoutAwarePageBase.cs" />
|
<Compile Include="Views\BasePages\LayoutAwarePageBase.cs" />
|
||||||
@@ -337,6 +340,18 @@
|
|||||||
<HintPath>..\packages\Portable.BouncyCastle.1.8.1.3\lib\netstandard1.0\BouncyCastle.Crypto.dll</HintPath>
|
<HintPath>..\packages\Portable.BouncyCastle.1.8.1.3\lib\netstandard1.0\BouncyCastle.Crypto.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AppCenter, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.AppCenter.1.4.0\lib\portable-net45+win8+wpa81+wp8\Microsoft.AppCenter.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AppCenter.Analytics, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.AppCenter.Analytics.1.4.0\lib\portable-net45+win8+wpa81+wp8\Microsoft.AppCenter.Analytics.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AppCenter.Push, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.AppCenter.Push.1.4.0\lib\portable-net45+win8+wpa81+wp8\Microsoft.AppCenter.Push.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Microsoft.Toolkit.Uwp.Notifications, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.Toolkit.Uwp.Notifications, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Microsoft.Toolkit.Uwp.Notifications.2.0.0\lib\dotnet\Microsoft.Toolkit.Uwp.Notifications.dll</HintPath>
|
<HintPath>..\packages\Microsoft.Toolkit.Uwp.Notifications.2.0.0\lib\dotnet\Microsoft.Toolkit.Uwp.Notifications.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
|
@@ -15,10 +15,10 @@ using ModernKeePassLib.Serialization;
|
|||||||
|
|
||||||
namespace ModernKeePass.Services
|
namespace ModernKeePass.Services
|
||||||
{
|
{
|
||||||
public class DatabaseService: IDatabase
|
public class DatabaseService: SingletonServiceBase<DatabaseService>, IDatabaseService
|
||||||
{
|
{
|
||||||
private readonly PwDatabase _pwDatabase = new PwDatabase();
|
private readonly PwDatabase _pwDatabase = new PwDatabase();
|
||||||
private readonly ISettings _settings;
|
private readonly ISettingsService _settings;
|
||||||
private StorageFile _realDatabaseFile;
|
private StorageFile _realDatabaseFile;
|
||||||
private StorageFile _databaseFile;
|
private StorageFile _databaseFile;
|
||||||
private GroupVm _recycleBin;
|
private GroupVm _recycleBin;
|
||||||
@@ -48,7 +48,7 @@ namespace ModernKeePass.Services
|
|||||||
get { return _databaseFile; }
|
get { return _databaseFile; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (IsOpen)
|
if (IsOpen && HasChanged)
|
||||||
{
|
{
|
||||||
throw new DatabaseOpenedException();
|
throw new DatabaseOpenedException();
|
||||||
}
|
}
|
||||||
@@ -77,15 +77,18 @@ namespace ModernKeePass.Services
|
|||||||
public bool IsOpen => _pwDatabase.IsOpen;
|
public bool IsOpen => _pwDatabase.IsOpen;
|
||||||
public bool IsFileOpen => !_pwDatabase.IsOpen && _databaseFile != null;
|
public bool IsFileOpen => !_pwDatabase.IsOpen && _databaseFile != null;
|
||||||
public bool IsClosed => _databaseFile == null;
|
public bool IsClosed => _databaseFile == null;
|
||||||
|
public bool HasChanged { get; set; }
|
||||||
|
|
||||||
public DatabaseService() : this(new SettingsService())
|
public DatabaseService() : this(SettingsService.Instance)
|
||||||
{ }
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public DatabaseService(ISettings settings)
|
public DatabaseService(ISettingsService settings)
|
||||||
{
|
{
|
||||||
_settings = settings;
|
_settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Open a KeePass database
|
/// Open a KeePass database
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -118,7 +121,7 @@ namespace ModernKeePass.Services
|
|||||||
}
|
}
|
||||||
else _pwDatabase.Open(ioConnection, key, new NullStatusLogger());
|
else _pwDatabase.Open(ioConnection, key, new NullStatusLogger());
|
||||||
|
|
||||||
if (!_pwDatabase.IsOpen) return;
|
//if (!_pwDatabase.IsOpen) return;
|
||||||
|
|
||||||
// Copy database in temp directory and use this file for operations
|
// Copy database in temp directory and use this file for operations
|
||||||
if (_settings.GetSetting<bool>("AntiCorruption"))
|
if (_settings.GetSetting<bool>("AntiCorruption"))
|
||||||
|
@@ -6,7 +6,7 @@ using ModernKeePass.Interfaces;
|
|||||||
|
|
||||||
namespace ModernKeePass.Services
|
namespace ModernKeePass.Services
|
||||||
{
|
{
|
||||||
public class LicenseService : ILicenseService
|
public class LicenseService : SingletonServiceBase<LicenseService>, ILicenseService
|
||||||
{
|
{
|
||||||
public enum PurchaseResult
|
public enum PurchaseResult
|
||||||
{
|
{
|
||||||
|
@@ -8,7 +8,7 @@ using ModernKeePass.ViewModels;
|
|||||||
|
|
||||||
namespace ModernKeePass.Services
|
namespace ModernKeePass.Services
|
||||||
{
|
{
|
||||||
public class RecentService : IRecent
|
public class RecentService : SingletonServiceBase<RecentService>, IRecentService
|
||||||
{
|
{
|
||||||
private readonly StorageItemMostRecentlyUsedList _mru = StorageApplicationPermissions.MostRecentlyUsedList;
|
private readonly StorageItemMostRecentlyUsedList _mru = StorageApplicationPermissions.MostRecentlyUsedList;
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ using ModernKeePass.Interfaces;
|
|||||||
|
|
||||||
namespace ModernKeePass.Services
|
namespace ModernKeePass.Services
|
||||||
{
|
{
|
||||||
public class ResourcesService: IResource
|
public class ResourcesService: IResourceService
|
||||||
{
|
{
|
||||||
private const string ResourceFileName = "CodeBehind";
|
private const string ResourceFileName = "CodeBehind";
|
||||||
private readonly ResourceLoader _resourceLoader = ResourceLoader.GetForCurrentView();
|
private readonly ResourceLoader _resourceLoader = ResourceLoader.GetForCurrentView();
|
||||||
|
@@ -5,7 +5,7 @@ using ModernKeePass.Interfaces;
|
|||||||
|
|
||||||
namespace ModernKeePass.Services
|
namespace ModernKeePass.Services
|
||||||
{
|
{
|
||||||
public class SettingsService : ISettings
|
public class SettingsService : SingletonServiceBase<SettingsService>, ISettingsService
|
||||||
{
|
{
|
||||||
private readonly IPropertySet _values = ApplicationData.Current.LocalSettings.Values;
|
private readonly IPropertySet _values = ApplicationData.Current.LocalSettings.Values;
|
||||||
|
|
||||||
|
12
ModernKeePass/Services/SingletonServiceBase.cs
Normal file
12
ModernKeePass/Services/SingletonServiceBase.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Services
|
||||||
|
{
|
||||||
|
public abstract class SingletonServiceBase<T> where T : new()
|
||||||
|
{
|
||||||
|
private static readonly Lazy<T> LazyInstance =
|
||||||
|
new Lazy<T>(() => new T());
|
||||||
|
|
||||||
|
public static T Instance => LazyInstance.Value;
|
||||||
|
}
|
||||||
|
}
|
@@ -22,7 +22,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
Success = 5
|
Success = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
public IDatabase Database { get; set; }
|
public IDatabaseService Database { get; set; }
|
||||||
|
|
||||||
public bool HasPassword
|
public bool HasPassword
|
||||||
{
|
{
|
||||||
@@ -111,11 +111,11 @@ namespace ModernKeePass.ViewModels
|
|||||||
private StatusTypes _statusType;
|
private StatusTypes _statusType;
|
||||||
private StorageFile _keyFile;
|
private StorageFile _keyFile;
|
||||||
private string _keyFileText;
|
private string _keyFileText;
|
||||||
private readonly IResource _resource;
|
private readonly IResourceService _resource;
|
||||||
|
|
||||||
public CompositeKeyVm() : this((Application.Current as App)?.Database, new ResourcesService()) { }
|
public CompositeKeyVm() : this(DatabaseService.Instance, new ResourcesService()) { }
|
||||||
|
|
||||||
public CompositeKeyVm(IDatabase database, IResource resource)
|
public CompositeKeyVm(IDatabaseService database, IResourceService resource)
|
||||||
{
|
{
|
||||||
_resource = resource;
|
_resource = resource;
|
||||||
_keyFileText = _resource.GetResourceValue("CompositeKeyDefaultKeyFile");
|
_keyFileText = _resource.GetResourceValue("CompositeKeyDefaultKeyFile");
|
||||||
|
@@ -1,44 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Windows.ApplicationModel.Store;
|
|
||||||
using ModernKeePass.Common;
|
|
||||||
using ModernKeePass.Interfaces;
|
|
||||||
using ModernKeePass.Services;
|
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
|
||||||
{
|
|
||||||
public class DonateVm: NotifyPropertyChangedBase
|
|
||||||
{
|
|
||||||
public ObservableCollection<ProductListing> Donations { get; }
|
|
||||||
|
|
||||||
public ProductListing SelectedItem
|
|
||||||
{
|
|
||||||
get { return _selectedItem; }
|
|
||||||
set { SetProperty(ref _selectedItem, value); }
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly ILicenseService _license;
|
|
||||||
private ProductListing _selectedItem;
|
|
||||||
|
|
||||||
public DonateVm() : this (new LicenseService()) { }
|
|
||||||
|
|
||||||
public DonateVm(ILicenseService license)
|
|
||||||
{
|
|
||||||
// TODO: find a nice way to order products
|
|
||||||
_license = license;
|
|
||||||
Donations = new ObservableCollection<ProductListing>(
|
|
||||||
_license.Products.Values
|
|
||||||
/*.OrderBy(p => decimal.Parse(p.FormattedPrice.Replace('\u00A0', ' '), NumberStyles.Currency,
|
|
||||||
CultureInfo.CurrentCulture.NumberFormat))*/
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<int> Purchase()
|
|
||||||
{
|
|
||||||
return await _license.Purchase(SelectedItem.ProductId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,10 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using ModernKeePass.Attributes;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Mappings;
|
using ModernKeePass.Mappings;
|
||||||
|
using ModernKeePass.Services;
|
||||||
using ModernKeePassLib;
|
using ModernKeePassLib;
|
||||||
using ModernKeePassLib.Cryptography.PasswordGenerator;
|
using ModernKeePassLib.Cryptography.PasswordGenerator;
|
||||||
using ModernKeePassLib.Security;
|
using ModernKeePassLib.Security;
|
||||||
@@ -67,6 +68,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
NotifyPropertyChanged("PasswordComplexityIndicator");
|
NotifyPropertyChanged("PasswordComplexityIndicator");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Url
|
public string Url
|
||||||
{
|
{
|
||||||
get { return GetEntryValue(PwDefs.UrlField); }
|
get { return GetEntryValue(PwDefs.UrlField); }
|
||||||
@@ -155,7 +157,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
|
||||||
private readonly PwEntry _pwEntry;
|
private readonly PwEntry _pwEntry;
|
||||||
private readonly IDatabase _database;
|
private readonly IDatabaseService _database;
|
||||||
private bool _isEditMode;
|
private bool _isEditMode;
|
||||||
private bool _isRevealPassword;
|
private bool _isRevealPassword;
|
||||||
private double _passwordLength = 25;
|
private double _passwordLength = 25;
|
||||||
@@ -168,9 +170,9 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public EntryVm() { }
|
public EntryVm() { }
|
||||||
|
|
||||||
internal EntryVm(PwEntry entry, GroupVm parent) : this(entry, parent, (Application.Current as App)?.Database) { }
|
internal EntryVm(PwEntry entry, GroupVm parent) : this(entry, parent, DatabaseService.Instance) { }
|
||||||
|
|
||||||
public EntryVm(PwEntry entry, GroupVm parent, IDatabase database)
|
public EntryVm(PwEntry entry, GroupVm parent, IDatabaseService database)
|
||||||
{
|
{
|
||||||
_database = database;
|
_database = database;
|
||||||
_pwEntry = entry;
|
_pwEntry = entry;
|
||||||
@@ -211,6 +213,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
return _pwEntry?.Strings.GetSafe(key).ReadString();
|
return _pwEntry?.Strings.GetSafe(key).ReadString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[DatabaseChanged]
|
||||||
private void SetEntryValue(string key, string newValue)
|
private void SetEntryValue(string key, string newValue)
|
||||||
{
|
{
|
||||||
_pwEntry?.Strings.Set(key, new ProtectedString(true, newValue));
|
_pwEntry?.Strings.Set(key, new ProtectedString(true, newValue));
|
||||||
|
@@ -3,11 +3,12 @@ using System.Collections.ObjectModel;
|
|||||||
using System.Collections.Specialized;
|
using System.Collections.Specialized;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using ModernKeePass.Attributes;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Mappings;
|
using ModernKeePass.Mappings;
|
||||||
|
using ModernKeePass.Services;
|
||||||
using ModernKeePassLib;
|
using ModernKeePassLib;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
@@ -54,6 +55,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
public string Name
|
public string Name
|
||||||
{
|
{
|
||||||
get { return _pwGroup == null ? string.Empty : _pwGroup.Name; }
|
get { return _pwGroup == null ? string.Empty : _pwGroup.Name; }
|
||||||
|
[DatabaseChanged]
|
||||||
set { _pwGroup.Name = value; }
|
set { _pwGroup.Name = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +94,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly PwGroup _pwGroup;
|
private readonly PwGroup _pwGroup;
|
||||||
private readonly IDatabase _database;
|
private readonly IDatabaseService _database;
|
||||||
private bool _isEditMode;
|
private bool _isEditMode;
|
||||||
private PwEntry _reorderedEntry;
|
private PwEntry _reorderedEntry;
|
||||||
private ObservableCollection<EntryVm> _entries = new ObservableCollection<EntryVm>();
|
private ObservableCollection<EntryVm> _entries = new ObservableCollection<EntryVm>();
|
||||||
@@ -101,10 +103,10 @@ namespace ModernKeePass.ViewModels
|
|||||||
public GroupVm() {}
|
public GroupVm() {}
|
||||||
|
|
||||||
internal GroupVm(PwGroup pwGroup, GroupVm parent, PwUuid recycleBinId = null) : this(pwGroup, parent,
|
internal GroupVm(PwGroup pwGroup, GroupVm parent, PwUuid recycleBinId = null) : this(pwGroup, parent,
|
||||||
(Application.Current as App)?.Database, recycleBinId)
|
DatabaseService.Instance, recycleBinId)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public GroupVm(PwGroup pwGroup, GroupVm parent, IDatabase database, PwUuid recycleBinId = null)
|
public GroupVm(PwGroup pwGroup, GroupVm parent, IDatabaseService database, PwUuid recycleBinId = null)
|
||||||
{
|
{
|
||||||
_pwGroup = pwGroup;
|
_pwGroup = pwGroup;
|
||||||
_database = database;
|
_database = database;
|
||||||
@@ -116,6 +118,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
Groups = new ObservableCollection<GroupVm>(pwGroup.Groups.Select(g => new GroupVm(g, this, recycleBinId)));
|
Groups = new ObservableCollection<GroupVm>(pwGroup.Groups.Select(g => new GroupVm(g, this, recycleBinId)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[DatabaseChanged]
|
||||||
private void Entries_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
private void Entries_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
switch (e.Action)
|
switch (e.Action)
|
||||||
@@ -132,6 +135,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[DatabaseChanged]
|
||||||
public GroupVm AddNewGroup(string name = "")
|
public GroupVm AddNewGroup(string name = "")
|
||||||
{
|
{
|
||||||
var pwGroup = new PwGroup(true, true, name, PwIcon.Folder);
|
var pwGroup = new PwGroup(true, true, name, PwIcon.Folder);
|
||||||
@@ -162,6 +166,8 @@ namespace ModernKeePass.ViewModels
|
|||||||
Move(PreviousGroup);
|
Move(PreviousGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[DatabaseChanged]
|
||||||
public void Move(GroupVm destination)
|
public void Move(GroupVm destination)
|
||||||
{
|
{
|
||||||
PreviousGroup = ParentGroup;
|
PreviousGroup = ParentGroup;
|
||||||
@@ -189,6 +195,8 @@ namespace ModernKeePass.ViewModels
|
|||||||
_database.Save();
|
_database.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[DatabaseChanged]
|
||||||
public void SortEntries()
|
public void SortEntries()
|
||||||
{
|
{
|
||||||
var comparer = new PwEntryComparer(PwDefs.TitleField, true, false);
|
var comparer = new PwEntryComparer(PwDefs.TitleField, true, false);
|
||||||
@@ -203,6 +211,8 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[DatabaseChanged]
|
||||||
public void SortGroups()
|
public void SortGroups()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Services;
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
@@ -31,20 +30,20 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public void OpenDatabaseFile()
|
public void OpenDatabaseFile()
|
||||||
{
|
{
|
||||||
OpenDatabaseFile((Application.Current as App)?.Database);
|
OpenDatabaseFile(DatabaseService.Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenDatabaseFile(IDatabase database)
|
public void OpenDatabaseFile(IDatabaseService database)
|
||||||
{
|
{
|
||||||
database.DatabaseFile = DatabaseFile;
|
database.DatabaseFile = DatabaseFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateAccessTime()
|
public void UpdateAccessTime()
|
||||||
{
|
{
|
||||||
UpdateAccessTime(new RecentService());
|
UpdateAccessTime(RecentService.Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void UpdateAccessTime(IRecent recent)
|
public async void UpdateAccessTime(IRecentService recent)
|
||||||
{
|
{
|
||||||
await recent.GetFileAsync(Token);
|
await recent.GetFileAsync(Token);
|
||||||
}
|
}
|
||||||
|
@@ -2,9 +2,9 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
using ModernKeePassLib;
|
using ModernKeePassLib;
|
||||||
using ModernKeePassLib.Cryptography.Cipher;
|
using ModernKeePassLib.Cryptography.Cipher;
|
||||||
using ModernKeePassLib.Cryptography.KeyDerivation;
|
using ModernKeePassLib.Cryptography.KeyDerivation;
|
||||||
@@ -14,7 +14,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
// TODO: implement Kdf settings
|
// TODO: implement Kdf settings
|
||||||
public class SettingsDatabaseVm: NotifyPropertyChangedBase, IHasSelectableObject
|
public class SettingsDatabaseVm: NotifyPropertyChangedBase, IHasSelectableObject
|
||||||
{
|
{
|
||||||
private readonly IDatabase _database;
|
private readonly IDatabaseService _database;
|
||||||
private GroupVm _selectedItem;
|
private GroupVm _selectedItem;
|
||||||
|
|
||||||
public bool HasRecycleBin
|
public bool HasRecycleBin
|
||||||
@@ -88,9 +88,9 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SettingsDatabaseVm() : this((Application.Current as App)?.Database) { }
|
public SettingsDatabaseVm() : this(DatabaseService.Instance) { }
|
||||||
|
|
||||||
public SettingsDatabaseVm(IDatabase database)
|
public SettingsDatabaseVm(IDatabaseService database)
|
||||||
{
|
{
|
||||||
_database = database;
|
_database = database;
|
||||||
Groups = _database?.RootGroup.Groups;
|
Groups = _database?.RootGroup.Groups;
|
||||||
|
@@ -6,12 +6,12 @@ namespace ModernKeePass.ViewModels
|
|||||||
{
|
{
|
||||||
public class SettingsNewVm
|
public class SettingsNewVm
|
||||||
{
|
{
|
||||||
private ISettings _settings;
|
private ISettingsService _settings;
|
||||||
|
|
||||||
public SettingsNewVm() : this(new SettingsService())
|
public SettingsNewVm() : this(SettingsService.Instance)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public SettingsNewVm(ISettings settings)
|
public SettingsNewVm(ISettingsService settings)
|
||||||
{
|
{
|
||||||
_settings = settings;
|
_settings = settings;
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Windows.ApplicationModel;
|
using Windows.ApplicationModel;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
@@ -46,10 +45,10 @@ namespace ModernKeePass.ViewModels
|
|||||||
public MainVm() {}
|
public MainVm() {}
|
||||||
|
|
||||||
internal MainVm(Frame referenceFrame, Frame destinationFrame) : this(referenceFrame, destinationFrame,
|
internal MainVm(Frame referenceFrame, Frame destinationFrame) : this(referenceFrame, destinationFrame,
|
||||||
(Application.Current as App)?.Database, new ResourcesService(), new RecentService())
|
DatabaseService.Instance, new ResourcesService(), RecentService.Instance)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public MainVm(Frame referenceFrame, Frame destinationFrame, IDatabase database, IResource resource, IRecent recent)
|
public MainVm(Frame referenceFrame, Frame destinationFrame, IDatabaseService database, IResourceService resource, IRecentService recent)
|
||||||
{
|
{
|
||||||
var isDatabaseOpen = database != null && database.IsOpen;
|
var isDatabaseOpen = database != null && database.IsOpen;
|
||||||
|
|
||||||
@@ -62,7 +61,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
Destination = destinationFrame,
|
Destination = destinationFrame,
|
||||||
Parameter = referenceFrame,
|
Parameter = referenceFrame,
|
||||||
SymbolIcon = Symbol.Page2,
|
SymbolIcon = Symbol.Page2,
|
||||||
IsSelected = database != null && database.IsFileOpen
|
IsSelected = database != null && database.IsFileOpen && !database.IsOpen
|
||||||
},
|
},
|
||||||
new MainMenuItemVm
|
new MainMenuItemVm
|
||||||
{
|
{
|
||||||
@@ -107,14 +106,14 @@ namespace ModernKeePass.ViewModels
|
|||||||
PageType = typeof(AboutPage),
|
PageType = typeof(AboutPage),
|
||||||
Destination = destinationFrame,
|
Destination = destinationFrame,
|
||||||
SymbolIcon = Symbol.Help
|
SymbolIcon = Symbol.Help
|
||||||
}/*,
|
},
|
||||||
new MainMenuItemVm
|
new MainMenuItemVm
|
||||||
{
|
{
|
||||||
Title = resource.GetResourceValue("MainMenuItemDonate"),
|
Title = resource.GetResourceValue("MainMenuItemDonate"),
|
||||||
PageType = typeof(DonatePage),
|
PageType = typeof(DonatePage),
|
||||||
Destination = destinationFrame,
|
Destination = destinationFrame,
|
||||||
SymbolIcon = Symbol.Shop
|
SymbolIcon = Symbol.Shop
|
||||||
}*/
|
}
|
||||||
};
|
};
|
||||||
// Auto-select the Recent Items menu item if the conditions are met
|
// Auto-select the Recent Items menu item if the conditions are met
|
||||||
SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
|
SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Services;
|
using ModernKeePass.Services;
|
||||||
@@ -12,11 +11,11 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public string Name => _database?.Name;
|
public string Name => _database?.Name;
|
||||||
|
|
||||||
private readonly IDatabase _database;
|
private readonly IDatabaseService _database;
|
||||||
|
|
||||||
public OpenVm() : this((Application.Current as App)?.Database) { }
|
public OpenVm() : this(DatabaseService.Instance) { }
|
||||||
|
|
||||||
public OpenVm(IDatabase database)
|
public OpenVm(IDatabaseService database)
|
||||||
{
|
{
|
||||||
_database = database;
|
_database = database;
|
||||||
if (database == null || !database.IsFileOpen) return;
|
if (database == null || !database.IsFileOpen) return;
|
||||||
@@ -25,10 +24,10 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public void OpenFile(StorageFile file)
|
public void OpenFile(StorageFile file)
|
||||||
{
|
{
|
||||||
OpenFile(file, new RecentService());
|
OpenFile(file, RecentService.Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenFile(StorageFile file, IRecent recent)
|
public void OpenFile(StorageFile file, IRecentService recent)
|
||||||
{
|
{
|
||||||
_database.DatabaseFile = file;
|
_database.DatabaseFile = file;
|
||||||
OnPropertyChanged("Name");
|
OnPropertyChanged("Name");
|
||||||
@@ -36,7 +35,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
AddToRecentList(file, recent);
|
AddToRecentList(file, recent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddToRecentList(StorageFile file, IRecent recent)
|
private void AddToRecentList(StorageFile file, IRecentService recent)
|
||||||
{
|
{
|
||||||
recent.Add(file, file.DisplayName);
|
recent.Add(file, file.DisplayName);
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
{
|
{
|
||||||
public class RecentVm : NotifyPropertyChangedBase, IHasSelectableObject
|
public class RecentVm : NotifyPropertyChangedBase, IHasSelectableObject
|
||||||
{
|
{
|
||||||
private readonly IRecent _recent;
|
private readonly IRecentService _recent;
|
||||||
private ISelectableModel _selectedItem;
|
private ISelectableModel _selectedItem;
|
||||||
private ObservableCollection<IRecentItem> _recentItems = new ObservableCollection<IRecentItem>();
|
private ObservableCollection<IRecentItem> _recentItems = new ObservableCollection<IRecentItem>();
|
||||||
|
|
||||||
@@ -35,10 +35,10 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public RecentVm() : this (new RecentService())
|
public RecentVm() : this (RecentService.Instance)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public RecentVm(IRecent recent)
|
public RecentVm(IRecentService recent)
|
||||||
{
|
{
|
||||||
_recent = recent;
|
_recent = recent;
|
||||||
RecentItems = _recent.GetAllFiles();
|
RecentItems = _recent.GetAllFiles();
|
||||||
|
@@ -1,16 +1,16 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class SaveVm
|
public class SaveVm
|
||||||
{
|
{
|
||||||
private readonly IDatabase _database;
|
private readonly IDatabaseService _database;
|
||||||
public SaveVm() : this((Application.Current as App)?.Database) { }
|
public SaveVm() : this(DatabaseService.Instance) { }
|
||||||
|
|
||||||
public SaveVm(IDatabase database)
|
public SaveVm(IDatabaseService database)
|
||||||
{
|
{
|
||||||
_database = database;
|
_database = database;
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
@@ -41,9 +40,9 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SettingsVm() : this((Application.Current as App)?.Database, new ResourcesService()) { }
|
public SettingsVm() : this(DatabaseService.Instance, new ResourcesService()) { }
|
||||||
|
|
||||||
public SettingsVm(IDatabase database, IResource resource)
|
public SettingsVm(IDatabaseService database, IResourceService resource)
|
||||||
{
|
{
|
||||||
var menuItems = new ObservableCollection<ListMenuItemVm>
|
var menuItems = new ObservableCollection<ListMenuItemVm>
|
||||||
{
|
{
|
||||||
|
@@ -4,27 +4,6 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:viewModels="using:ModernKeePass.ViewModels"
|
|
||||||
xmlns:converters="using:ModernKeePass.Converters"
|
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
<Page.DataContext>
|
<WebView Source="https://PayPal.Me/wismna"></WebView>
|
||||||
<viewModels:DonateVm />
|
|
||||||
</Page.DataContext>
|
|
||||||
<Page.Resources>
|
|
||||||
<converters:NullToBooleanConverter x:Key="NullToBooleanConverter"/>
|
|
||||||
<CollectionViewSource
|
|
||||||
x:Name="DonateItemsSource"
|
|
||||||
Source="{Binding Donations}" />
|
|
||||||
</Page.Resources>
|
|
||||||
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Margin="10,0,0,0">
|
|
||||||
<TextBlock x:Uid="DonateDesc" Style="{StaticResource BodyTextBlockStyle}" />
|
|
||||||
<ItemsControl ItemsSource="{Binding Source={StaticResource DonateItemsSource}}" Margin="0,10,0,10">
|
|
||||||
<ItemsControl.ItemTemplate>
|
|
||||||
<DataTemplate>
|
|
||||||
<RadioButton GroupName="DonateOptions" Content="{Binding FormattedPrice}" Checked="ToggleButton_OnChecked" />
|
|
||||||
</DataTemplate>
|
|
||||||
</ItemsControl.ItemTemplate>
|
|
||||||
</ItemsControl>
|
|
||||||
<Button x:Uid="DonateButton" Click="ButtonBase_OnClick" IsEnabled="{Binding SelectedItem, Converter={StaticResource NullToBooleanConverter}}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Page>
|
</Page>
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="Microsoft.AppCenter" version="1.4.0" targetFramework="win81" />
|
||||||
|
<package id="Microsoft.AppCenter.Analytics" version="1.4.0" targetFramework="win81" />
|
||||||
|
<package id="Microsoft.AppCenter.Push" version="1.4.0" targetFramework="win81" />
|
||||||
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="win81" />
|
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="win81" />
|
||||||
<package id="Microsoft.NETCore.Platforms" version="2.0.1" targetFramework="win81" />
|
<package id="Microsoft.NETCore.Platforms" version="2.0.1" targetFramework="win81" />
|
||||||
<package id="Microsoft.NETCore.Portable.Compatibility" version="1.0.2" targetFramework="win81" />
|
<package id="Microsoft.NETCore.Portable.Compatibility" version="1.0.2" targetFramework="win81" />
|
||||||
|
@@ -9,13 +9,11 @@ using Windows.Storage;
|
|||||||
|
|
||||||
namespace ModernKeePassApp.Test.Mock
|
namespace ModernKeePassApp.Test.Mock
|
||||||
{
|
{
|
||||||
public class DatabaseServiceMock : IDatabase
|
public class DatabaseServiceMock : IDatabaseService
|
||||||
{
|
{
|
||||||
private bool _isOpen;
|
private bool _isOpen;
|
||||||
private bool _isFileOpen;
|
|
||||||
private bool _isClosed;
|
private bool _isClosed;
|
||||||
|
|
||||||
|
|
||||||
public PwCompressionAlgorithm CompressionAlgorithm { get; set; }
|
public PwCompressionAlgorithm CompressionAlgorithm { get; set; }
|
||||||
|
|
||||||
public StorageFile DatabaseFile { get; set; }
|
public StorageFile DatabaseFile { get; set; }
|
||||||
@@ -24,20 +22,13 @@ namespace ModernKeePassApp.Test.Mock
|
|||||||
|
|
||||||
public KdfParameters KeyDerivation { get; set; }
|
public KdfParameters KeyDerivation { get; set; }
|
||||||
|
|
||||||
public bool IsOpen
|
public bool IsOpen => _isOpen;
|
||||||
{
|
|
||||||
get { return _isOpen; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsFileOpen
|
public bool IsFileOpen => DatabaseFile != null;
|
||||||
{
|
|
||||||
get { return _isFileOpen; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsClosed
|
public bool IsClosed => _isClosed;
|
||||||
{
|
|
||||||
get { return _isClosed; }
|
public bool HasChanged { get; set; }
|
||||||
}
|
|
||||||
|
|
||||||
public string Name => "MockDatabase";
|
public string Name => "MockDatabase";
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@ using Windows.Storage;
|
|||||||
|
|
||||||
namespace ModernKeePassApp.Test.Mock
|
namespace ModernKeePassApp.Test.Mock
|
||||||
{
|
{
|
||||||
class RecentServiceMock : IRecent
|
class RecentServiceMock : IRecentService
|
||||||
{
|
{
|
||||||
public int EntryCount => 0;
|
public int EntryCount => 0;
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ using ModernKeePass.Interfaces;
|
|||||||
|
|
||||||
namespace ModernKeePassApp.Test.Mock
|
namespace ModernKeePassApp.Test.Mock
|
||||||
{
|
{
|
||||||
class ResourceServiceMock : IResource
|
class ResourceServiceMock : IResourceService
|
||||||
{
|
{
|
||||||
public string GetResourceValue(string key)
|
public string GetResourceValue(string key)
|
||||||
{
|
{
|
||||||
|
@@ -3,7 +3,7 @@ using ModernKeePass.Interfaces;
|
|||||||
|
|
||||||
namespace ModernKeePassApp.Test.Mock
|
namespace ModernKeePassApp.Test.Mock
|
||||||
{
|
{
|
||||||
public class SettingsServiceMock : ISettings
|
public class SettingsServiceMock : ISettingsService
|
||||||
{
|
{
|
||||||
public T GetSetting<T>(string property)
|
public T GetSetting<T>(string property)
|
||||||
{
|
{
|
||||||
|
@@ -31,14 +31,15 @@ namespace ModernKeePassApp.Test
|
|||||||
var mainVm = new MainVm(null, null, database, _resource, _recent);
|
var mainVm = new MainVm(null, null, database, _resource, _recent);
|
||||||
Assert.AreEqual(1, mainVm.MainMenuItems.Count());
|
Assert.AreEqual(1, mainVm.MainMenuItems.Count());
|
||||||
var firstGroup = mainVm.MainMenuItems.FirstOrDefault();
|
var firstGroup = mainVm.MainMenuItems.FirstOrDefault();
|
||||||
Assert.AreEqual(6, firstGroup.Count());
|
Assert.AreEqual(7, firstGroup.Count());
|
||||||
|
|
||||||
database.Status = 1;
|
database.DatabaseFile = Package.Current.InstalledLocation.GetFileAsync(@"Data\TestDatabase.kdbx")
|
||||||
|
.GetAwaiter().GetResult();
|
||||||
mainVm = new MainVm(null, null, database, _resource, _recent);
|
mainVm = new MainVm(null, null, database, _resource, _recent);
|
||||||
Assert.IsNotNull(mainVm.SelectedItem);
|
Assert.IsNotNull(mainVm.SelectedItem);
|
||||||
Assert.AreEqual(typeof(OpenDatabasePage), ((MainMenuItemVm) mainVm.SelectedItem).PageType);
|
Assert.AreEqual(typeof(OpenDatabasePage), ((MainMenuItemVm) mainVm.SelectedItem).PageType);
|
||||||
|
|
||||||
database.Status = 2;
|
database.Open(null, false).GetAwaiter().GetResult();
|
||||||
mainVm = new MainVm(null, null, database, _resource, _recent);
|
mainVm = new MainVm(null, null, database, _resource, _recent);
|
||||||
Assert.IsNotNull(mainVm.SelectedItem);
|
Assert.IsNotNull(mainVm.SelectedItem);
|
||||||
Assert.AreEqual(2, mainVm.MainMenuItems.Count());
|
Assert.AreEqual(2, mainVm.MainMenuItems.Count());
|
||||||
@@ -57,19 +58,11 @@ namespace ModernKeePassApp.Test
|
|||||||
Assert.AreEqual(15.0, compositeKeyVm.PasswordComplexityIndicator);
|
Assert.AreEqual(15.0, compositeKeyVm.PasswordComplexityIndicator);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
|
||||||
public void TestDonateVm()
|
|
||||||
{
|
|
||||||
var donateVm = new DonateVm(new LicenseServiceMock());
|
|
||||||
Assert.AreEqual(4, donateVm.Donations.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestOpenVm()
|
public void TestOpenVm()
|
||||||
{
|
{
|
||||||
var database = new DatabaseServiceMock
|
var database = new DatabaseServiceMock
|
||||||
{
|
{
|
||||||
Status = 1,
|
|
||||||
DatabaseFile = Package.Current.InstalledLocation.GetFileAsync(@"Data\TestDatabase.kdbx")
|
DatabaseFile = Package.Current.InstalledLocation.GetFileAsync(@"Data\TestDatabase.kdbx")
|
||||||
.GetAwaiter().GetResult()
|
.GetAwaiter().GetResult()
|
||||||
};
|
};
|
||||||
@@ -99,15 +92,13 @@ namespace ModernKeePassApp.Test
|
|||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestSaveVm()
|
public void TestSaveVm()
|
||||||
{
|
{
|
||||||
var database = new DatabaseServiceMock
|
var database = new DatabaseServiceMock();
|
||||||
{
|
|
||||||
Status = 2
|
|
||||||
};
|
|
||||||
var saveVm = new SaveVm(database);
|
var saveVm = new SaveVm(database);
|
||||||
saveVm.Save(false);
|
database.Open(null, false).GetAwaiter().GetResult();
|
||||||
Assert.AreEqual(2, database.Status);
|
saveVm.Save(false).GetAwaiter().GetResult();
|
||||||
saveVm.Save();
|
Assert.IsTrue(database.IsOpen);
|
||||||
Assert.AreEqual(0, database.Status);
|
saveVm.Save().GetAwaiter().GetResult();
|
||||||
|
Assert.IsFalse(database.IsOpen);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
@@ -126,10 +117,7 @@ namespace ModernKeePassApp.Test
|
|||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestEntryVm()
|
public void TestEntryVm()
|
||||||
{
|
{
|
||||||
var database = new DatabaseServiceMock
|
var database = new DatabaseServiceMock();
|
||||||
{
|
|
||||||
Status = 2
|
|
||||||
};
|
|
||||||
var entryVm = new EntryVm(new PwEntry(true, true), new GroupVm(), database)
|
var entryVm = new EntryVm(new PwEntry(true, true), new GroupVm(), database)
|
||||||
{
|
{
|
||||||
Name = "Test",
|
Name = "Test",
|
||||||
@@ -141,10 +129,7 @@ namespace ModernKeePassApp.Test
|
|||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestGroupVm()
|
public void TestGroupVm()
|
||||||
{
|
{
|
||||||
var database = new DatabaseServiceMock
|
var database = new DatabaseServiceMock();
|
||||||
{
|
|
||||||
Status = 2
|
|
||||||
};
|
|
||||||
var entryVm = new GroupVm(new PwGroup(true, true), new GroupVm(), database)
|
var entryVm = new GroupVm(new PwGroup(true, true), new GroupVm(), database)
|
||||||
{
|
{
|
||||||
Name = "Test"
|
Name = "Test"
|
||||||
|
Reference in New Issue
Block a user