diff --git a/ModernKeePass.sln b/ModernKeePass.sln
index 376d44d..a5cfa75 100644
--- a/ModernKeePass.sln
+++ b/ModernKeePass.sln
@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePassLib.Test", "Mo
EndProject
Project("{F5034706-568F-408A-B7B3-4D38C6DB8A32}") = "Scripts", "Scripts\Scripts.pssproj", "{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePassApp.Test", "ModernKeePassApp.Test\ModernKeePassApp.Test.csproj", "{7E80F5E7-724A-4668-9333-B10F5D75C6D0}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -103,6 +105,30 @@ Global
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|x64.Build.0 = Release|Any CPU
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|x86.ActiveCfg = Release|Any CPU
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|x86.Build.0 = Release|Any CPU
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|ARM.ActiveCfg = Debug|ARM
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|ARM.Build.0 = Debug|ARM
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|ARM.Deploy.0 = Debug|ARM
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x64.ActiveCfg = Debug|x64
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x64.Build.0 = Debug|x64
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x64.Deploy.0 = Debug|x64
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x86.ActiveCfg = Debug|x86
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x86.Build.0 = Debug|x86
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x86.Deploy.0 = Debug|x86
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|ARM.ActiveCfg = Release|ARM
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|ARM.Build.0 = Release|ARM
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|ARM.Deploy.0 = Release|ARM
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x64.ActiveCfg = Release|x64
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x64.Build.0 = Release|x64
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x64.Deploy.0 = Release|x64
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x86.ActiveCfg = Release|x86
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x86.Build.0 = Release|x86
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/ModernKeePass/Common/DatabaseHelper.cs b/ModernKeePass/Common/DatabaseHelper.cs
index 9afae3d..668e728 100644
--- a/ModernKeePass/Common/DatabaseHelper.cs
+++ b/ModernKeePass/Common/DatabaseHelper.cs
@@ -1,6 +1,7 @@
using System;
using Windows.Storage;
using Windows.UI.Xaml.Controls;
+using ModernKeePass.Interfaces;
using ModernKeePass.ViewModels;
using ModernKeePassLib;
using ModernKeePassLib.Cryptography.KeyDerivation;
@@ -10,7 +11,7 @@ using ModernKeePassLib.Serialization;
namespace ModernKeePass.Common
{
- public class DatabaseHelper
+ public class DatabaseHelper: IDatabase
{
public enum DatabaseStatus
{
@@ -37,7 +38,7 @@ namespace ModernKeePass.Common
}
}
- public DatabaseStatus Status { get; private set; } = DatabaseStatus.Closed;
+ public int Status { get; set; } = (int)DatabaseStatus.Closed;
public string Name => DatabaseFile?.Name;
public bool RecycleBinEnabled
@@ -52,7 +53,7 @@ namespace ModernKeePass.Common
set
{
_databaseFile = value;
- Status = DatabaseStatus.Opening;
+ Status = (int)DatabaseStatus.Opening;
}
}
@@ -84,24 +85,26 @@ namespace ModernKeePass.Common
{
try
{
- if (key == null) Status = DatabaseStatus.NoCompositeKey;
+ if (key == null)
+ {
+ Status = (int)DatabaseStatus.NoCompositeKey;
+ return;
+ }
var ioConnection = IOConnectionInfo.FromFile(DatabaseFile);
if (createNew) _pwDatabase.New(ioConnection, key);
else _pwDatabase.Open(ioConnection, key, new NullStatusLogger());
- if (_pwDatabase.IsOpen)
- {
- Status = DatabaseStatus.Opened;
- RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null);
- }
+ if (!_pwDatabase.IsOpen) return;
+ Status = (int)DatabaseStatus.Opened;
+ RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null);
}
catch (InvalidCompositeKeyException)
{
- Status = DatabaseStatus.CompositeKeyError;
+ Status = (int)DatabaseStatus.CompositeKeyError;
}
catch (Exception ex)
{
- Status = DatabaseStatus.Error;
+ Status = (int)DatabaseStatus.Error;
}
}
@@ -109,11 +112,19 @@ namespace ModernKeePass.Common
/// Save the current database to another file and open it
///
/// The new database file
- internal void Save(StorageFile file)
+ public bool Save(StorageFile file)
{
DatabaseFile = file;
- _pwDatabase.SaveAs(IOConnectionInfo.FromFile(DatabaseFile), true, new NullStatusLogger());
- Status = DatabaseStatus.Opened;
+ try
+ {
+ _pwDatabase.SaveAs(IOConnectionInfo.FromFile(DatabaseFile), true, new NullStatusLogger());
+ Status = (int)DatabaseStatus.Opened;
+ return true;
+ }
+ catch (Exception ex)
+ {
+ return false;
+ }
}
///
@@ -129,9 +140,10 @@ namespace ModernKeePass.Common
}
catch (Exception ex)
{
+ return false;
+ // TODO: put this at a better place (e.g. in views)
MessageDialogHelper.ShowErrorDialog(ex);
}
- return false;
}
///
@@ -140,7 +152,7 @@ namespace ModernKeePass.Common
public void Close()
{
_pwDatabase?.Close();
- Status = DatabaseStatus.Closed;
+ Status = (int)DatabaseStatus.Closed;
}
public void AddDeletedItem(PwUuid id)
@@ -150,7 +162,7 @@ namespace ModernKeePass.Common
public void CreateRecycleBin()
{
- RecycleBin = RootGroup.AddNewGroup("Recycle bin");
+ RecycleBin = ((GroupVm)RootGroup).AddNewGroup("Recycle bin");
RecycleBin.IsSelected = true;
RecycleBin.IconSymbol = Symbol.Delete;
}
diff --git a/ModernKeePass/Interfaces/IDatabase.cs b/ModernKeePass/Interfaces/IDatabase.cs
new file mode 100644
index 0000000..e005b46
--- /dev/null
+++ b/ModernKeePass/Interfaces/IDatabase.cs
@@ -0,0 +1,20 @@
+using ModernKeePass.ViewModels;
+using ModernKeePassLib;
+using ModernKeePassLib.Keys;
+
+namespace ModernKeePass.Interfaces
+{
+ public interface IDatabase
+ {
+ bool RecycleBinEnabled { get; set; }
+ int Status { get; set; }
+ GroupVm RootGroup { get; set; }
+ GroupVm RecycleBin { get; set; }
+
+ void Open(CompositeKey key, bool createNew);
+ void UpdateCompositeKey(CompositeKey key);
+ bool Save();
+ void CreateRecycleBin();
+ void AddDeletedItem(PwUuid id);
+ }
+}
\ No newline at end of file
diff --git a/ModernKeePass/ModernKeePassApp.csproj b/ModernKeePass/ModernKeePassApp.csproj
index 8683979..05c66f5 100644
--- a/ModernKeePass/ModernKeePassApp.csproj
+++ b/ModernKeePass/ModernKeePassApp.csproj
@@ -123,6 +123,7 @@
+
diff --git a/ModernKeePass/ViewModels/CompositeKeyVm.cs b/ModernKeePass/ViewModels/CompositeKeyVm.cs
index 70ec127..2a7d91f 100644
--- a/ModernKeePass/ViewModels/CompositeKeyVm.cs
+++ b/ModernKeePass/ViewModels/CompositeKeyVm.cs
@@ -2,6 +2,7 @@
using Windows.Storage;
using Windows.UI.Xaml;
using ModernKeePass.Common;
+using ModernKeePass.Interfaces;
using ModernKeePassLib.Cryptography;
using ModernKeePassLib.Keys;
using ModernKeePassLib.Serialization;
@@ -18,7 +19,7 @@ namespace ModernKeePass.ViewModels
Success = 5
}
- private readonly App _app = Application.Current as App;
+ //private readonly App _app = Application.Current as App;
private bool _hasPassword;
private bool _hasKeyFile;
private string _password = string.Empty;
@@ -27,6 +28,8 @@ namespace ModernKeePass.ViewModels
private StorageFile _keyFile;
private string _keyFileText = "Select key file from disk...";
+ public IDatabase Database { get; set; }
+
public bool HasPassword
{
get { return _hasPassword; }
@@ -90,15 +93,23 @@ namespace ModernKeePass.ViewModels
}
public GroupVm RootGroup { get; set; }
+
public double PasswordComplexityIndicator => QualityEstimation.EstimatePasswordBits(Password?.ToCharArray());
-
+
+ public CompositeKeyVm() : this((Application.Current as App)?.Database) { }
+
+ public CompositeKeyVm(IDatabase database)
+ {
+ Database = database;
+ }
+
public bool OpenDatabase(bool createNew)
{
- _app.Database.Open(CreateCompositeKey(), createNew);
- switch (_app.Database.Status)
+ Database.Open(CreateCompositeKey(), createNew);
+ switch ((DatabaseHelper.DatabaseStatus)Database.Status)
{
case DatabaseHelper.DatabaseStatus.Opened:
- RootGroup = _app.Database.RootGroup;
+ RootGroup = Database.RootGroup;
return true;
case DatabaseHelper.DatabaseStatus.CompositeKeyError:
var errorMessage = new StringBuilder("Error: wrong ");
@@ -113,7 +124,7 @@ namespace ModernKeePass.ViewModels
public void UpdateKey()
{
- _app.Database.UpdateCompositeKey(CreateCompositeKey());
+ Database.UpdateCompositeKey(CreateCompositeKey());
UpdateStatus("Database composite key updated.", StatusTypes.Success);
}
diff --git a/ModernKeePass/ViewModels/EntryVm.cs b/ModernKeePass/ViewModels/EntryVm.cs
index 83813fb..2c2e7f5 100644
--- a/ModernKeePass/ViewModels/EntryVm.cs
+++ b/ModernKeePass/ViewModels/EntryVm.cs
@@ -14,6 +14,7 @@ namespace ModernKeePass.ViewModels
{
public class EntryVm : INotifyPropertyChanged, IPwEntity
{
+ public IDatabase Database { get; set; }
public GroupVm ParentGroup { get; private set; }
public GroupVm PreviousGroup { get; private set; }
@@ -150,7 +151,6 @@ namespace ModernKeePass.ViewModels
public event PropertyChangedEventHandler PropertyChanged;
private readonly PwEntry _pwEntry;
- private readonly App _app = Application.Current as App;
private bool _isEditMode;
private bool _isRevealPassword;
private double _passwordLength = 25;
@@ -160,16 +160,20 @@ namespace ModernKeePass.ViewModels
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
- public EntryVm() { }
- public EntryVm(PwEntry entry, GroupVm parent)
+ public EntryVm() : this(null, null) { }
+
+ internal EntryVm(PwEntry entry, GroupVm parent) : this(entry, parent, (Application.Current as App)?.Database) { }
+
+ public EntryVm(PwEntry entry, GroupVm parent, IDatabase database)
{
+ Database = database;
_pwEntry = entry;
ParentGroup = parent;
}
public void GeneratePassword()
{
- var pwProfile = new PwProfile()
+ var pwProfile = new PwProfile
{
GeneratorType = PasswordGeneratorType.CharSet,
Length = (uint)PasswordLength,
@@ -208,9 +212,9 @@ namespace ModernKeePass.ViewModels
public void MarkForDelete()
{
- if (_app.Database.RecycleBinEnabled && _app.Database.RecycleBin?.IdUuid == null)
- _app.Database.CreateRecycleBin();
- Move(_app.Database.RecycleBinEnabled && !ParentGroup.IsSelected ? _app.Database.RecycleBin : null);
+ if (Database.RecycleBinEnabled && Database.RecycleBin?.IdUuid == null)
+ Database.CreateRecycleBin();
+ Move(Database.RecycleBinEnabled && !ParentGroup.IsSelected ? Database.RecycleBin : null);
}
public void UndoDelete()
@@ -225,7 +229,7 @@ namespace ModernKeePass.ViewModels
PreviousGroup.RemovePwEntry(_pwEntry);
if (destination == null)
{
- _app.Database.AddDeletedItem(IdUuid);
+ Database.AddDeletedItem(IdUuid);
return;
}
ParentGroup = destination;
@@ -236,13 +240,13 @@ namespace ModernKeePass.ViewModels
public void CommitDelete()
{
_pwEntry.ParentGroup.Entries.Remove(_pwEntry);
- if (_app.Database.RecycleBinEnabled && !PreviousGroup.IsSelected) _app.Database.RecycleBin.AddPwEntry(_pwEntry);
- else _app.Database.AddDeletedItem(IdUuid);
+ if (Database.RecycleBinEnabled && !PreviousGroup.IsSelected) Database.RecycleBin.AddPwEntry(_pwEntry);
+ else Database.AddDeletedItem(IdUuid);
}
public void Save()
{
- _app.Database.Save();
+ Database.Save();
}
}
}
diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs
index f83890f..ae18a81 100644
--- a/ModernKeePass/ViewModels/MainVm.cs
+++ b/ModernKeePass/ViewModels/MainVm.cs
@@ -49,14 +49,14 @@ namespace ModernKeePass.ViewModels
{
var app = (App)Application.Current;
var mru = StorageApplicationPermissions.MostRecentlyUsedList;
- var isDatabaseOpen = app.Database != null && app.Database.Status == DatabaseHelper.DatabaseStatus.Opened;
+ var isDatabaseOpen = app.Database != null && app.Database.Status == (int) DatabaseHelper.DatabaseStatus.Opened;
var mainMenuItems = new ObservableCollection
{
new MainMenuItemVm
{
Title = "Open", PageType = typeof(OpenDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Page2,
- IsSelected = app.Database.Status == DatabaseHelper.DatabaseStatus.Opening
+ IsSelected = app.Database.Status == (int) DatabaseHelper.DatabaseStatus.Opening
},
new MainMenuItemVm
{
@@ -69,7 +69,7 @@ namespace ModernKeePass.ViewModels
},
new MainMenuItemVm {
Title = "Recent" , PageType = typeof(RecentDatabasesPage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Copy,
- IsSelected = (app.Database == null || app.Database.Status == DatabaseHelper.DatabaseStatus.Closed) && mru.Entries.Count > 0, IsEnabled = mru.Entries.Count > 0
+ IsSelected = (app.Database == null || app.Database.Status == (int) DatabaseHelper.DatabaseStatus.Closed) && mru.Entries.Count > 0, IsEnabled = mru.Entries.Count > 0
},
new MainMenuItemVm
{
@@ -78,7 +78,7 @@ namespace ModernKeePass.ViewModels
};
// Auto-select the Recent Items menu item if the conditions are met
SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
- if (app.Database != null && app.Database.Status == DatabaseHelper.DatabaseStatus.Opened)
+ if (app.Database != null && app.Database.Status == (int) DatabaseHelper.DatabaseStatus.Opened)
mainMenuItems.Add(new MainMenuItemVm
{
Title = app.Database.Name,
diff --git a/ModernKeePass/ViewModels/OpenVm.cs b/ModernKeePass/ViewModels/OpenVm.cs
index 3f94b00..2987237 100644
--- a/ModernKeePass/ViewModels/OpenVm.cs
+++ b/ModernKeePass/ViewModels/OpenVm.cs
@@ -10,7 +10,7 @@ namespace ModernKeePass.ViewModels
{
public bool ShowPasswordBox
{
- get { return ((App)Application.Current).Database.Status == DatabaseHelper.DatabaseStatus.Opening; }
+ get { return ((App)Application.Current).Database.Status == (int) DatabaseHelper.DatabaseStatus.Opening; }
}
public string Name
@@ -21,7 +21,7 @@ namespace ModernKeePass.ViewModels
public OpenVm()
{
var app = Application.Current as App;
- if (app?.Database == null || app.Database.Status != DatabaseHelper.DatabaseStatus.Opening) return;
+ if (app?.Database == null || app.Database.Status != (int) DatabaseHelper.DatabaseStatus.Opening) return;
OpenFile(app.Database.DatabaseFile);
}
diff --git a/ModernKeePassApp.Test/DatabaseTests.cs b/ModernKeePassApp.Test/DatabaseTests.cs
new file mode 100644
index 0000000..3ca6687
--- /dev/null
+++ b/ModernKeePassApp.Test/DatabaseTests.cs
@@ -0,0 +1,64 @@
+using System;
+using Windows.ApplicationModel;
+using Windows.Storage;
+using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
+using ModernKeePass.Common;
+using ModernKeePass.ViewModels;
+using ModernKeePassLib.Keys;
+
+namespace ModernKeePassApp.Test
+{
+ [TestClass]
+ public class DatabaseTests
+ {
+ private readonly DatabaseHelper _database = new DatabaseHelper();
+
+ [TestMethod]
+ public void TestCreate()
+ {
+ Assert.AreEqual(_database.Status, (int) DatabaseHelper.DatabaseStatus.Closed);
+ _database.DatabaseFile = ApplicationData.Current.TemporaryFolder.CreateFileAsync("NewDatabase.kdbx").GetAwaiter().GetResult();
+ Assert.AreEqual(_database.Status, (int)DatabaseHelper.DatabaseStatus.Opening);
+ OpenOrCreateDatabase(true);
+ _database.Close();
+ Assert.AreEqual(_database.Status, (int)DatabaseHelper.DatabaseStatus.Closed);
+ }
+
+ [TestMethod]
+ public void TestOpen()
+ {
+ Assert.AreEqual(_database.Status, (int)DatabaseHelper.DatabaseStatus.Closed);
+ _database.DatabaseFile = Package.Current.InstalledLocation.GetFileAsync(@"Databases\TestDatabase.kdbx").GetAwaiter().GetResult();
+ Assert.AreEqual(_database.Status, (int)DatabaseHelper.DatabaseStatus.Opening);
+ OpenOrCreateDatabase(false);
+ }
+
+ [TestMethod]
+ public void TestSave()
+ {
+ TestOpen();
+ Assert.IsTrue(_database.Save(ApplicationData.Current.TemporaryFolder.CreateFileAsync("SaveDatabase.kdbx").GetAwaiter().GetResult()));
+ _database.Close();
+ Assert.AreEqual(_database.Status, (int)DatabaseHelper.DatabaseStatus.Closed);
+ TestOpen();
+ }
+
+ private void OpenOrCreateDatabase(bool createNew)
+ {
+ _database.Open(null, createNew);
+ Assert.AreEqual(_database.Status, (int)DatabaseHelper.DatabaseStatus.NoCompositeKey);
+ var compositeKey = new CompositeKey();
+ if (!createNew)
+ {
+ _database.Open(compositeKey);
+ Assert.AreEqual(_database.Status, (int)DatabaseHelper.DatabaseStatus.CompositeKeyError);
+ }
+ compositeKey.AddUserKey(new KcpPassword("test"));
+
+ _database.Open(compositeKey, createNew);
+ /*var compositeKey = new CompositeKeyVm(_database);
+ compositeKey.OpenDatabase(createNew);*/
+ Assert.AreEqual(_database.Status, (int)DatabaseHelper.DatabaseStatus.Opened);
+ }
+ }
+}
diff --git a/ModernKeePassApp.Test/Databases/TestDatabase.kdbx b/ModernKeePassApp.Test/Databases/TestDatabase.kdbx
new file mode 100644
index 0000000..da44db5
Binary files /dev/null and b/ModernKeePassApp.Test/Databases/TestDatabase.kdbx differ
diff --git a/ModernKeePassApp.Test/Images/UnitTestLogo.scale-100.png b/ModernKeePassApp.Test/Images/UnitTestLogo.scale-100.png
new file mode 100644
index 0000000..ebd735a
Binary files /dev/null and b/ModernKeePassApp.Test/Images/UnitTestLogo.scale-100.png differ
diff --git a/ModernKeePassApp.Test/Images/UnitTestSmallLogo.scale-100.png b/ModernKeePassApp.Test/Images/UnitTestSmallLogo.scale-100.png
new file mode 100644
index 0000000..92dd105
Binary files /dev/null and b/ModernKeePassApp.Test/Images/UnitTestSmallLogo.scale-100.png differ
diff --git a/ModernKeePassApp.Test/Images/UnitTestSplashScreen.scale-100.png b/ModernKeePassApp.Test/Images/UnitTestSplashScreen.scale-100.png
new file mode 100644
index 0000000..193187f
Binary files /dev/null and b/ModernKeePassApp.Test/Images/UnitTestSplashScreen.scale-100.png differ
diff --git a/ModernKeePassApp.Test/Images/UnitTestStoreLogo.scale-100.png b/ModernKeePassApp.Test/Images/UnitTestStoreLogo.scale-100.png
new file mode 100644
index 0000000..3765186
Binary files /dev/null and b/ModernKeePassApp.Test/Images/UnitTestStoreLogo.scale-100.png differ
diff --git a/ModernKeePassApp.Test/ModernKeePassApp.Test.csproj b/ModernKeePassApp.Test/ModernKeePassApp.Test.csproj
new file mode 100644
index 0000000..e052ff7
--- /dev/null
+++ b/ModernKeePassApp.Test/ModernKeePassApp.Test.csproj
@@ -0,0 +1,191 @@
+
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {7E80F5E7-724A-4668-9333-B10F5D75C6D0}
+ Library
+ Properties
+ ModernKeePassApp.Test
+ ModernKeePassApp.Test
+ en-US
+ 8.1
+ 14
+ 512
+ {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ ModernKeePassApp.Test_TemporaryKey.pfx
+ Never
+ False
+
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE;NETFX_CORE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE;NETFX_CORE
+ prompt
+ 4
+
+
+ true
+ bin\ARM\Debug\
+ DEBUG;TRACE;NETFX_CORE
+ ;2008
+ full
+ ARM
+ false
+ prompt
+ true
+
+
+ bin\ARM\Release\
+ TRACE;NETFX_CORE
+ true
+ ;2008
+ pdbonly
+ ARM
+ false
+ prompt
+ true
+
+
+ true
+ bin\x64\Debug\
+ DEBUG;TRACE;NETFX_CORE
+ ;2008
+ full
+ x64
+ false
+ prompt
+ true
+
+
+ bin\x64\Release\
+ TRACE;NETFX_CORE
+ true
+ ;2008
+ pdbonly
+ x64
+ false
+ prompt
+ true
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE;NETFX_CORE
+ ;2008
+ full
+ x86
+ false
+ prompt
+ true
+
+
+ bin\x86\Release\
+ TRACE;NETFX_CORE
+ true
+ ;2008
+ pdbonly
+ x86
+ false
+ prompt
+ true
+
+
+ True
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+ {A0CFC681-769B-405A-8482-0CDEE595A91F}
+ ModernKeePassApp
+
+
+
+
+ ..\packages\Portable.BouncyCastle.1.8.1.3\lib\netstandard1.0\BouncyCastle.Crypto.dll
+ True
+
+
+ ..\packages\ModernKeePassLib.2.37.7000\lib\netstandard1.2\ModernKeePassLib.dll
+ True
+
+
+ ..\packages\Splat.2.0.0\lib\Portable-Win81+Wpa81\Splat.dll
+ True
+
+
+ ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\win8\System.Runtime.InteropServices.RuntimeInformation.dll
+ True
+
+
+ ..\packages\Validation.2.4.18\lib\portable-net45+win8+wp8+wpa81\Validation.dll
+ True
+
+
+
+ 14.0
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
\ No newline at end of file
diff --git a/ModernKeePassApp.Test/ModernKeePassApp.Test_TemporaryKey.pfx b/ModernKeePassApp.Test/ModernKeePassApp.Test_TemporaryKey.pfx
new file mode 100644
index 0000000..78d6a18
Binary files /dev/null and b/ModernKeePassApp.Test/ModernKeePassApp.Test_TemporaryKey.pfx differ
diff --git a/ModernKeePassApp.Test/Package.appxmanifest b/ModernKeePassApp.Test/Package.appxmanifest
new file mode 100644
index 0000000..a15633e
--- /dev/null
+++ b/ModernKeePassApp.Test/Package.appxmanifest
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+ ModernKeePassApp.Test
+ GBE
+ Images\UnitTestStoreLogo.png
+ ModernKeePassApp.Test
+
+
+
+ 6.3.0
+ 6.3.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ModernKeePassApp.Test/Properties/AssemblyInfo.cs b/ModernKeePassApp.Test/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9678477
--- /dev/null
+++ b/ModernKeePassApp.Test/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ModernKeePassApp.Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ModernKeePassApp.Test")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ModernKeePassApp.Test/packages.config b/ModernKeePassApp.Test/packages.config
new file mode 100644
index 0000000..7e8fa7e
--- /dev/null
+++ b/ModernKeePassApp.Test/packages.config
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file