mirror of
https://github.com/moparisthebest/keepass2android
synced 2024-08-13 17:03:49 -04:00
224 lines
5.3 KiB
C#
224 lines
5.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Net.Security;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using Android.App;
|
|
using Android.Content;
|
|
using Android.OS;
|
|
using KeePassLib;
|
|
using KeePassLib.Keys;
|
|
using KeePassLib.Serialization;
|
|
using keepass2android;
|
|
using keepass2android.Io;
|
|
|
|
namespace Kp2aUnitTests
|
|
{
|
|
/// <summary>
|
|
/// Very simple implementation of the Kp2aApp interface to be used in tests
|
|
/// </summary>
|
|
internal class TestKp2aApp : IKp2aApp
|
|
{
|
|
internal enum YesNoCancelResult
|
|
{
|
|
Yes, No, Cancel
|
|
}
|
|
|
|
private Database _db;
|
|
private YesNoCancelResult _yesNoCancelResult = YesNoCancelResult.Yes;
|
|
private Dictionary<PreferenceKey, bool> _preferences = new Dictionary<PreferenceKey, bool>();
|
|
|
|
private int id = new Random().Next(1000);
|
|
|
|
public void SetShutdown()
|
|
{
|
|
|
|
}
|
|
|
|
public virtual TestFileStorage TestFileStorage
|
|
{
|
|
get
|
|
{
|
|
if (_testFileStorage != null)
|
|
return _testFileStorage;
|
|
return (TestFileStorage) FileStorage;
|
|
}
|
|
set { _testFileStorage = value; }
|
|
}
|
|
|
|
public void LockDatabase(bool allowQuickUnlock = true)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public void LoadDatabase(IOConnectionInfo ioConnectionInfo, MemoryStream memoryStream, CompositeKey compKey, ProgressDialogStatusLogger statusLogger, IDatabaseFormat databaseFormat)
|
|
{
|
|
_db.LoadData(this, ioConnectionInfo, memoryStream, compKey, statusLogger, databaseFormat);
|
|
}
|
|
public Database GetDb()
|
|
{
|
|
return _db;
|
|
}
|
|
|
|
public void StoreOpenedFileAsRecent(IOConnectionInfo ioc, string keyfile)
|
|
{
|
|
|
|
}
|
|
|
|
public Database CreateNewDatabase()
|
|
{
|
|
TestDrawableFactory testDrawableFactory = new TestDrawableFactory();
|
|
_db = new Database(testDrawableFactory, this);
|
|
return _db;
|
|
|
|
}
|
|
|
|
public string GetResourceString(UiStringKey stringKey)
|
|
{
|
|
return stringKey.ToString();
|
|
}
|
|
|
|
public bool GetBooleanPreference(PreferenceKey key)
|
|
{
|
|
if (_preferences.ContainsKey(key))
|
|
return _preferences[key];
|
|
return true;
|
|
}
|
|
|
|
public UiStringKey? LastYesNoCancelQuestionTitle { get; set; }
|
|
|
|
|
|
public void AskYesNoCancel(UiStringKey titleKey, UiStringKey messageKey,
|
|
EventHandler<DialogClickEventArgs> yesHandler,
|
|
EventHandler<DialogClickEventArgs> noHandler,
|
|
EventHandler<DialogClickEventArgs> cancelHandler,
|
|
Context ctx)
|
|
{
|
|
AskYesNoCancel(titleKey, messageKey, UiStringKey.yes, UiStringKey.no,
|
|
yesHandler, noHandler, cancelHandler, ctx);
|
|
}
|
|
|
|
public void AskYesNoCancel(UiStringKey titleKey, UiStringKey messageKey,
|
|
UiStringKey yesString, UiStringKey noString,
|
|
EventHandler<DialogClickEventArgs> yesHandler,
|
|
EventHandler<DialogClickEventArgs> noHandler,
|
|
EventHandler<DialogClickEventArgs> cancelHandler,
|
|
Context ctx)
|
|
{
|
|
LastYesNoCancelQuestionTitle = titleKey;
|
|
switch (_yesNoCancelResult)
|
|
{
|
|
case YesNoCancelResult.Yes:
|
|
yesHandler(null, null);
|
|
break;
|
|
case YesNoCancelResult.No:
|
|
noHandler(null, null);
|
|
break;
|
|
case YesNoCancelResult.Cancel:
|
|
cancelHandler(null, null);
|
|
break;
|
|
default:
|
|
throw new Exception("unexpected case!");
|
|
}
|
|
|
|
}
|
|
|
|
public Handler UiThreadHandler {
|
|
get { return null; } //ensure everything runs in the same thread. Otherwise the OnFinish-callback would run after the test has already finished (with failure)
|
|
}
|
|
|
|
public IFileStorage FileStorage { get; set; }
|
|
|
|
public IProgressDialog CreateProgressDialog(Context ctx)
|
|
{
|
|
return new ProgressDialogStub();
|
|
}
|
|
|
|
public virtual IFileStorage GetFileStorage(IOConnectionInfo iocInfo)
|
|
{
|
|
return FileStorage;
|
|
}
|
|
|
|
public virtual IFileStorage GetFileStorage(IOConnectionInfo iocInfo, bool allowCache)
|
|
{
|
|
if (FileStorage is CachingFileStorage)
|
|
throw new Exception("bad test class");
|
|
return FileStorage;
|
|
}
|
|
|
|
|
|
public bool TriggerReloadCalled;
|
|
private TestFileStorage _testFileStorage;
|
|
private bool _serverCertificateErrorResponse;
|
|
|
|
public TestKp2aApp()
|
|
{
|
|
FileStorage = new BuiltInFileStorage(this);
|
|
}
|
|
|
|
public void TriggerReload(Context ctx)
|
|
{
|
|
TriggerReloadCalled = true;
|
|
}
|
|
|
|
|
|
|
|
public RemoteCertificateValidationCallback CertificateValidationCallback
|
|
{
|
|
get
|
|
{
|
|
Kp2aLog.Log("TESTAPP: " + id + "/ " + ServerCertificateErrorResponse);
|
|
if (!ServerCertificateErrorResponse)
|
|
{
|
|
return (sender, certificate, chain, errors) =>
|
|
{
|
|
if (errors == SslPolicyErrors.None)
|
|
return true;
|
|
return false;
|
|
};
|
|
|
|
}
|
|
// return null; //default behavior
|
|
|
|
return (sender, certificate, chain, errors) =>
|
|
{
|
|
return true;
|
|
};
|
|
}
|
|
|
|
}
|
|
|
|
public bool CheckForDuplicateUuids
|
|
{
|
|
get { return true; }
|
|
}
|
|
|
|
|
|
public bool OnServerCertificateError(int sslPolicyErrors)
|
|
{
|
|
ServerCertificateErrorCalled = true;
|
|
return ServerCertificateErrorResponse;
|
|
}
|
|
|
|
public bool ServerCertificateErrorResponse
|
|
{
|
|
get { return _serverCertificateErrorResponse; }
|
|
set {
|
|
_serverCertificateErrorResponse = value;
|
|
FileStorage = new BuiltInFileStorage(this); // recreate because of possibly changed validation behavior
|
|
}
|
|
}
|
|
|
|
protected bool ServerCertificateErrorCalled { get; set; }
|
|
|
|
public void SetYesNoCancelResult(YesNoCancelResult yesNoCancelResult)
|
|
{
|
|
_yesNoCancelResult = yesNoCancelResult;
|
|
}
|
|
|
|
public void SetPreference(PreferenceKey key, bool value)
|
|
{
|
|
_preferences[key] = value;
|
|
}
|
|
}
|
|
} |