diff --git a/src/KeePassLib2Android/Keys/KcpKeyFile.cs b/src/KeePassLib2Android/Keys/KcpKeyFile.cs index 39810ff3..8da75c49 100644 --- a/src/KeePassLib2Android/Keys/KcpKeyFile.cs +++ b/src/KeePassLib2Android/Keys/KcpKeyFile.cs @@ -43,6 +43,7 @@ namespace KeePassLib.Keys { private IOConnectionInfo m_ioc; private ProtectedBinary m_pbKeyData; + private ProtectedBinary m_pbFileData; /// /// Path to the key file. @@ -67,6 +68,11 @@ namespace KeePassLib.Keys get { return m_ioc; } } + public ProtectedBinary RawFileData + { + get { return m_pbFileData; } + } + public KcpKeyFile(string strKeyFile) { Construct(IOConnectionInfo.FromPath(strKeyFile), false); @@ -95,6 +101,7 @@ namespace KeePassLib.Keys private void Construct(byte[] pbFileData, IOConnectionInfo iocKeyFile, bool bThrowIfDbFile) { if (pbFileData == null) throw new Java.IO.FileNotFoundException(); + m_pbFileData = new ProtectedBinary(true, pbFileData); if (bThrowIfDbFile && (pbFileData.Length >= 8)) { diff --git a/src/KeePassLib2Android/Serialization/IOConnection.cs b/src/KeePassLib2Android/Serialization/IOConnection.cs index e02452be..aff3ad2d 100644 --- a/src/KeePassLib2Android/Serialization/IOConnection.cs +++ b/src/KeePassLib2Android/Serialization/IOConnection.cs @@ -647,14 +647,17 @@ namespace KeePassLib.Serialization try { sIn = IOConnection.OpenRead(ioc); - if(sIn == null) return null; + if (sIn == null) return null; ms = new MemoryStream(); MemUtil.CopyStream(sIn, ms); return ms.ToArray(); } - catch(Exception) { } + catch (Exception e) + { + Kp2aLog.Log("error opening file: " + e); + } finally { if(sIn != null) sIn.Close(); diff --git a/src/Kp2aBusinessLogic/database/KdbDatabaseLoader.cs b/src/Kp2aBusinessLogic/database/KdbDatabaseLoader.cs index 7f5c68a0..15831a9a 100644 --- a/src/Kp2aBusinessLogic/database/KdbDatabaseLoader.cs +++ b/src/Kp2aBusinessLogic/database/KdbDatabaseLoader.cs @@ -36,25 +36,21 @@ namespace keepass2android } KcpKeyFile passwordKeyfile = (KcpKeyFile)key.GetUserKey(typeof(KcpKeyFile)); - string keyfile = ""; + MemoryStream keyfileStream = null; if (passwordKeyfile != null) { - keyfile = passwordKeyfile.Path; + keyfileStream = new MemoryStream(passwordKeyfile.RawFileData.ReadData()); } try { - var dbv3 = importer.OpenDatabase(hashingStream, password, keyfile); + var dbv3 = importer.OpenDatabase(hashingStream, password, keyfileStream); db.Name = dbv3.Name; db.RootGroup = ConvertGroup(dbv3.RootGroup); } - catch (InvalidPasswordException e) { - - return; - } catch (Java.IO.FileNotFoundException e) { throw new FileNotFoundException( diff --git a/src/Kp2aUnitTests/Kp2aUnitTests.csproj b/src/Kp2aUnitTests/Kp2aUnitTests.csproj index 90ff6b5d..c4ff09f9 100644 --- a/src/Kp2aUnitTests/Kp2aUnitTests.csproj +++ b/src/Kp2aUnitTests/Kp2aUnitTests.csproj @@ -86,7 +86,6 @@ - diff --git a/src/Kp2aUnitTests/MainActivity.cs b/src/Kp2aUnitTests/MainActivity.cs index 71c1c621..62f0cc66 100644 --- a/src/Kp2aUnitTests/MainActivity.cs +++ b/src/Kp2aUnitTests/MainActivity.cs @@ -19,7 +19,8 @@ namespace Kp2aUnitTests TestRunner runner = new TestRunner(); // Run all tests from this assembly //runner.AddTests(Assembly.GetExecutingAssembly()); - runner.AddTests(new List { typeof(TestIntentsAndBundles) }); + //runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadKdb1WithKeyfileByDirectCall")); + runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadKdb1WithKeyfileOnly")); //runner.AddTests(new List { typeof(TestSynchronizeCachedDatabase)}); //runner.AddTests(typeof(TestLoadDb).GetMethod("LoadErrorWithCertificateTrustFailure")); //runner.AddTests(typeof(TestLoadDb).GetMethod("LoadWithAcceptedCertificateTrustFailure")); diff --git a/src/Kp2aUnitTests/TestLoadDb.cs b/src/Kp2aUnitTests/TestLoadDb.cs index 24d800bc..ecf1553b 100644 --- a/src/Kp2aUnitTests/TestLoadDb.cs +++ b/src/Kp2aUnitTests/TestLoadDb.cs @@ -2,11 +2,15 @@ using System.IO; using System.Linq; using Android.App; +using Com.Keepassdroid.Database.Load; +using Java.IO; using KeePassLib; +using KeePassLib.Keys; using KeePassLib.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; using keepass2android; using keepass2android.Io; +using FileNotFoundException = System.IO.FileNotFoundException; namespace Kp2aUnitTests { @@ -72,6 +76,56 @@ namespace Kp2aUnitTests Assert.IsFalse(e.Binaries.Any()); } + [TestMethod] + public void TestLoadKdb1WithKeyfileByDirectCall() + { + ImporterV3 importer = new ImporterV3(); + + try + { + FileStream dbStream = new FileStream(TestDbDirectory+"withkeyfile_nopwd.kdb", FileMode.Open); + FileStream keyfileStream = new FileStream(TestDbDirectory + "withkeyfile.key", FileMode.Open); + /* + for (int i = 0; i < 10; i++) + { + int b = keyfileStream.ReadByte(); + Kp2aLog.Log(i+": " + b); + } + keyfileStream.Close(); + Kp2aLog.Log("stream 2"); + var keyfileStream2 = new MemoryStream(new KcpKeyFile(TestDbDirectory + "withkeyfile.key").RawFileData.ReadData()); + for (int i = 0; i < 10; i++) + { + int b = keyfileStream2.ReadByte(); + Kp2aLog.Log(i + ": " + b); + }*/ + importer.OpenDatabase(dbStream, "", keyfileStream); + } + catch (Exception e) + { + Kp2aLog.Log(e.ToString()); + Assert.Fail("exception occured: " + e); + } + + } + + [TestMethod] + public void TestLoadKdb1WithKeyfile() + { + var app = PerformLoad("withkeyfile.kdb", "test", TestDbDirectory + "withkeyfile.key"); + + } + + + [TestMethod] + public void TestLoadKdb1WithKeyfileOnly() + { + var app = PerformLoad("withkeyfile_nopwd.kdb", "", TestDbDirectory + "withkeyfile.key"); + + + + } + [TestMethod] public void TestLoadWithKeyfileOnly() { diff --git a/src/java/JavaFileStorage/bin/javafilestorage.jar b/src/java/JavaFileStorage/bin/javafilestorage.jar index 7d103bf2..ad0f8e83 100644 Binary files a/src/java/JavaFileStorage/bin/javafilestorage.jar and b/src/java/JavaFileStorage/bin/javafilestorage.jar differ diff --git a/src/java/KP2AKdbLibrary/bin/kp2akdblibrary.jar b/src/java/KP2AKdbLibrary/bin/kp2akdblibrary.jar index 35d084ab..a87e7d7e 100644 Binary files a/src/java/KP2AKdbLibrary/bin/kp2akdblibrary.jar and b/src/java/KP2AKdbLibrary/bin/kp2akdblibrary.jar differ diff --git a/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidDBSignatureException.java b/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidDBSignatureException.java index d2ac4aea..5ae3d1c3 100644 --- a/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidDBSignatureException.java +++ b/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidDBSignatureException.java @@ -26,7 +26,7 @@ public class InvalidDBSignatureException extends InvalidDBException { private static final long serialVersionUID = -5358923878743513758L; public InvalidDBSignatureException() { - super(); + super("Invalid database signature"); } } diff --git a/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidKeyFileException.java b/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidKeyFileException.java index 11cd1d8b..38bf7c2f 100644 --- a/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidKeyFileException.java +++ b/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidKeyFileException.java @@ -25,6 +25,10 @@ public class InvalidKeyFileException extends InvalidDBException { private static final long serialVersionUID = 5540694419562294464L; public InvalidKeyFileException() { - super(); + super("invalid key file!"); + } + + public InvalidKeyFileException(String msg) { + super(msg); } } diff --git a/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidPasswordException.java b/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidPasswordException.java index 69096e53..234e4da4 100644 --- a/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidPasswordException.java +++ b/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/InvalidPasswordException.java @@ -31,6 +31,6 @@ public class InvalidPasswordException extends InvalidDBException { } public InvalidPasswordException() { - super(); + super("Invalid key!"); } } diff --git a/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/KeyFileEmptyException.java b/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/KeyFileEmptyException.java index 21a7a101..502e3da0 100644 --- a/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/KeyFileEmptyException.java +++ b/src/java/KP2AKdbLibrary/src/com/keepassdroid/database/exception/KeyFileEmptyException.java @@ -25,6 +25,6 @@ public class KeyFileEmptyException extends InvalidKeyFileException { private static final long serialVersionUID = -1630780661204212325L; public KeyFileEmptyException() { - super(); + super("key file is empty!"); } } diff --git a/src/java/Keepass2AndroidPluginSDK/bin/keepass2androidpluginsdk.jar b/src/java/Keepass2AndroidPluginSDK/bin/keepass2androidpluginsdk.jar index e6e33352..d0f80bff 100644 Binary files a/src/java/Keepass2AndroidPluginSDK/bin/keepass2androidpluginsdk.jar and b/src/java/Keepass2AndroidPluginSDK/bin/keepass2androidpluginsdk.jar differ