mirror of
https://github.com/moparisthebest/keepass2android
synced 2024-11-28 20:12:21 -05:00
Introduced IDatabaseLoader
(kdb not yet working)
This commit is contained in:
parent
ee4d40eb32
commit
6e0645559d
13
src/KeePassLib2Android/IDatabaseLoader.cs
Normal file
13
src/KeePassLib2Android/IDatabaseLoader.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System.IO;
|
||||
using KeePassLib.Interfaces;
|
||||
using KeePassLib.Keys;
|
||||
|
||||
namespace KeePassLib
|
||||
{
|
||||
public interface IDatabaseLoader
|
||||
{
|
||||
void PopulateDatabaseFromStream(PwDatabase db, CompositeKey key, Stream s, IStatusLogger slLogger);
|
||||
|
||||
byte[] HashOfLastStream { get; }
|
||||
}
|
||||
}
|
@ -20,7 +20,7 @@
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>False</Optimize>
|
||||
<OutputPath>bin\Debug</OutputPath>
|
||||
<DefineConstants>DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;INCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE</DefineConstants>
|
||||
<DefineConstants>DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;EXCLUDE_FILECHOOSER;EXCLUDE_JAVAFILESTORAGE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<ConsolePause>False</ConsolePause>
|
||||
@ -58,6 +58,7 @@
|
||||
<Reference Include="Mono.Security" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="IDatabaseLoader.cs" />
|
||||
<Compile Include="Kp2aLog.cs" />
|
||||
<Compile Include="Resources\Resource.designer.cs" />
|
||||
<Compile Include="Resources\KLRes.Generated.cs" />
|
||||
@ -153,11 +154,11 @@
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\values\Strings.xml" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\kp2akeytransform\kp2akeytransform.csproj" Condition="!$(DefineConstants.Contains('EXCLUDE_KEYTRANSFORM'))">
|
||||
<Project>{A57B3ACE-5634-469A-88C4-858BB409F356}</Project>
|
||||
<Name>kp2akeytransform</Name>
|
||||
<ProjectReference Include="..\KP2AKdbLibraryBinding\KP2AKdbLibraryBinding.csproj">
|
||||
<Project>{70d3844a-d9fa-4a64-b205-a84c6a822196}</Project>
|
||||
<Name>KP2AKdbLibraryBinding</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
|
||||
</Project>
|
@ -3,6 +3,7 @@ using Android.App;
|
||||
using System.IO;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using KeePassLib;
|
||||
using KeePassLib.Keys;
|
||||
using KeePassLib.Serialization;
|
||||
using keepass2android.Io;
|
||||
@ -23,7 +24,7 @@ namespace keepass2android
|
||||
/// <summary>
|
||||
/// Loads the specified data as the currently open database, as unlocked.
|
||||
/// </summary>
|
||||
void LoadDatabase(IOConnectionInfo ioConnectionInfo, MemoryStream memoryStream, CompositeKey compKey, ProgressDialogStatusLogger statusLogger);
|
||||
void LoadDatabase(IOConnectionInfo ioConnectionInfo, MemoryStream memoryStream, CompositeKey compKey, ProgressDialogStatusLogger statusLogger, IDatabaseLoader databaseLoader);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the current database
|
||||
|
@ -93,34 +93,15 @@ namespace keepass2android
|
||||
/// <summary>
|
||||
/// Do not call this method directly. Call App.Kp2a.LoadDatabase instead.
|
||||
/// </summary>
|
||||
public void LoadData(IKp2aApp app, IOConnectionInfo iocInfo, MemoryStream databaseData, CompositeKey compositeKey, ProgressDialogStatusLogger status)
|
||||
public void LoadData(IKp2aApp app, IOConnectionInfo iocInfo, MemoryStream databaseData, CompositeKey compositeKey, ProgressDialogStatusLogger status, IDatabaseLoader databaseLoader)
|
||||
{
|
||||
PwDatabase pwDatabase = new PwDatabase();
|
||||
|
||||
IFileStorage fileStorage = _app.GetFileStorage(iocInfo);
|
||||
var filename = fileStorage.GetFilenameWithoutPathAndExt(iocInfo);
|
||||
try
|
||||
{
|
||||
var fileVersion = _app.GetFileStorage(iocInfo).GetCurrentFileVersionFast(iocInfo);
|
||||
pwDatabase.Open(databaseData ?? fileStorage.OpenFileForRead(iocInfo), filename, iocInfo, compositeKey, status);
|
||||
LastFileVersion = fileVersion;
|
||||
}
|
||||
catch (InvalidCompositeKeyException)
|
||||
{
|
||||
KcpPassword passwordKey = (KcpPassword)compositeKey.GetUserKey(typeof(KcpPassword));
|
||||
|
||||
if ((passwordKey != null) && (passwordKey.Password.ReadString() == "") && (compositeKey.UserKeyCount > 1))
|
||||
{
|
||||
//if we don't get a password, we don't know whether this means "empty password" or "no password"
|
||||
//retry without password:
|
||||
compositeKey.RemoveUserKey(compositeKey.GetUserKey(typeof (KcpPassword)));
|
||||
var fileVersion = _app.GetFileStorage(iocInfo).GetCurrentFileVersionFast(iocInfo);
|
||||
//don't reuse the memory stream databaseData: it's already closed.
|
||||
//We could try to avoid reading the file again here, but probably the case is rare enough so this is ok.
|
||||
pwDatabase.Open(fileStorage.OpenFileForRead(iocInfo), filename, iocInfo, compositeKey, status);
|
||||
LastFileVersion = fileVersion; }
|
||||
else throw;
|
||||
}
|
||||
Stream s = databaseData ?? fileStorage.OpenFileForRead(iocInfo);
|
||||
var fileVersion = _app.GetFileStorage(iocInfo).GetCurrentFileVersionFast(iocInfo);
|
||||
PopulateDatabaseFromStream(pwDatabase, s, iocInfo, compositeKey, status, databaseLoader);
|
||||
LastFileVersion = fileVersion;
|
||||
|
||||
status.UpdateSubMessage("");
|
||||
|
||||
@ -133,6 +114,13 @@ namespace keepass2android
|
||||
SearchHelper = new SearchDbHelper(app);
|
||||
}
|
||||
|
||||
protected virtual void PopulateDatabaseFromStream(PwDatabase pwDatabase, Stream s, IOConnectionInfo iocInfo, CompositeKey compositeKey, ProgressDialogStatusLogger status, IDatabaseLoader databaseLoader)
|
||||
{
|
||||
IFileStorage fileStorage = _app.GetFileStorage(iocInfo);
|
||||
var filename = fileStorage.GetFilenameWithoutPathAndExt(iocInfo);
|
||||
pwDatabase.Open(s, filename, iocInfo, compositeKey, status, databaseLoader);
|
||||
}
|
||||
|
||||
|
||||
public PwGroup SearchForText(String str) {
|
||||
PwGroup group = SearchHelper.SearchForText(this, str);
|
||||
@ -162,7 +150,7 @@ namespace keepass2android
|
||||
}
|
||||
|
||||
|
||||
public void SaveData(Context ctx) {
|
||||
public virtual void SaveData(Context ctx) {
|
||||
|
||||
KpDatabase.UseFileTransactions = _app.GetBooleanPreference(PreferenceKey.UseFileTransactions);
|
||||
using (IWriteTransaction trans = _app.GetFileStorage(Ioc).OpenWriteTransaction(Ioc, KpDatabase.UseFileTransactions))
|
||||
|
76
src/Kp2aBusinessLogic/database/KdbDatabaseLoader.cs
Normal file
76
src/Kp2aBusinessLogic/database/KdbDatabaseLoader.cs
Normal file
@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using Android.Content;
|
||||
using Com.Keepassdroid.Database;
|
||||
using Com.Keepassdroid.Database.Exception;
|
||||
using Java.Lang;
|
||||
using KeePassLib;
|
||||
using KeePassLib.Cryptography;
|
||||
using KeePassLib.Cryptography.Cipher;
|
||||
using KeePassLib.Interfaces;
|
||||
using KeePassLib.Keys;
|
||||
using Exception = System.Exception;
|
||||
|
||||
namespace keepass2android
|
||||
{
|
||||
class KdbDatabaseLoader: IDatabaseLoader
|
||||
{
|
||||
private Context _ctx;
|
||||
|
||||
public KdbDatabaseLoader(Context ctx)
|
||||
{
|
||||
_ctx = ctx;
|
||||
}
|
||||
|
||||
public void PopulateDatabaseFromStream(PwDatabase db, CompositeKey key, Stream s, IStatusLogger slLogger)
|
||||
{
|
||||
var importer = new Com.Keepassdroid.Database.Load.ImporterV3();
|
||||
|
||||
var hashingStream = new HashingStreamEx(s, false, new SHA256Managed());
|
||||
|
||||
string password = "";//no need to distinguish between null and "" because empty passwords are invalid (and null is not allowed)
|
||||
KcpPassword passwordKey = (KcpPassword)key.GetUserKey(typeof(KcpPassword));
|
||||
if (passwordKey != null)
|
||||
{
|
||||
password = passwordKey.Password.ReadString();
|
||||
}
|
||||
|
||||
KcpKeyFile passwordKeyfile = (KcpKeyFile)key.GetUserKey(typeof(KcpKeyFile));
|
||||
string keyfile = "";
|
||||
if (passwordKeyfile != null)
|
||||
{
|
||||
keyfile = passwordKeyfile.Path;
|
||||
}
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
var dbv3 = importer.OpenDatabase(hashingStream, password, keyfile);
|
||||
|
||||
db.Name = dbv3.Name;
|
||||
}
|
||||
catch (InvalidPasswordException e) {
|
||||
|
||||
return;
|
||||
}
|
||||
catch (Java.IO.FileNotFoundException e)
|
||||
{
|
||||
throw new FileNotFoundException(
|
||||
e.Message, e);
|
||||
}
|
||||
catch (Java.Lang.Exception e)
|
||||
{
|
||||
throw new Exception(e.LocalizedMessage ??
|
||||
e.Message ??
|
||||
e.GetType().Name, e);
|
||||
}
|
||||
|
||||
HashOfLastStream = hashingStream.Hash;
|
||||
if (HashOfLastStream == null)
|
||||
throw new Exception("hashing didn't work"); //todo remove
|
||||
}
|
||||
|
||||
public byte[] HashOfLastStream { get; private set; }
|
||||
}
|
||||
}
|
31
src/Kp2aBusinessLogic/database/KdbxDatabaseLoader.cs
Normal file
31
src/Kp2aBusinessLogic/database/KdbxDatabaseLoader.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using System.IO;
|
||||
using KeePassLib;
|
||||
using KeePassLib.Interfaces;
|
||||
using KeePassLib.Keys;
|
||||
using KeePassLib.Serialization;
|
||||
|
||||
namespace keepass2android
|
||||
{
|
||||
public class KdbxDatabaseLoader : IDatabaseLoader
|
||||
{
|
||||
private readonly KdbxFormat _format;
|
||||
|
||||
public KdbxDatabaseLoader(KdbxFormat format)
|
||||
{
|
||||
_format = format;
|
||||
}
|
||||
|
||||
public void PopulateDatabaseFromStream(PwDatabase db, CompositeKey key, Stream s, IStatusLogger slLogger)
|
||||
{
|
||||
KdbxFile kdbx = new KdbxFile(db);
|
||||
kdbx.DetachBinaries = db.DetachBinaries;
|
||||
|
||||
kdbx.Load(s, _format, slLogger);
|
||||
HashOfLastStream = kdbx.HashOfFileOnDisk;
|
||||
s.Close();
|
||||
|
||||
}
|
||||
|
||||
public byte[] HashOfLastStream { get; private set; }
|
||||
}
|
||||
}
|
@ -19,6 +19,8 @@ using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Android.App;
|
||||
using KeePassLib;
|
||||
using KeePassLib.Keys;
|
||||
using KeePassLib.Serialization;
|
||||
|
||||
@ -50,10 +52,24 @@ namespace keepass2android
|
||||
try
|
||||
{
|
||||
StatusLogger.UpdateMessage(UiStringKey.loading_database);
|
||||
MemoryStream memoryStream = _databaseData == null ? null : _databaseData.Result;
|
||||
_app.LoadDatabase(_ioc, memoryStream, _compositeKey, StatusLogger);
|
||||
SaveFileData(_ioc, _keyfileOrProvider);
|
||||
//get the stream data into a single stream variable (databaseStream) regardless whether its preloaded or not:
|
||||
MemoryStream preloadedMemoryStream = _databaseData == null ? null : _databaseData.Result;
|
||||
MemoryStream databaseStream;
|
||||
if (preloadedMemoryStream != null)
|
||||
databaseStream = preloadedMemoryStream;
|
||||
else
|
||||
{
|
||||
using (Stream s = _app.GetFileStorage(_ioc).OpenFileForRead(_ioc))
|
||||
{
|
||||
databaseStream = new MemoryStream();
|
||||
s.CopyTo(databaseStream);
|
||||
databaseStream.Seek(0, SeekOrigin.Begin);
|
||||
}
|
||||
}
|
||||
|
||||
//ok, try to load the database. Let's start with Kdbx format and retry later if that is the wrong guess:
|
||||
IDatabaseLoader loader = new KdbxDatabaseLoader(KdbpFile.GetFormatToUse(_ioc));
|
||||
TryLoad(databaseStream, loader);
|
||||
}
|
||||
catch (KeyFileException)
|
||||
{
|
||||
@ -73,11 +89,6 @@ namespace keepass2android
|
||||
Finish(false, _app.GetResourceString(UiStringKey.ErrorOcurred) + " " + message);
|
||||
return;
|
||||
}
|
||||
catch (OldFormatException )
|
||||
{
|
||||
Finish(false, "Cannot open Keepass 1.x database. As explained in the app description, Keepass2Android is for Keepass 2 only! Please use the desktop application to convert your database to the new file format!");
|
||||
return;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Kp2aLog.Log("Exception: " + e);
|
||||
@ -85,8 +96,46 @@ namespace keepass2android
|
||||
return;
|
||||
}
|
||||
|
||||
Kp2aLog.Log("LoadDB OK");
|
||||
Finish(true);
|
||||
|
||||
}
|
||||
|
||||
private void TryLoad(MemoryStream databaseStream, IDatabaseLoader loader)
|
||||
{
|
||||
//create a copy of the stream so we can try again if we get an exception which indicates we should change parameters
|
||||
//This is not optimal in terms of (short-time) memory usage but is hard to avoid because the Keepass library closes streams also in case of errors.
|
||||
//Alternatives would involve increased traffic (if file is on remote) and slower loading times, so this seems to be the best choice.
|
||||
MemoryStream workingCopy = new MemoryStream();
|
||||
databaseStream.CopyTo(workingCopy);
|
||||
workingCopy.Seek(0, SeekOrigin.Begin);
|
||||
//reset stream if we need to reuse it later:
|
||||
databaseStream.Seek(0, SeekOrigin.Begin);
|
||||
//now let's go:
|
||||
try
|
||||
{
|
||||
_app.LoadDatabase(_ioc, workingCopy, _compositeKey, StatusLogger, loader);
|
||||
SaveFileData(_ioc, _keyfileOrProvider);
|
||||
Kp2aLog.Log("LoadDB OK");
|
||||
Finish(true);
|
||||
}
|
||||
catch (OldFormatException)
|
||||
{
|
||||
TryLoad(databaseStream, new KdbDatabaseLoader(Application.Context));
|
||||
}
|
||||
catch (InvalidCompositeKeyException)
|
||||
{
|
||||
KcpPassword passwordKey = (KcpPassword)_compositeKey.GetUserKey(typeof(KcpPassword));
|
||||
|
||||
if ((passwordKey != null) && (passwordKey.Password.ReadString() == "") && (_compositeKey.UserKeyCount > 1))
|
||||
{
|
||||
//if we don't get a password, we don't know whether this means "empty password" or "no password"
|
||||
//retry without password:
|
||||
_compositeKey.RemoveUserKey(passwordKey);
|
||||
//retry:
|
||||
TryLoad(databaseStream, loader);
|
||||
}
|
||||
else throw;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SaveFileData(IOConnectionInfo ioc, String keyfileOrProvider) {
|
||||
|
@ -16,6 +16,13 @@
|
||||
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
|
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
|
||||
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
|
||||
<AndroidUseLatestPlatformSdk />
|
||||
<TargetFrameworkVersion>v4.2</TargetFrameworkVersion>
|
||||
<AndroidSupportedAbis>armeabi,armeabi-v7a,x86</AndroidSupportedAbis>
|
||||
<AndroidStoreUncompressedFileExtensions />
|
||||
<MandroidI18n />
|
||||
<JavaMaximumHeapSize />
|
||||
<JavaOptions />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
@ -96,8 +103,12 @@
|
||||
<Project>{53A9CB7F-6553-4BC0-B56B-9410BB2E59AA}</Project>
|
||||
<Name>Kp2aBusinessLogic</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\KP2AKdbLibraryBinding\KP2AKdbLibraryBinding.csproj">
|
||||
<Project>{70d3844a-d9fa-4a64-b205-a84c6a822196}</Project>
|
||||
<Name>KP2AKdbLibraryBinding</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\monodroid-unittesting\MonoDroidUnitTesting\MonoDroidUnitTesting.csproj">
|
||||
<Project>{a5f8fb02-00e0-4335-91ef-aeaa2c2f3c48}</Project>
|
||||
<Project>{A5F8FB02-00E0-4335-91EF-AEAA2C2F3C48}</Project>
|
||||
<Name>MonoDroidUnitTesting</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
|
@ -20,13 +20,14 @@ namespace Kp2aUnitTests
|
||||
// Run all tests from this assembly
|
||||
//runner.AddTests(Assembly.GetExecutingAssembly());
|
||||
//runner.AddTests(new List<Type> { typeof(TestSynchronizeCachedDatabase)});
|
||||
runner.AddTests(typeof(TestLoadDb).GetMethod("LoadErrorWithCertificateTrustFailure"));
|
||||
//runner.AddTests(typeof(TestLoadDb).GetMethod("LoadErrorWithCertificateTrustFailure"));
|
||||
|
||||
//runner.AddTests(new List<Type> { typeof(TestSaveDb) });
|
||||
//runner.AddTests(new List<Type> { typeof(TestLoadDb) });
|
||||
//runner.AddTests(new List<Type> { typeof(TestCachingFileStorage) });
|
||||
//runner.AddTests(typeof(TestCachingFileStorage).GetMethod("TestSaveToRemote"));
|
||||
//runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadKdbpWithPasswordOnly"));
|
||||
//runner.AddTests(typeof(TestSaveDb).GetMethod("TestLoadKdbxAndSaveKdbp_TestIdenticalFiles"));
|
||||
runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadKdb1"));
|
||||
runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadWithKeyfileOnly"));
|
||||
runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadKdbpWithPasswordOnly"));
|
||||
runner.AddTests(typeof(TestSaveDb).GetMethod("TestLoadKdbxAndSaveKdbp_TestIdenticalFiles"));
|
||||
return runner;
|
||||
}
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ namespace Kp2aUnitTests
|
||||
|
||||
//ensure the the database can be loaded from file:
|
||||
PwDatabase loadedDb = new PwDatabase();
|
||||
loadedDb.Open(ioc, new CompositeKey(), null);
|
||||
loadedDb.Open(ioc, new CompositeKey(), null, new KdbxDatabaseLoader(KdbxFormat.Default));
|
||||
|
||||
//Check whether the databases are equal
|
||||
AssertDatabasesAreEqual(loadedDb, app.GetDb().KpDatabase);
|
||||
|
@ -5,6 +5,7 @@ using System.Net.Security;
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using KeePassLib;
|
||||
using KeePassLib.Keys;
|
||||
using KeePassLib.Serialization;
|
||||
using keepass2android;
|
||||
@ -48,10 +49,9 @@ namespace Kp2aUnitTests
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void LoadDatabase(IOConnectionInfo ioConnectionInfo, MemoryStream memoryStream, CompositeKey compKey,
|
||||
ProgressDialogStatusLogger statusLogger)
|
||||
public void LoadDatabase(IOConnectionInfo ioConnectionInfo, MemoryStream memoryStream, CompositeKey compKey, ProgressDialogStatusLogger statusLogger, IDatabaseLoader databaseLoader)
|
||||
{
|
||||
_db.LoadData(this, ioConnectionInfo, memoryStream, compKey, statusLogger);
|
||||
_db.LoadData(this, ioConnectionInfo, memoryStream, compKey, statusLogger, databaseLoader);
|
||||
}
|
||||
public Database GetDb()
|
||||
{
|
||||
|
@ -20,10 +20,12 @@ namespace Kp2aUnitTests
|
||||
app.CreateNewDatabase();
|
||||
bool loadSuccesful = false;
|
||||
var key = CreateKey(password, keyfile);
|
||||
string loadErrorMessage = "";
|
||||
|
||||
LoadDb task = new LoadDb(app, new IOConnectionInfo { Path = TestDbDirectory+filenameWithoutDir }, null,
|
||||
key, keyfile, new ActionOnFinish((success, message) =>
|
||||
{
|
||||
loadErrorMessage = message;
|
||||
if (!success)
|
||||
Android.Util.Log.Debug("KP2ATest", "error loading db: " + message);
|
||||
loadSuccesful = success;
|
||||
@ -34,7 +36,7 @@ namespace Kp2aUnitTests
|
||||
pt.Run();
|
||||
pt.JoinWorkerThread();
|
||||
Android.Util.Log.Debug("KP2ATest", "PT.run finished");
|
||||
Assert.IsTrue(loadSuccesful, "didn't succesfully load database :-(");
|
||||
Assert.IsTrue(loadSuccesful, "didn't succesfully load database :-( "+loadErrorMessage);
|
||||
|
||||
Assert.AreEqual(6,app.GetDb().KpDatabase.RootGroup.Groups.Count());
|
||||
Assert.AreEqual(2,app.GetDb().KpDatabase.RootGroup.Entries.Count());
|
||||
@ -48,6 +50,14 @@ namespace Kp2aUnitTests
|
||||
{
|
||||
RunLoadTest("passwordonly.kdbx", DefaultPassword, "");
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void TestLoadKdb1()
|
||||
{
|
||||
RunLoadTest("test1.kdb", "12345", "");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TestLoadWithKeyfileOnly()
|
||||
{
|
||||
|
@ -2,8 +2,8 @@
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="keepass2android.kp2akeytransform"
|
||||
package="keepass2android.KdbLibrary"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
@ -7,8 +7,7 @@
|
||||
android:minSdkVersion="8"
|
||||
android:targetSdkVersion="17" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true">
|
||||
<application>
|
||||
</application>
|
||||
|
||||
</manifest>
|
Binary file not shown.
@ -835,7 +835,7 @@ namespace keepass2android
|
||||
|
||||
}
|
||||
|
||||
private MemoryStream LoadDbFile()
|
||||
private MemoryStream PreloadDbFile()
|
||||
{
|
||||
if (KdbpFile.GetFormatToUse(_ioConnection) == KdbxFormat.ProtocolBuffers)
|
||||
{
|
||||
@ -998,7 +998,7 @@ namespace keepass2android
|
||||
if (_loadDbTask == null && _prefs.GetBoolean(GetString(Resource.String.PreloadDatabaseEnabled_key), true))
|
||||
{
|
||||
// Create task to kick off file loading while the user enters the password
|
||||
_loadDbTask = Task.Factory.StartNew<MemoryStream>(LoadDbFile);
|
||||
_loadDbTask = Task.Factory.StartNew<MemoryStream>(PreloadDbFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,6 +24,7 @@ using Android.Graphics.Drawables;
|
||||
using Android.OS;
|
||||
using Android.Runtime;
|
||||
using Android.Widget;
|
||||
using KeePassLib;
|
||||
using KeePassLib.Cryptography.Cipher;
|
||||
using KeePassLib.Keys;
|
||||
using KeePassLib.Serialization;
|
||||
@ -108,9 +109,9 @@ namespace keepass2android
|
||||
Application.Context.SendBroadcast(new Intent(Intents.DatabaseLocked));
|
||||
}
|
||||
|
||||
public void LoadDatabase(IOConnectionInfo ioConnectionInfo, MemoryStream memoryStream, CompositeKey compositeKey, ProgressDialogStatusLogger statusLogger)
|
||||
public void LoadDatabase(IOConnectionInfo ioConnectionInfo, MemoryStream memoryStream, CompositeKey compositeKey, ProgressDialogStatusLogger statusLogger, IDatabaseLoader databaseLoader)
|
||||
{
|
||||
_db.LoadData(this, ioConnectionInfo, memoryStream, compositeKey, statusLogger);
|
||||
_db.LoadData(this, ioConnectionInfo, memoryStream, compositeKey, statusLogger, databaseLoader);
|
||||
|
||||
UpdateOngoingNotification();
|
||||
}
|
||||
|
@ -30,7 +30,7 @@
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug</OutputPath>
|
||||
<DefineConstants>DEBUG;EXCLUDE_TWOFISH;INCLUDE_KEYBOARD;INCLUDE_KEYTRANSFORM;INCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE</DefineConstants>
|
||||
<DefineConstants>DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;EXCLUDE_FILECHOOSER;EXCLUDE_JAVAFILESTORAGE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<ConsolePause>False</ConsolePause>
|
||||
@ -911,4 +911,10 @@
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_storage_sftp.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\4-collections-new-label.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable-hdpi\device_access_new_account.png" />
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -65,7 +65,7 @@ namespace MonoDroidUnitTesting {
|
||||
protected override void OnStart() {
|
||||
base.OnStart();
|
||||
|
||||
new Handler().Post(this.RunTests);
|
||||
//new Handler().Post(this.RunTests);
|
||||
}
|
||||
|
||||
protected virtual void OnTestRunStarted() { }
|
||||
@ -171,6 +171,9 @@ namespace MonoDroidUnitTesting {
|
||||
protected override void OnResume() {
|
||||
base.OnResume();
|
||||
|
||||
TestRunner = null;
|
||||
new Handler().Post(this.RunTests);
|
||||
|
||||
if (TestRunner != null) {
|
||||
// Only remember this view if the test run finished and therefore the previous activity has been restored.
|
||||
ISharedPreferencesEditor e = GetPreferences().Edit();
|
||||
|
Loading…
Reference in New Issue
Block a user