diff --git a/ModernKeePass/Actions/NavigateToUrlAction.cs b/ModernKeePass/Actions/NavigateToUrlAction.cs
new file mode 100644
index 0000000..9c680f1
--- /dev/null
+++ b/ModernKeePass/Actions/NavigateToUrlAction.cs
@@ -0,0 +1,33 @@
+using System;
+using Windows.UI.Xaml;
+using Microsoft.Xaml.Interactivity;
+using ModernKeePass.Common;
+
+namespace ModernKeePass.Actions
+{
+ public class NavigateToUrlAction : DependencyObject, IAction
+ {
+ public string Url
+ {
+ get { return (string)GetValue(UrlProperty); }
+ set { SetValue(UrlProperty, value); }
+ }
+
+ public static readonly DependencyProperty UrlProperty =
+ DependencyProperty.Register("Url", typeof(string), typeof(NavigateToUrlAction), new PropertyMetadata(string.Empty));
+
+ public object Execute(object sender, object parameter)
+ {
+ try
+ {
+ var uri = new Uri(Url);
+ return Windows.System.Launcher.LaunchUriAsync(uri).GetAwaiter().GetResult();
+ }
+ catch (Exception ex)
+ {
+ MessageDialogHelper.ShowErrorDialog(ex);
+ return false;
+ }
+ }
+ }
+}
diff --git a/ModernKeePass/ModernKeePassApp.csproj b/ModernKeePass/ModernKeePassApp.csproj
index 512239c..71d871e 100644
--- a/ModernKeePass/ModernKeePassApp.csproj
+++ b/ModernKeePass/ModernKeePassApp.csproj
@@ -109,6 +109,7 @@
+
App.xaml
@@ -339,6 +340,10 @@
..\packages\Microsoft.Toolkit.Uwp.Notifications.2.0.0\lib\dotnet\Microsoft.Toolkit.Uwp.Notifications.dll
True
+
+ ..\packages\ModernKeePassLib.2.37.8000\lib\netstandard1.2\ModernKeePassLib.dll
+ True
+
..\packages\Splat.2.0.0\lib\Portable-Win81+Wpa81\Splat.dll
True
@@ -431,12 +436,6 @@
-
-
- {2e710089-9559-4967-846c-e763dd1f3acb}
- ModernKeePassLib
-
-
12.0
diff --git a/ModernKeePass/Strings/en-US/Resources.resw b/ModernKeePass/Strings/en-US/Resources.resw
index 3428892..c7e4303 100644
--- a/ModernKeePass/Strings/en-US/Resources.resw
+++ b/ModernKeePass/Strings/en-US/Resources.resw
@@ -193,7 +193,7 @@
Copy password
- Copy URL
+ Navigate to URL
User name or login
diff --git a/ModernKeePass/Strings/fr-FR/Resources.resw b/ModernKeePass/Strings/fr-FR/Resources.resw
index 73a9d21..13be3e5 100644
--- a/ModernKeePass/Strings/fr-FR/Resources.resw
+++ b/ModernKeePass/Strings/fr-FR/Resources.resw
@@ -193,7 +193,7 @@
Copier le mot de passe
- Copier l'URL
+ Naviguer vers l'URL
Nom d'utilisateur ou login
diff --git a/ModernKeePass/Views/EntryDetailPage.xaml b/ModernKeePass/Views/EntryDetailPage.xaml
index 9b9786d..279c82c 100644
--- a/ModernKeePass/Views/EntryDetailPage.xaml
+++ b/ModernKeePass/Views/EntryDetailPage.xaml
@@ -458,7 +458,13 @@
-
+
+
+
+
+
+
+
diff --git a/ModernKeePass/Views/EntryDetailPage.xaml.cs b/ModernKeePass/Views/EntryDetailPage.xaml.cs
index a688d0a..dd5db2a 100644
--- a/ModernKeePass/Views/EntryDetailPage.xaml.cs
+++ b/ModernKeePass/Views/EntryDetailPage.xaml.cs
@@ -92,20 +92,7 @@ namespace ModernKeePass.Views
ToastNotificationHelper.ShowMovedToast(Model, resource.GetResourceValue("EntityRestoredTitle"), resource.GetResourceValue("EntryRestored"));
if (Frame.CanGoBack) Frame.GoBack();
}
-
- private async void UrlButton_Click(object sender, RoutedEventArgs e)
- {
- try
- {
- var uri = new Uri(UrlTextBox.Text);
- await Windows.System.Launcher.LaunchUriAsync(uri);
- }
- catch (Exception ex)
- {
- MessageDialogHelper.ShowErrorDialog(ex);
- }
- }
-
+
private void EntryDetailPage_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
VisualStateManager.GoToState(this, e.NewSize.Width < 700 ? "Small" : "Large", true);
diff --git a/ModernKeePass/Views/GroupDetailPage.xaml b/ModernKeePass/Views/GroupDetailPage.xaml
index 71d775f..621ce72 100644
--- a/ModernKeePass/Views/GroupDetailPage.xaml
+++ b/ModernKeePass/Views/GroupDetailPage.xaml
@@ -255,7 +255,7 @@
-
+
diff --git a/ModernKeePass/Views/UserControls/CompositeKeyUserControl.xaml b/ModernKeePass/Views/UserControls/CompositeKeyUserControl.xaml
index c92f476..2dccdf4 100644
--- a/ModernKeePass/Views/UserControls/CompositeKeyUserControl.xaml
+++ b/ModernKeePass/Views/UserControls/CompositeKeyUserControl.xaml
@@ -11,7 +11,6 @@
xmlns:viewModels="using:ModernKeePass.ViewModels"
mc:Ignorable="d" >
-
@@ -31,7 +30,6 @@
-
@@ -56,9 +54,7 @@
-
-
-
-
+
+
diff --git a/ModernKeePass/appMetadata/en-us/baselisting/releaseNotes.txt b/ModernKeePass/appMetadata/en-us/baselisting/releaseNotes.txt
index d809ddb..1e13c6b 100644
--- a/ModernKeePass/appMetadata/en-us/baselisting/releaseNotes.txt
+++ b/ModernKeePass/appMetadata/en-us/baselisting/releaseNotes.txt
@@ -1,2 +1,2 @@
-Error when opening file from Explorer corrected
-Filter entries reverted to search entries because of regressions
\ No newline at end of file
+New inline menu on Entries to quickly copy login, password, and navigate to URL
+Design changes
\ No newline at end of file
diff --git a/ModernKeePass/appMetadata/fr-fr/baselisting/releaseNotes.txt b/ModernKeePass/appMetadata/fr-fr/baselisting/releaseNotes.txt
index 164da2a..11e5b15 100644
--- a/ModernKeePass/appMetadata/fr-fr/baselisting/releaseNotes.txt
+++ b/ModernKeePass/appMetadata/fr-fr/baselisting/releaseNotes.txt
@@ -1,2 +1,2 @@
-Correction d'un bug lors de l'ouverture d'un fichier par Explorer
-Rétablissement de la recherche d'entrées à la place du filtre à cause de régressions multiples
\ No newline at end of file
+Ajout d'un menu intégré à la liste d'entrées afin de copier rapidement le login, mot de passe et de naviguer vers l'URL
+Quelques changements de design
\ No newline at end of file
diff --git a/ModernKeePassLib/Cryptography/ProtectedData.cs b/ModernKeePassLib/Cryptography/ProtectedData.cs
index ea2aefd..c25562d 100644
--- a/ModernKeePassLib/Cryptography/ProtectedData.cs
+++ b/ModernKeePassLib/Cryptography/ProtectedData.cs
@@ -1,62 +1,10 @@
using System;
-using System.Runtime.InteropServices.WindowsRuntime;
-using System.Threading.Tasks;
-using Windows.Security.Cryptography.DataProtection;
-using Windows.Storage.Streams;
using ModernKeePassLib.Native;
namespace ModernKeePassLib.Cryptography
{
public static class ProtectedData
{
- public static async Task ProtectStream(byte[] buffer, IOutputStream stream)
- {
- //instantiate a DataProtectionProvider for decryption
- var dpp = new DataProtectionProvider("LOCAL=user");
-
- //Open a stream to load data in
- using (var inputStream = new InMemoryRandomAccessStream())
- {
- //cteate data writer to write data to the input stream
- using (var dw = new DataWriter(inputStream))
- {
- //write data to the stream
- dw.WriteBuffer(buffer.AsBuffer());
- await dw.StoreAsync();
-
- //encrypt the intput stream into the file stream
- await dpp.ProtectStreamAsync(inputStream.GetInputStreamAt(0),
- stream);
- }
- }
- }
-
- public static async Task UnprotectStream(IInputStream stream)
- {
- //instantiate a DataProtectionProvider for decryption
- var dpp = new DataProtectionProvider();
-
- //create a stream to decrypte the data to
- using (var outputStream = new InMemoryRandomAccessStream())
- {
- //decrypt the data
- await dpp.UnprotectStreamAsync(stream, outputStream);
-
- //fill the data reader with the content of the outputStream,
- //but from position 0
- using (var dr = new DataReader(outputStream.GetInputStreamAt(0)))
- {
- //load data from the stream to the dataReader
- await dr.LoadAsync((uint)outputStream.Size);
-
- //load the data from the datareader into a buffer
- IBuffer data = dr.ReadBuffer((uint)outputStream.Size);
-
- return data.ToArray();
- }
- }
- }
-
public static byte[] Unprotect(byte[] pbEnc, byte[] mPbOptEnt, DataProtectionScope currentUser)
{
throw new NotImplementedException();
diff --git a/ModernKeePassLib/Keys/KcpUserAccount.cs b/ModernKeePassLib/Keys/KcpUserAccount.cs
index e63117e..c97df53 100644
--- a/ModernKeePassLib/Keys/KcpUserAccount.cs
+++ b/ModernKeePassLib/Keys/KcpUserAccount.cs
@@ -20,7 +20,6 @@
using System;
using System.Diagnostics;
using System.IO;
-using System.Runtime.InteropServices.WindowsRuntime;
using System.Security;
#if ModernKeePassLib
@@ -36,136 +35,132 @@ using ModernKeePassLib.Utility;
namespace ModernKeePassLib.Keys
{
- ///
- /// A user key depending on the currently logged on Windows user account.
- ///
- public sealed class KcpUserAccount : IUserKey
- {
- private ProtectedBinary m_pbKeyData = null;
+ ///
+ /// A user key depending on the currently logged on Windows user account.
+ ///
+ public sealed class KcpUserAccount : IUserKey
+ {
+ private ProtectedBinary m_pbKeyData = null;
- // Constant initialization vector (unique for KeePass)
- private static readonly byte[] m_pbEntropy = new byte[] {
- 0xDE, 0x13, 0x5B, 0x5F, 0x18, 0xA3, 0x46, 0x70,
- 0xB2, 0x57, 0x24, 0x29, 0x69, 0x88, 0x98, 0xE6
- };
+ // Constant initialization vector (unique for KeePass)
+ private static readonly byte[] m_pbEntropy = new byte[] {
+ 0xDE, 0x13, 0x5B, 0x5F, 0x18, 0xA3, 0x46, 0x70,
+ 0xB2, 0x57, 0x24, 0x29, 0x69, 0x88, 0x98, 0xE6
+ };
- private const string UserKeyFileName = "ProtectedUserKey.bin";
+ private const string UserKeyFileName = "ProtectedUserKey.bin";
- ///
- /// Get key data. Querying this property is fast (it returns a
- /// reference to a cached ProtectedBinary object).
- /// If no key data is available, null is returned.
- ///
- public ProtectedBinary KeyData
- {
- get { return m_pbKeyData; }
- }
+ ///
+ /// Get key data. Querying this property is fast (it returns a
+ /// reference to a cached ProtectedBinary object).
+ /// If no key data is available, null is returned.
+ ///
+ public ProtectedBinary KeyData
+ {
+ get { return m_pbKeyData; }
+ }
- ///
- /// Construct a user account key.
- ///
- public KcpUserAccount()
- {
- // Test if ProtectedData is supported -- throws an exception
- // when running on an old system (Windows 98 / ME).
- /*byte[] pbDummyData = new byte[128];
- ProtectedData.Protect(pbDummyData, m_pbEntropy,
- DataProtectionScope.CurrentUser);*/
+ ///
+ /// Construct a user account key.
+ ///
+ public KcpUserAccount()
+ {
+ // Test if ProtectedData is supported -- throws an exception
+ // when running on an old system (Windows 98 / ME).
+ byte[] pbDummyData = new byte[128];
+ ProtectedData.Protect(pbDummyData, m_pbEntropy,
+ DataProtectionScope.CurrentUser);
- byte[] pbKey = LoadUserKey(false);
- if(pbKey == null) pbKey = CreateUserKey();
- if(pbKey == null) // Should never happen
- {
- Debug.Assert(false);
- throw new SecurityException(KLRes.UserAccountKeyError);
- }
+ byte[] pbKey = LoadUserKey(false);
+ if (pbKey == null) pbKey = CreateUserKey();
+ if (pbKey == null) // Should never happen
+ {
+ Debug.Assert(false);
+ throw new SecurityException(KLRes.UserAccountKeyError);
+ }
- m_pbKeyData = new ProtectedBinary(true, pbKey);
- MemUtil.ZeroByteArray(pbKey);
- }
+ m_pbKeyData = new ProtectedBinary(true, pbKey);
+ MemUtil.ZeroByteArray(pbKey);
+ }
- // public void Clear()
- // {
- // m_pbKeyData = null;
- // }
+ // public void Clear()
+ // {
+ // m_pbKeyData = null;
+ // }
- private static string GetUserKeyFilePath(bool bCreate)
- {
+ private static string GetUserKeyFilePath(bool bCreate)
+ {
#if ModernKeePassLib
- string strUserDir = Windows.Storage.ApplicationData.Current.RoamingFolder.Path;
+ string strUserDir = Windows.Storage.ApplicationData.Current.RoamingFolder.Path;
#else
string strUserDir = Environment.GetFolderPath(
Environment.SpecialFolder.ApplicationData);
#endif
- strUserDir = UrlUtil.EnsureTerminatingSeparator(strUserDir, false);
-
+ strUserDir = UrlUtil.EnsureTerminatingSeparator(strUserDir, false);
+ strUserDir += PwDefs.ShortProductName;
#if !ModernKeePassLib
- strUserDir += PwDefs.ShortProductName;
if(bCreate && !Directory.Exists(strUserDir))
Directory.CreateDirectory(strUserDir);
#endif
- strUserDir = UrlUtil.EnsureTerminatingSeparator(strUserDir, false);
- return (strUserDir + UserKeyFileName);
- }
+ strUserDir = UrlUtil.EnsureTerminatingSeparator(strUserDir, false);
+ return (strUserDir + UserKeyFileName);
+ }
- private static byte[] LoadUserKey(bool bThrow)
- {
- byte[] pbKey = null;
+ private static byte[] LoadUserKey(bool bThrow)
+ {
+ byte[] pbKey = null;
#if !KeePassLibSD
- try
- {
- string strFilePath = GetUserKeyFilePath(false);
+ try
+ {
+ string strFilePath = GetUserKeyFilePath(false);
#if ModernKeePassLib
- var file = StorageFile.GetFileFromPathAsync(strFilePath).GetAwaiter().GetResult();
- using (var fileStream = file.OpenReadAsync().GetAwaiter().GetResult())
- {
- pbKey = ProtectedData.UnprotectStream(fileStream).GetAwaiter().GetResult();
- }
+ var fileStream = StorageFile.GetFileFromPathAsync(strFilePath).GetAwaiter().GetResult().OpenStreamForReadAsync().GetAwaiter().GetResult();
+ var pbProtectedKey = new byte[(int)fileStream.Length];
+ fileStream.Read(pbProtectedKey, 0, (int)fileStream.Length);
+ fileStream.Dispose();
#else
byte[] pbProtectedKey = File.ReadAllBytes(strFilePath);
+#endif
pbKey = ProtectedData.Unprotect(pbProtectedKey, m_pbEntropy,
- DataProtectionScope.CurrentUser);
-#endif
- }
- catch(Exception)
- {
- if(bThrow) throw;
- pbKey = null;
- }
+ DataProtectionScope.CurrentUser);
+ }
+ catch (Exception)
+ {
+ if (bThrow) throw;
+ pbKey = null;
+ }
#endif
- return pbKey;
- }
+ return pbKey;
+ }
- private static byte[] CreateUserKey()
- {
+ private static byte[] CreateUserKey()
+ {
#if KeePassLibSD
return null;
#else
- string strFilePath = GetUserKeyFilePath(true);
+ string strFilePath = GetUserKeyFilePath(true);
- byte[] pbRandomKey = CryptoRandom.Instance.GetRandomBytes(64);
+ byte[] pbRandomKey = CryptoRandom.Instance.GetRandomBytes(64);
+ byte[] pbProtectedKey = ProtectedData.Protect(pbRandomKey,
+ m_pbEntropy, DataProtectionScope.CurrentUser);
#if ModernKeePassLib
- var file = ApplicationData.Current.RoamingFolder.CreateFileAsync(UserKeyFileName, CreationCollisionOption.ReplaceExisting).GetAwaiter().GetResult();
- using (var fileStream = file.OpenAsync(FileAccessMode.ReadWrite).GetAwaiter().GetResult())
- {
- ProtectedData.ProtectStream(pbRandomKey, fileStream).GetAwaiter().GetResult();
- }
+ var fileStream = StorageFile.GetFileFromPathAsync(strFilePath).GetAwaiter().GetResult().OpenStreamForWriteAsync().GetAwaiter().GetResult();
+ fileStream.Write(pbProtectedKey, 0, (int)fileStream.Length);
+ fileStream.Dispose();
#else
- byte[] pbProtectedKey = ProtectedData.Protect(pbRandomKey,
- m_pbEntropy, DataProtectionScope.CurrentUser);
File.WriteAllBytes(strFilePath, pbProtectedKey);
#endif
byte[] pbKey = LoadUserKey(true);
- Debug.Assert(MemUtil.ArraysEqual(pbKey, pbRandomKey));
+ Debug.Assert(MemUtil.ArraysEqual(pbKey, pbRandomKey));
- MemUtil.ZeroByteArray(pbRandomKey);
- return pbKey;
+ MemUtil.ZeroByteArray(pbRandomKey);
+ return pbKey;
#endif
- }
- }
+ }
+ }
}
diff --git a/ModernKeePassLib/ModernKeePassLib.nuspec b/ModernKeePassLib/ModernKeePassLib.nuspec
index 4968abc..cba7807 100644
--- a/ModernKeePassLib/ModernKeePassLib.nuspec
+++ b/ModernKeePassLib/ModernKeePassLib.nuspec
@@ -2,7 +2,7 @@
ModernKeePassLib
- 2.37.9000
+ 2.37.8000
ModernKeePassLib
Geoffroy Bonneville
Geoffroy Bonneville
@@ -10,7 +10,7 @@
https://github.com/wismna/ModernKeePass
false
Portable KeePass Password Management Library that targets .Net Standard and WinRT. Allows reading, editing and writing to KeePass 2.x databases.
- Implements Windows User Accounts
+
Copyright © 2017 Geoffroy Bonneville
KeePass KeePassLib Portable PCL NetStandard