From b320477a641f3270973dea4267d6d27ad95998e7 Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Thu, 12 Dec 2013 10:24:24 +0100 Subject: [PATCH] Improved Certificate Handling (fixed problem with Certificate validation) --- .../KeePassLib2Android.csproj | 2 +- .../Serialization/IOConnection.cs | 4 +- src/Kp2aBusinessLogic/IKp2aApp.cs | 6 + .../Io/BuiltInFileStorage.cs | 113 +- .../Kp2aBusinessLogic.csproj | 3 +- src/Kp2aBusinessLogic/UiStringKey.cs | 3 +- src/Kp2aUnitTests/MainActivity.cs | 6 +- .../Resources/Resource.Designer.cs | 2 +- src/Kp2aUnitTests/TestBase.cs | 17 +- src/Kp2aUnitTests/TestCachingFileStorage.cs | 18 +- src/Kp2aUnitTests/TestFileStorage.cs | 77 +- src/Kp2aUnitTests/TestKp2aApp.cs | 32 +- src/Kp2aUnitTests/TestLoadDb.cs | 84 +- src/Kp2aUnitTests/TestSaveDbCached.cs | 4 +- .../TestSynchronizeCachedDatabase.cs | 27 +- .../Properties/AndroidManifest_net.xml | 2 +- .../Resources/Resource.designer.cs | 1634 +++++++++-------- .../Resources/values/config.xml | 8 + .../Resources/values/strings.xml | 17 +- .../Resources/xml/preferences.xml | 10 + src/keepass2android/app/App.cs | 63 +- src/keepass2android/keepass2android.csproj | 2 +- 22 files changed, 1265 insertions(+), 869 deletions(-) diff --git a/src/KeePassLib2Android/KeePassLib2Android.csproj b/src/KeePassLib2Android/KeePassLib2Android.csproj index 2097a03d..546adf81 100644 --- a/src/KeePassLib2Android/KeePassLib2Android.csproj +++ b/src/KeePassLib2Android/KeePassLib2Android.csproj @@ -20,7 +20,7 @@ full False bin\Debug - DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;INCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE + DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;EXCLUDE_FILECHOOSER;EXCLUDE_JAVAFILESTORAGE prompt 4 False diff --git a/src/KeePassLib2Android/Serialization/IOConnection.cs b/src/KeePassLib2Android/Serialization/IOConnection.cs index c559c2b5..8bcf452f 100644 --- a/src/KeePassLib2Android/Serialization/IOConnection.cs +++ b/src/KeePassLib2Android/Serialization/IOConnection.cs @@ -317,7 +317,7 @@ namespace KeePassLib.Serialization if ((ex.Response is HttpWebResponse) && (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.Unauthorized)) return CreateWebClient(ioc, true).OpenRead(new Uri(ioc.Path)); else - throw ex; + throw; } } @@ -369,7 +369,7 @@ namespace KeePassLib.Serialization if ((ex.Response is HttpWebResponse) && (((HttpWebResponse) ex.Response).StatusCode == HttpStatusCode.Unauthorized)) uploadData(IOConnection.CreateWebClient(ioc, true)); else - throw ex; + throw; } } diff --git a/src/Kp2aBusinessLogic/IKp2aApp.cs b/src/Kp2aBusinessLogic/IKp2aApp.cs index 1f35e232..c0d41952 100644 --- a/src/Kp2aBusinessLogic/IKp2aApp.cs +++ b/src/Kp2aBusinessLogic/IKp2aApp.cs @@ -78,5 +78,11 @@ namespace keepass2android IFileStorage GetFileStorage(IOConnectionInfo iocInfo); void TriggerReload(Context context); + + /// + /// Handles a failed certificate validation. Returns true if the users wants to continue, false otherwise. + /// see http://msdn.microsoft.com/en-us/library/system.net.icertificatepolicy(v=vs.110).aspx + /// + bool OnServerCertificateError(int certificateProblem); } } \ No newline at end of file diff --git a/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs b/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs index 1b0a94d2..cf467f10 100644 --- a/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs +++ b/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Net; +using System.Net.Security; using Android.Content; using Android.OS; +using Java.Security.Cert; using KeePassLib.Serialization; using KeePassLib.Utility; @@ -12,6 +14,56 @@ namespace keepass2android.Io { public class BuiltInFileStorage: IFileStorage { + public enum CertificateProblem :long + { + CertEXPIRED = 0x800B0101, + CertVALIDITYPERIODNESTING = 0x800B0102, + CertROLE = 0x800B0103, + CertPATHLENCONST = 0x800B0104, + CertCRITICAL = 0x800B0105, + CertPURPOSE = 0x800B0106, + CertISSUERCHAINING = 0x800B0107, + CertMALFORMED = 0x800B0108, + CertUNTRUSTEDROOT = 0x800B0109, + CertCHAINING = 0x800B010A, + CertREVOKED = 0x800B010C, + CertUNTRUSTEDTESTROOT = 0x800B010D, + CertREVOCATION_FAILURE = 0x800B010E, + CertCN_NO_MATCH = 0x800B010F, + CertWRONG_USAGE = 0x800B0110, + CertUNTRUSTEDCA = 0x800B0112 + } + + + private readonly IKp2aApp _app; + + class CertificatePolicity: ICertificatePolicy + { + private readonly IKp2aApp _app; + + public CertificatePolicity(IKp2aApp app) + { + _app = app; + } + + public bool CheckValidationResult(ServicePoint srvPoint, System.Security.Cryptography.X509Certificates.X509Certificate certificate, WebRequest request, + int certificateProblem) + { + if (certificateProblem == 0) //ok + return true; + return _app.OnServerCertificateError(certificateProblem); + } + } + + + public BuiltInFileStorage(IKp2aApp app) + { + _app = app; + //use the obsolute CertificatePolicy because the ServerCertificateValidationCallback isn't called in Mono for Android (?) + ServicePointManager.CertificatePolicy = new CertificatePolicity(app); + + } + public IEnumerable SupportedProtocols { get @@ -68,26 +120,51 @@ namespace keepass2android.Io } catch (WebException ex) { - if ((ex.Response is HttpWebResponse) && (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound)) - { - throw new FileNotFoundException(ex.Message, ioc.Path, ex); - } + ConvertException(ioc, ex); throw; } - + } + + private void ConvertException(IOConnectionInfo ioc, WebException ex) + { + if ((ex.Response is HttpWebResponse) && (((HttpWebResponse) ex.Response).StatusCode == HttpStatusCode.NotFound)) + { + throw new FileNotFoundException(ex.Message, ioc.Path, ex); + } + if (ex.Status == WebExceptionStatus.TrustFailure) + { + throw new Exception(_app.GetResourceString(UiStringKey.CertificateFailure), ex); + } + var inner1 = ex.InnerException as IOException; + if (inner1 != null) + { + var inner2 = inner1.InnerException; + if (inner2 != null) + { + if (inner2.Message.Contains("Invalid certificate received from server.")) + { + throw new Exception(_app.GetResourceString(UiStringKey.CertificateFailure), ex); + } + } + + } } public IWriteTransaction OpenWriteTransaction(IOConnectionInfo ioc, bool useFileTransaction) { - return new BuiltInFileTransaction(ioc, useFileTransaction); + return new BuiltInFileTransaction(ioc, useFileTransaction, this); } public class BuiltInFileTransaction : IWriteTransaction { + private readonly IOConnectionInfo _ioc; + private readonly BuiltInFileStorage _fileStorage; private readonly FileTransactionEx _transaction; - public BuiltInFileTransaction(IOConnectionInfo ioc, bool useFileTransaction) + public BuiltInFileTransaction(IOConnectionInfo ioc, bool useFileTransaction, BuiltInFileStorage fileStorage) { + _ioc = ioc; + _fileStorage = fileStorage; _transaction = new FileTransactionEx(ioc, useFileTransaction); } @@ -98,12 +175,30 @@ namespace keepass2android.Io public Stream OpenFile() { - return _transaction.OpenWrite(); + try + { + return _transaction.OpenWrite(); + } + catch (WebException ex) + { + _fileStorage.ConvertException(_ioc, ex); + throw; + } + } public void CommitWrite() { - _transaction.CommitWrite(); + try + { + _transaction.CommitWrite(); + } + catch (WebException ex) + { + _fileStorage.ConvertException(_ioc, ex); + throw; + } + } } diff --git a/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj b/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj index da1a4f78..9cbaf367 100644 --- a/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj +++ b/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj @@ -20,7 +20,7 @@ full false bin\Debug\ - TRACE;DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;INCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE + TRACE;DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;EXCLUDE_FILECHOOSER;EXCLUDE_JAVAFILESTORAGE prompt 4 @@ -44,6 +44,7 @@ + diff --git a/src/Kp2aBusinessLogic/UiStringKey.cs b/src/Kp2aBusinessLogic/UiStringKey.cs index e82281d3..9b2d59aa 100644 --- a/src/Kp2aBusinessLogic/UiStringKey.cs +++ b/src/Kp2aBusinessLogic/UiStringKey.cs @@ -46,6 +46,7 @@ namespace keepass2android CannotMoveGroupHere, ErrorOcurred, SynchronizingOtpAuxFile, - SavingOtpAuxFile + SavingOtpAuxFile, + CertificateFailure } } \ No newline at end of file diff --git a/src/Kp2aUnitTests/MainActivity.cs b/src/Kp2aUnitTests/MainActivity.cs index 880cf121..0301706d 100644 --- a/src/Kp2aUnitTests/MainActivity.cs +++ b/src/Kp2aUnitTests/MainActivity.cs @@ -18,9 +18,9 @@ namespace Kp2aUnitTests { TestRunner runner = new TestRunner(); // Run all tests from this assembly - runner.AddTests(Assembly.GetExecutingAssembly()); - //runner.AddTests(new List { typeof(TestSynchronizeCachedDatabase) }); - //runner.AddTests(typeof(TestSaveDbCached).GetMethod("TestLoadEditSaveWhenModified")); + //runner.AddTests(Assembly.GetExecutingAssembly()); + //runner.AddTests(new List { typeof(TestSynchronizeCachedDatabase)}); + runner.AddTests(typeof(TestLoadDb).GetMethod("LoadErrorWithCertificateTrustFailure")); //runner.AddTests(new List { typeof(TestSaveDb) }); //runner.AddTests(new List { typeof(TestCachingFileStorage) }); diff --git a/src/Kp2aUnitTests/Resources/Resource.Designer.cs b/src/Kp2aUnitTests/Resources/Resource.Designer.cs index c3d515fb..641b4a6a 100644 --- a/src/Kp2aUnitTests/Resources/Resource.Designer.cs +++ b/src/Kp2aUnitTests/Resources/Resource.Designer.cs @@ -2,7 +2,7 @@ //------------------------------------------------------------------------------ // // Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.18051 +// Laufzeitversion:4.0.30319.34003 // // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // der Code erneut generiert wird. diff --git a/src/Kp2aUnitTests/TestBase.cs b/src/Kp2aUnitTests/TestBase.cs index 7bb04da3..7293fc9a 100644 --- a/src/Kp2aUnitTests/TestBase.cs +++ b/src/Kp2aUnitTests/TestBase.cs @@ -66,7 +66,7 @@ namespace Kp2aUnitTests var app = CreateTestKp2aApp(); app.CreateNewDatabase(); bool loadSuccesful = false; - LoadDb task = new LoadDb(app, new IOConnectionInfo() { Path = filename }, null, password, keyfile, new ActionOnFinish((success, message) => + LoadDb task = new LoadDb(app, new IOConnectionInfo() { Path = filename }, null, CreateKey(password, keyfile), keyfile, new ActionOnFinish((success, message) => { if (!success) Kp2aLog.Log(message); @@ -80,7 +80,20 @@ namespace Kp2aUnitTests Assert.IsTrue(loadSuccesful); return app; } - + protected static CompositeKey CreateKey(string password, string keyfile) + { + CompositeKey key = new CompositeKey(); + key.AddUserKey(new KcpPassword(password)); + if (!String.IsNullOrEmpty(keyfile)) + key.AddUserKey(new KcpKeyFile(keyfile)); + return key; + } + protected static CompositeKey CreateKey(string password) + { + CompositeKey key = new CompositeKey(); + key.AddUserKey(new KcpPassword(password)); + return key; + } protected virtual TestKp2aApp CreateTestKp2aApp() { TestKp2aApp app = new TestKp2aApp(); diff --git a/src/Kp2aUnitTests/TestCachingFileStorage.cs b/src/Kp2aUnitTests/TestCachingFileStorage.cs index 85d47c06..4c673d09 100644 --- a/src/Kp2aUnitTests/TestCachingFileStorage.cs +++ b/src/Kp2aUnitTests/TestCachingFileStorage.cs @@ -14,6 +14,12 @@ namespace Kp2aUnitTests [TestClass] class TestCachingFileStorage: TestBase { + [TestInitialize] + public void InitTests() + { + TestFileStorage.Offline = false; + } + private TestFileStorage _testFileStorage; private CachingFileStorage _fileStorage; private static readonly string CachingTestFile = DefaultDirectory + "cachingTestFile.txt"; @@ -37,7 +43,7 @@ namespace Kp2aUnitTests Assert.AreEqual(MemoryStreamToString(fileContents), _defaultCacheFileContents); //let the base file storage go offline: - _testFileStorage.Offline = true; + TestFileStorage.Offline = true; //now try to read the file again: MemoryStream fileContents2 = ReadToMemoryStream(_fileStorage, CachingTestFile); @@ -98,7 +104,7 @@ namespace Kp2aUnitTests _testCacheSupervisor.AssertSingleCall(TestCacheSupervisor.UpdatedCachedFileOnLoadId); //let the base file storage go offline: - _testFileStorage.Offline = true; + TestFileStorage.Offline = true; //write something to the cache: string newContent = "new content"; @@ -116,7 +122,7 @@ namespace Kp2aUnitTests Assert.AreEqual(MemoryStreamToString(fileContents2), newContent); //now go online and read again. This should trigger a sync and the modified data must be returned - _testFileStorage.Offline = false; + TestFileStorage.Offline = false; MemoryStream fileContents3 = ReadToMemoryStream(_fileStorage, CachingTestFile); Assert.AreEqual(MemoryStreamToString(fileContents3), newContent); @@ -141,7 +147,7 @@ namespace Kp2aUnitTests _testCacheSupervisor.AssertSingleCall(TestCacheSupervisor.UpdatedCachedFileOnLoadId); //let the base file storage go offline: - _testFileStorage.Offline = true; + TestFileStorage.Offline = true; //write something to the cache: string newLocalContent = "new local content"; @@ -153,7 +159,7 @@ namespace Kp2aUnitTests File.WriteAllText(CachingTestFile, "new remote content"); //go online again: - _testFileStorage.Offline = false; + TestFileStorage.Offline = false; //now try to read the file again: MemoryStream fileContents2 = ReadToMemoryStream(_fileStorage, CachingTestFile); @@ -231,7 +237,7 @@ namespace Kp2aUnitTests private void SetupFileStorage() { - _testFileStorage = new TestFileStorage(); + _testFileStorage = new TestFileStorage(new TestKp2aApp()); _testCacheSupervisor = new TestCacheSupervisor(); //_fileStorage = new CachingFileStorage(_testFileStorage, Application.Context.CacheDir.Path, _testCacheSupervisor); _fileStorage = new CachingFileStorage(_testFileStorage, "/mnt/sdcard/kp2atest_cache", _testCacheSupervisor); diff --git a/src/Kp2aUnitTests/TestFileStorage.cs b/src/Kp2aUnitTests/TestFileStorage.cs index eff83b10..ef67480b 100644 --- a/src/Kp2aUnitTests/TestFileStorage.cs +++ b/src/Kp2aUnitTests/TestFileStorage.cs @@ -1,16 +1,23 @@ using System; using System.Collections.Generic; using System.IO; +using Android.Content; +using Android.OS; using KeePassLib.Serialization; +using keepass2android; using keepass2android.Io; namespace Kp2aUnitTests { internal class TestFileStorage: IFileStorage { - private BuiltInFileStorage _builtIn = new BuiltInFileStorage(); + public TestFileStorage(IKp2aApp app) + { + _builtIn = new BuiltInFileStorage(app); + } + private BuiltInFileStorage _builtIn; - public bool Offline { get; set; } + public static bool Offline { get; set; } public IEnumerable SupportedProtocols { get { yield return "test"; } } @@ -96,6 +103,11 @@ namespace Kp2aUnitTests return _builtIn.RequiresCredentials(ioc); } + public void CreateDirectory(IOConnectionInfo ioc, string newDirName) + { + throw new NotImplementedException(); + } + public void CreateDirectory(IOConnectionInfo ioc) { throw new NotImplementedException(); @@ -110,5 +122,66 @@ namespace Kp2aUnitTests { throw new NotImplementedException(); } + + public bool RequiresSetup(IOConnectionInfo ioConnection) + { + return false; + } + + public string IocToPath(IOConnectionInfo ioc) + { + return ioc.Path; + } + + public void StartSelectFile(IFileStorageSetupInitiatorActivity activity, bool isForSave, int requestCode, string protocolId) + { + throw new NotImplementedException(); + } + + public void PrepareFileUsage(IFileStorageSetupInitiatorActivity activity, IOConnectionInfo ioc, int requestCode, + bool alwaysReturnSuccess) + { + throw new NotImplementedException(); + } + + public void OnCreate(IFileStorageSetupActivity activity, Bundle savedInstanceState) + { + throw new NotImplementedException(); + } + + public void OnResume(IFileStorageSetupActivity activity) + { + throw new NotImplementedException(); + } + + public void OnStart(IFileStorageSetupActivity activity) + { + throw new NotImplementedException(); + } + + public void OnActivityResult(IFileStorageSetupActivity activity, int requestCode, int resultCode, Intent data) + { + throw new NotImplementedException(); + } + + public string GetDisplayName(IOConnectionInfo ioc) + { + return ioc.Path; + } + + public string CreateFilePath(string parent, string newFilename) + { + throw new NotImplementedException(); + } + + public IOConnectionInfo GetParentPath(IOConnectionInfo ioc) + { + throw new NotImplementedException(); + } + + public IOConnectionInfo GetFilePath(IOConnectionInfo folderPath, string filename) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/src/Kp2aUnitTests/TestKp2aApp.cs b/src/Kp2aUnitTests/TestKp2aApp.cs index 78a2fdd8..89e811c0 100644 --- a/src/Kp2aUnitTests/TestKp2aApp.cs +++ b/src/Kp2aUnitTests/TestKp2aApp.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net.Security; using Android.App; using Android.Content; using Android.OS; +using KeePassLib.Keys; using KeePassLib.Serialization; using keepass2android; using keepass2android.Io; @@ -30,18 +32,27 @@ namespace Kp2aUnitTests } + 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, string password, string keyFile, + public void LoadDatabase(IOConnectionInfo ioConnectionInfo, MemoryStream memoryStream, CompositeKey compKey, ProgressDialogStatusLogger statusLogger) { - _db.LoadData(this, ioConnectionInfo, memoryStream, password, statusLogger); - + _db.LoadData(this, ioConnectionInfo, memoryStream, compKey, statusLogger); } - public Database GetDb() { return _db; @@ -128,10 +139,11 @@ namespace Kp2aUnitTests public bool TriggerReloadCalled; + private TestFileStorage _testFileStorage; public TestKp2aApp() { - FileStorage = new BuiltInFileStorage(); + FileStorage = new BuiltInFileStorage(this); } public void TriggerReload(Context ctx) @@ -139,6 +151,16 @@ namespace Kp2aUnitTests TriggerReloadCalled = true; } + public bool OnServerCertificateError(int sslPolicyErrors) + { + ServerCertificateErrorCalled = true; + return ServerCertificateErrorResponse; + } + + public bool ServerCertificateErrorResponse { get; set; } + + protected bool ServerCertificateErrorCalled { get; set; } + public void SetYesNoCancelResult(YesNoCancelResult yesNoCancelResult) { _yesNoCancelResult = yesNoCancelResult; diff --git a/src/Kp2aUnitTests/TestLoadDb.cs b/src/Kp2aUnitTests/TestLoadDb.cs index dc3b8743..9d515d47 100644 --- a/src/Kp2aUnitTests/TestLoadDb.cs +++ b/src/Kp2aUnitTests/TestLoadDb.cs @@ -1,9 +1,7 @@ using System; using System.IO; using System.Linq; -using System.Threading; using Android.App; -using Android.OS; using KeePassLib.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; using keepass2android; @@ -21,8 +19,10 @@ namespace Kp2aUnitTests IKp2aApp app = new TestKp2aApp(); app.CreateNewDatabase(); bool loadSuccesful = false; - LoadDb task = new LoadDb(app, new IOConnectionInfo() { Path = TestDbDirectory+filenameWithoutDir }, null, - password, keyfile, new ActionOnFinish((success, message) => + var key = CreateKey(password, keyfile); + + LoadDb task = new LoadDb(app, new IOConnectionInfo { Path = TestDbDirectory+filenameWithoutDir }, null, + key, keyfile, new ActionOnFinish((success, message) => { if (!success) Android.Util.Log.Debug("KP2ATest", "error loading db: " + message); @@ -40,6 +40,8 @@ namespace Kp2aUnitTests Assert.AreEqual(2,app.GetDb().KpDatabase.RootGroup.Entries.Count()); } + + [TestMethod] public void TestLoadWithPasswordOnly() @@ -74,11 +76,12 @@ namespace Kp2aUnitTests public void LoadFromRemoteWithDomain() { var ioc = RemoteDomainIoc; //note: this property is defined in "TestLoadDbCredentials.cs" which is deliberately excluded from Git because the credentials are not public! - IKp2aApp app = new TestKp2aApp(); + var app = new TestKp2aApp(); + app.ServerCertificateErrorResponse = true; //accept invalid cert app.CreateNewDatabase(); bool loadSuccesful = false; - LoadDb task = new LoadDb(app, ioc, null, "a", null, new ActionOnFinish((success, message) => + LoadDb task = new LoadDb(app, ioc, null, CreateKey("a"), null, new ActionOnFinish((success, message) => { if (!success) Android.Util.Log.Debug("KP2ATest", "error loading db: " + message); @@ -95,14 +98,69 @@ namespace Kp2aUnitTests } [TestMethod] - public void LoadFromRemote1and1() + public void LoadErrorWithCertificateTrustFailure() + { + var ioc = RemoteCertFailureIoc; //note: this property is defined in "TestLoadDbCredentials.cs" which is deliberately excluded from Git because the credentials are not public! + var app = new TestKp2aApp(); + app.ServerCertificateErrorResponse = false; + app.CreateNewDatabase(); + + bool loadSuccesful = false; + string theMessage = ""; + LoadDb task = new LoadDb(app, ioc, null, CreateKey("test"), null, new ActionOnFinish((success, message) => + { + if (!success) + Android.Util.Log.Debug("KP2ATest", "error loading db: " + message); + loadSuccesful = success; + theMessage = message; + }) + ); + + + ProgressTask pt = new ProgressTask(app, Application.Context, task); + Android.Util.Log.Debug("KP2ATest", "Running ProgressTask"); + pt.Run(); + pt.JoinWorkerThread(); + Android.Util.Log.Debug("KP2ATest", "PT.run finished"); + Assert.IsFalse(loadSuccesful, "database should not be loaded because invalid certificates are not accepted"); + Assert.AreEqual(theMessage, UiStringKey.ErrorOcurred +" "+UiStringKey.CertificateFailure); + + } + + [TestMethod] + public void LoadWithAcceptedCertificateTrustFailure() + { + var ioc = RemoteCertFailureIoc; //note: this property is defined in "TestLoadDbCredentials.cs" which is deliberately excluded from Git because the credentials are not public! + var app = new TestKp2aApp(); + app.ServerCertificateErrorResponse = true; + app.CreateNewDatabase(); + + bool loadSuccesful = false; + LoadDb task = new LoadDb(app, ioc, null, CreateKey("test"), null, new ActionOnFinish((success, message) => + { + if (!success) + Android.Util.Log.Debug("KP2ATest", "error loading db: " + message); + loadSuccesful = success; + }) + ); + ProgressTask pt = new ProgressTask(app, Application.Context, task); + Android.Util.Log.Debug("KP2ATest", "Running ProgressTask"); + pt.Run(); + pt.JoinWorkerThread(); + Android.Util.Log.Debug("KP2ATest", "PT.run finished"); + Assert.IsTrue(loadSuccesful, "database should be loaded because invalid certificates are accepted"); + + } + + [TestMethod] + public void LoadFromRemote1And1() { var ioc = RemoteIoc1and1; //note: this property is defined in "TestLoadDbCredentials.cs" which is deliberately excluded from Git because the credentials are not public! IKp2aApp app = new TestKp2aApp(); app.CreateNewDatabase(); bool loadSuccesful = false; - LoadDb task = new LoadDb(app, ioc, null, "test", null, new ActionOnFinish((success, message) => + LoadDb task = new LoadDb(app, ioc, null, CreateKey("test"), null, new ActionOnFinish((success, message) => { if (!success) Android.Util.Log.Debug("KP2ATest", "error loading db: " + message); @@ -120,7 +178,7 @@ namespace Kp2aUnitTests [TestMethod] - public void LoadFromRemote1and1NonExisting() + public void LoadFromRemote1And1NonExisting() { var ioc = RemoteIoc1and1NonExisting; //note: this property is defined in "TestLoadDbCredentials.cs" which is deliberately excluded from Git because the credentials are not public! IKp2aApp app = new TestKp2aApp(); @@ -128,7 +186,7 @@ namespace Kp2aUnitTests bool loadSuccesful = false; bool gotError = false; - LoadDb task = new LoadDb(app, ioc, null, "test", null, new ActionOnFinish((success, message) => + LoadDb task = new LoadDb(app, ioc, null, CreateKey("test"), null, new ActionOnFinish((success, message) => { if (!success) { @@ -148,7 +206,7 @@ namespace Kp2aUnitTests } [TestMethod] - public void LoadFromRemote1and1WrongCredentials() + public void LoadFromRemote1And1WrongCredentials() { var ioc = RemoteIoc1and1WrongCredentials; //note: this property is defined in "TestLoadDbCredentials.cs" which is deliberately excluded from Git because the credentials are not public! IKp2aApp app = new TestKp2aApp(); @@ -156,7 +214,7 @@ namespace Kp2aUnitTests bool loadSuccesful = false; bool gotError = false; - LoadDb task = new LoadDb(app, ioc, null, "test", null, new ActionOnFinish((success, message) => + LoadDb task = new LoadDb(app, ioc, null, CreateKey("test"), null, new ActionOnFinish((success, message) => { if (!success) { @@ -179,7 +237,7 @@ namespace Kp2aUnitTests [TestMethod] public void FileNotFoundExceptionWithWebDav() { - var fileStorage = new BuiltInFileStorage(); + var fileStorage = new BuiltInFileStorage(new TestKp2aApp()); //should work: using (var stream = fileStorage.OpenFileForRead(RemoteIoc1and1)) diff --git a/src/Kp2aUnitTests/TestSaveDbCached.cs b/src/Kp2aUnitTests/TestSaveDbCached.cs index d341818c..19881800 100644 --- a/src/Kp2aUnitTests/TestSaveDbCached.cs +++ b/src/Kp2aUnitTests/TestSaveDbCached.cs @@ -22,12 +22,12 @@ namespace Kp2aUnitTests class TestSaveDbCached: TestBase { private TestCacheSupervisor _testCacheSupervisor = new TestCacheSupervisor(); - private TestFileStorage _testFileStorage = new TestFileStorage(); + protected override TestKp2aApp CreateTestKp2aApp() { TestKp2aApp app = base.CreateTestKp2aApp(); - app.FileStorage = new CachingFileStorage(_testFileStorage, "/mnt/sdcard/kp2atest/cache/", _testCacheSupervisor); + app.FileStorage = new CachingFileStorage(new TestFileStorage(app), "/mnt/sdcard/kp2atest/cache/", _testCacheSupervisor); return app; } diff --git a/src/Kp2aUnitTests/TestSynchronizeCachedDatabase.cs b/src/Kp2aUnitTests/TestSynchronizeCachedDatabase.cs index 1e8aa792..abd7d18f 100644 --- a/src/Kp2aUnitTests/TestSynchronizeCachedDatabase.cs +++ b/src/Kp2aUnitTests/TestSynchronizeCachedDatabase.cs @@ -19,13 +19,20 @@ namespace Kp2aUnitTests [TestClass] internal class TestSynchronizeCachedDatabase : TestBase { + [TestInitialize] + public void InitTests() + { + TestFileStorage.Offline = false; + } + private TestCacheSupervisor _testCacheSupervisor = new TestCacheSupervisor(); - private TestFileStorage _testFileStorage = new TestFileStorage(); protected override TestKp2aApp CreateTestKp2aApp() { TestKp2aApp app = base.CreateTestKp2aApp(); - app.FileStorage = new CachingFileStorage(_testFileStorage, "/mnt/sdcard/kp2atest/cache/", _testCacheSupervisor); + app.TestFileStorage = new TestFileStorage(app); + + app.FileStorage = new CachingFileStorage(app.TestFileStorage, "/mnt/sdcard/kp2atest/cache/", _testCacheSupervisor); return app; } @@ -58,7 +65,7 @@ namespace Kp2aUnitTests Assert.AreEqual(resultMessage, app.GetResourceString(UiStringKey.FilesInSync)); //go offline: - _testFileStorage.Offline = true; + TestFileStorage.Offline = true; //sync when offline (->error) Synchronize(app, out wasSuccessful, out resultMessage); @@ -73,7 +80,7 @@ namespace Kp2aUnitTests _testCacheSupervisor.AssertSingleCall(TestCacheSupervisor.CouldntSaveToRemoteId); //go online again: - _testFileStorage.Offline = false; + TestFileStorage.Offline = false; //sync with local changes only (-> upload): Synchronize(app, out wasSuccessful, out resultMessage); @@ -81,10 +88,10 @@ namespace Kp2aUnitTests Assert.AreEqual(resultMessage, app.GetResourceString(UiStringKey.SynchronizedDatabaseSuccessfully)); //ensure both files are identical and up to date now: - _testFileStorage.Offline = true; + TestFileStorage.Offline = true; var appOfflineLoaded = LoadDatabase(DefaultFilename, DefaultPassword, DefaultKeyfile); _testCacheSupervisor.AssertSingleCall(TestCacheSupervisor.CouldntOpenFromRemoteId); - _testFileStorage.Offline = false; + TestFileStorage.Offline = false; var appRemoteLoaded = LoadDatabase(DefaultFilename, DefaultPassword, DefaultKeyfile); _testCacheSupervisor.AssertSingleCall(TestCacheSupervisor.LoadedFromRemoteInSyncId); @@ -92,6 +99,8 @@ namespace Kp2aUnitTests AssertDatabasesAreEqual(app.GetDb().KpDatabase, appRemoteLoaded.GetDb().KpDatabase); } + + [TestMethod] public void TestSyncWhenRemoteDeleted() { @@ -133,11 +142,11 @@ namespace Kp2aUnitTests _testCacheSupervisor.AssertSingleCall(TestCacheSupervisor.LoadedFromRemoteInSyncId); var app2 = LoadDatabase(DefaultFilename, DefaultPassword, DefaultKeyfile); - app2.FileStorage = _testFileStorage; //give app2 direct access to the remote file + app2.FileStorage = app.TestFileStorage; //give app2 direct access to the remote file _testCacheSupervisor.AssertSingleCall(TestCacheSupervisor.LoadedFromRemoteInSyncId); //go offline: - _testFileStorage.Offline = true; + TestFileStorage.Offline = true; string resultMessage; @@ -153,7 +162,7 @@ namespace Kp2aUnitTests _testCacheSupervisor.AssertSingleCall(TestCacheSupervisor.CouldntSaveToRemoteId); //go online again: - _testFileStorage.Offline = false; + TestFileStorage.Offline = false; //...and remote only for "app2": SaveDatabase(app2); diff --git a/src/keepass2android/Properties/AndroidManifest_net.xml b/src/keepass2android/Properties/AndroidManifest_net.xml index 0418abea..42221f32 100644 --- a/src/keepass2android/Properties/AndroidManifest_net.xml +++ b/src/keepass2android/Properties/AndroidManifest_net.xml @@ -1,5 +1,5 @@  - + diff --git a/src/keepass2android/Resources/Resource.designer.cs b/src/keepass2android/Resources/Resource.designer.cs index c9d08cc3..c1a968a9 100644 --- a/src/keepass2android/Resources/Resource.designer.cs +++ b/src/keepass2android/Resources/Resource.designer.cs @@ -77,23 +77,29 @@ namespace keepass2android public partial class Array { + // aapt resource value: 0x7f0e0007 + public const int AcceptAllServerCertificates_options = 2131623943; + // aapt resource value: 0x7f0e0002 - public const int clipboard_timeout_options = 2131623938; + public const int AcceptAllServerCertificates_values = 2131623938; + + // aapt resource value: 0x7f0e0003 + public const int clipboard_timeout_options = 2131623939; // aapt resource value: 0x7f0e0000 public const int clipboard_timeout_values = 2131623936; - // aapt resource value: 0x7f0e0004 - public const int cred_remember_modes = 2131623940; + // aapt resource value: 0x7f0e0005 + public const int cred_remember_modes = 2131623941; - // aapt resource value: 0x7f0e0003 - public const int list_size_options = 2131623939; + // aapt resource value: 0x7f0e0004 + public const int list_size_options = 2131623940; // aapt resource value: 0x7f0e0001 public const int list_size_values = 2131623937; - // aapt resource value: 0x7f0e0005 - public const int password_modes = 2131623941; + // aapt resource value: 0x7f0e0006 + public const int password_modes = 2131623942; static Array() { @@ -3280,53 +3286,65 @@ namespace keepass2android public partial class String { - // aapt resource value: 0x7f0800a1 - public const int AboutText = 2131230881; + // aapt resource value: 0x7f0800a3 + public const int AboutText = 2131230883; - // aapt resource value: 0x7f0801a8 - public const int AddingEntry = 2131231144; + // aapt resource value: 0x7f08009e + public const int AcceptAllServerCertificates_default = 2131230878; - // aapt resource value: 0x7f0801a9 - public const int AddingGroup = 2131231145; + // aapt resource value: 0x7f080094 + public const int AcceptAllServerCertificates_key = 2131230868; + + // aapt resource value: 0x7f08018d + public const int AcceptAllServerCertificates_summary = 2131231117; + + // aapt resource value: 0x7f08018c + public const int AcceptAllServerCertificates_title = 2131231116; + + // aapt resource value: 0x7f0801ac + public const int AddingEntry = 2131231148; + + // aapt resource value: 0x7f0801ad + public const int AddingGroup = 2131231149; // aapt resource value: 0x7f080015 public const int ApplicationName = 2131230741; - // aapt resource value: 0x7f08019e - public const int AskDeletePermanentlyEntry = 2131231134; - - // aapt resource value: 0x7f08019f - public const int AskDeletePermanentlyGroup = 2131231135; - - // aapt resource value: 0x7f0801a0 - public const int AskDeletePermanently_title = 2131231136; + // aapt resource value: 0x7f0801a2 + public const int AskDeletePermanentlyEntry = 2131231138; // aapt resource value: 0x7f0801a3 - public const int AskDiscardChanges = 2131231139; + public const int AskDeletePermanentlyGroup = 2131231139; // aapt resource value: 0x7f0801a4 - public const int AskDiscardChanges_title = 2131231140; + public const int AskDeletePermanently_title = 2131231140; - // aapt resource value: 0x7f080198 - public const int AskOverwriteBinary = 2131231128; + // aapt resource value: 0x7f0801a7 + public const int AskDiscardChanges = 2131231143; - // aapt resource value: 0x7f08019b - public const int AskOverwriteBinary_no = 2131231131; - - // aapt resource value: 0x7f080199 - public const int AskOverwriteBinary_title = 2131231129; - - // aapt resource value: 0x7f08019a - public const int AskOverwriteBinary_yes = 2131231130; - - // aapt resource value: 0x7f0801a2 - public const int AskReloadFile = 2131231138; - - // aapt resource value: 0x7f0801a1 - public const int AskReloadFile_title = 2131231137; + // aapt resource value: 0x7f0801a8 + public const int AskDiscardChanges_title = 2131231144; // aapt resource value: 0x7f08019c - public const int AttachFailed = 2131231132; + public const int AskOverwriteBinary = 2131231132; + + // aapt resource value: 0x7f08019f + public const int AskOverwriteBinary_no = 2131231135; + + // aapt resource value: 0x7f08019d + public const int AskOverwriteBinary_title = 2131231133; + + // aapt resource value: 0x7f08019e + public const int AskOverwriteBinary_yes = 2131231134; + + // aapt resource value: 0x7f0801a6 + public const int AskReloadFile = 2131231142; + + // aapt resource value: 0x7f0801a5 + public const int AskReloadFile_title = 2131231141; + + // aapt resource value: 0x7f0801a0 + public const int AttachFailed = 2131231136; // aapt resource value: 0x7f080085 public const int BinaryDirectory_default = 2131230853; @@ -3334,206 +3352,212 @@ namespace keepass2android // aapt resource value: 0x7f080084 public const int BinaryDirectory_key = 2131230852; - // aapt resource value: 0x7f080172 - public const int BinaryDirectory_summary = 2131231090; + // aapt resource value: 0x7f080174 + public const int BinaryDirectory_summary = 2131231092; - // aapt resource value: 0x7f080171 - public const int BinaryDirectory_title = 2131231089; + // aapt resource value: 0x7f080173 + public const int BinaryDirectory_title = 2131231091; - // aapt resource value: 0x7f0801cc - public const int CannotMoveGroupHere = 2131231180; - - // aapt resource value: 0x7f080206 - public const int ChangeLog = 2131231238; - - // aapt resource value: 0x7f080205 - public const int ChangeLog_0_7 = 2131231237; - - // aapt resource value: 0x7f080203 - public const int ChangeLog_0_8 = 2131231235; - - // aapt resource value: 0x7f080202 - public const int ChangeLog_0_8_1 = 2131231234; - - // aapt resource value: 0x7f080201 - public const int ChangeLog_0_8_2 = 2131231233; - - // aapt resource value: 0x7f080200 - public const int ChangeLog_0_8_3 = 2131231232; - - // aapt resource value: 0x7f0801ff - public const int ChangeLog_0_8_4 = 2131231231; + // aapt resource value: 0x7f0801d0 + public const int CannotMoveGroupHere = 2131231184; // aapt resource value: 0x7f0801fe - public const int ChangeLog_0_8_5 = 2131231230; + public const int CertificateFailure = 2131231230; // aapt resource value: 0x7f0801fd - public const int ChangeLog_0_8_6 = 2131231229; + public const int CertificateWarning = 2131231229; - // aapt resource value: 0x7f0801fc - public const int ChangeLog_0_9 = 2131231228; + // aapt resource value: 0x7f08020c + public const int ChangeLog = 2131231244; - // aapt resource value: 0x7f0801fb - public const int ChangeLog_0_9_1 = 2131231227; + // aapt resource value: 0x7f08020b + public const int ChangeLog_0_7 = 2131231243; - // aapt resource value: 0x7f0801fa - public const int ChangeLog_0_9_2 = 2131231226; + // aapt resource value: 0x7f080209 + public const int ChangeLog_0_8 = 2131231241; + + // aapt resource value: 0x7f080208 + public const int ChangeLog_0_8_1 = 2131231240; + + // aapt resource value: 0x7f080207 + public const int ChangeLog_0_8_2 = 2131231239; + + // aapt resource value: 0x7f080206 + public const int ChangeLog_0_8_3 = 2131231238; + + // aapt resource value: 0x7f080205 + public const int ChangeLog_0_8_4 = 2131231237; // aapt resource value: 0x7f080204 - public const int ChangeLog_keptDonate = 2131231236; + public const int ChangeLog_0_8_5 = 2131231236; - // aapt resource value: 0x7f0801f9 - public const int ChangeLog_title = 2131231225; + // aapt resource value: 0x7f080203 + public const int ChangeLog_0_8_6 = 2131231235; - // aapt resource value: 0x7f080094 - public const int CheckForFileChangesOnSave_key = 2131230868; + // aapt resource value: 0x7f080202 + public const int ChangeLog_0_9 = 2131231234; - // aapt resource value: 0x7f08018d - public const int CheckForFileChangesOnSave_summary = 2131231117; + // aapt resource value: 0x7f080201 + public const int ChangeLog_0_9_1 = 2131231233; - // aapt resource value: 0x7f08018c - public const int CheckForFileChangesOnSave_title = 2131231116; + // aapt resource value: 0x7f080200 + public const int ChangeLog_0_9_2 = 2131231232; - // aapt resource value: 0x7f0801bd - public const int CheckingDatabaseForChanges = 2131231165; + // aapt resource value: 0x7f08020a + public const int ChangeLog_keptDonate = 2131231242; - // aapt resource value: 0x7f0801b1 - public const int CheckingTargetFileForChanges = 2131231153; + // aapt resource value: 0x7f0801ff + public const int ChangeLog_title = 2131231231; - // aapt resource value: 0x7f0800bd - public const int ClearClipboard = 2131230909; + // aapt resource value: 0x7f080095 + public const int CheckForFileChangesOnSave_key = 2131230869; - // aapt resource value: 0x7f08018b - public const int ClearOfflineCache_question = 2131231115; + // aapt resource value: 0x7f080191 + public const int CheckForFileChangesOnSave_summary = 2131231121; - // aapt resource value: 0x7f08018a - public const int ClearOfflineCache_title = 2131231114; + // aapt resource value: 0x7f080190 + public const int CheckForFileChangesOnSave_title = 2131231120; - // aapt resource value: 0x7f080098 - public const int CopyToClipboardNotification_key = 2131230872; + // aapt resource value: 0x7f0801c1 + public const int CheckingDatabaseForChanges = 2131231169; - // aapt resource value: 0x7f0801bf - public const int CouldNotLoadFromRemote = 2131231167; + // aapt resource value: 0x7f0801b5 + public const int CheckingTargetFileForChanges = 2131231157; - // aapt resource value: 0x7f0801be - public const int CouldNotSaveToRemote = 2131231166; + // aapt resource value: 0x7f0800bf + public const int ClearClipboard = 2131230911; - // aapt resource value: 0x7f0801ed - public const int CouldntLoadOtpAuxFile = 2131231213; + // aapt resource value: 0x7f08018f + public const int ClearOfflineCache_question = 2131231119; - // aapt resource value: 0x7f0801ee - public const int CouldntLoadOtpAuxFile_Hint = 2131231214; + // aapt resource value: 0x7f08018e + public const int ClearOfflineCache_title = 2131231118; - // aapt resource value: 0x7f0801f4 - public const int CouldntParseOtpSecret = 2131231220; + // aapt resource value: 0x7f080099 + public const int CopyToClipboardNotification_key = 2131230873; - // aapt resource value: 0x7f0800a2 - public const int CreditsText = 2131230882; + // aapt resource value: 0x7f0801c3 + public const int CouldNotLoadFromRemote = 2131231171; + + // aapt resource value: 0x7f0801c2 + public const int CouldNotSaveToRemote = 2131231170; + + // aapt resource value: 0x7f0801f1 + public const int CouldntLoadOtpAuxFile = 2131231217; + + // aapt resource value: 0x7f0801f2 + public const int CouldntLoadOtpAuxFile_Hint = 2131231218; + + // aapt resource value: 0x7f0801f8 + public const int CouldntParseOtpSecret = 2131231224; + + // aapt resource value: 0x7f0800a4 + public const int CreditsText = 2131230884; + + // aapt resource value: 0x7f0801b3 + public const int DecodingDatabase = 2131231155; + + // aapt resource value: 0x7f0801ae + public const int DeletingEntry = 2131231150; // aapt resource value: 0x7f0801af - public const int DecodingDatabase = 2131231151; + public const int DeletingGroup = 2131231151; - // aapt resource value: 0x7f0801aa - public const int DeletingEntry = 2131231146; + // aapt resource value: 0x7f0801bc + public const int DownloadingRemoteFile = 2131231164; - // aapt resource value: 0x7f0801ab - public const int DeletingGroup = 2131231147; + // aapt resource value: 0x7f0801ce + public const int ErrorOcurred = 2131231182; - // aapt resource value: 0x7f0801b8 - public const int DownloadingRemoteFile = 2131231160; + // aapt resource value: 0x7f0801fa + public const int ErrorUpdatingOtpAuxFile = 2131231226; - // aapt resource value: 0x7f0801ca - public const int ErrorOcurred = 2131231178; - - // aapt resource value: 0x7f0801f6 - public const int ErrorUpdatingOtpAuxFile = 2131231222; - - // aapt resource value: 0x7f0800ba - public const int FileHandling_prefs = 2131230906; + // aapt resource value: 0x7f0800bc + public const int FileHandling_prefs = 2131230908; // aapt resource value: 0x7f08008a public const int FileHandling_prefs_key = 2131230858; - // aapt resource value: 0x7f0800ef - public const int FileNotFound = 2131230959; + // aapt resource value: 0x7f0800f1 + public const int FileNotFound = 2131230961; - // aapt resource value: 0x7f0801bb - public const int FilesInSync = 2131231163; + // aapt resource value: 0x7f0801bf + public const int FilesInSync = 2131231167; - // aapt resource value: 0x7f080100 - public const int InvalidPassword = 2131230976; + // aapt resource value: 0x7f080102 + public const int InvalidPassword = 2131230978; // aapt resource value: 0x7f080090 public const int LastInfoVersionCode_key = 2131230864; - // aapt resource value: 0x7f0801c2 - public const int LoadedFromRemoteInSync = 2131231170; + // aapt resource value: 0x7f0801c6 + public const int LoadedFromRemoteInSync = 2131231174; // aapt resource value: 0x7f080092 public const int LockWhenScreenOff_key = 2131230866; - // aapt resource value: 0x7f080187 - public const int LockWhenScreenOff_summary = 2131231111; + // aapt resource value: 0x7f080189 + public const int LockWhenScreenOff_summary = 2131231113; - // aapt resource value: 0x7f080186 - public const int LockWhenScreenOff_title = 2131231110; + // aapt resource value: 0x7f080188 + public const int LockWhenScreenOff_title = 2131231112; - // aapt resource value: 0x7f080095 - public const int MarketURL = 2131230869; + // aapt resource value: 0x7f080096 + public const int MarketURL = 2131230870; - // aapt resource value: 0x7f08010a - public const int MaskedPassword = 2131230986; + // aapt resource value: 0x7f08010c + public const int MaskedPassword = 2131230988; - // aapt resource value: 0x7f0801b3 - public const int MessageSyncQuestion = 2131231155; + // aapt resource value: 0x7f0801b7 + public const int MessageSyncQuestion = 2131231159; - // aapt resource value: 0x7f0801b6 - public const int NoOverwrite = 2131231158; + // aapt resource value: 0x7f0801ba + public const int NoOverwrite = 2131231162; - // aapt resource value: 0x7f0801c1 - public const int NotifyOpenFromLocalDueToConflict = 2131231169; + // aapt resource value: 0x7f0801c5 + public const int NotifyOpenFromLocalDueToConflict = 2131231173; - // aapt resource value: 0x7f08009a - public const int OpenKp2aKeyboardAutomatically_key = 2131230874; - - // aapt resource value: 0x7f080193 - public const int OpenKp2aKeyboardAutomatically_summary = 2131231123; - - // aapt resource value: 0x7f080192 - public const int OpenKp2aKeyboardAutomatically_title = 2131231122; - - // aapt resource value: 0x7f0801f5 - public const int OtpKeyError = 2131231221; - - // aapt resource value: 0x7f0801b0 - public const int ParsingDatabase = 2131231152; - - // aapt resource value: 0x7f08009e - public const int PreloadDatabaseEnabled_key = 2131230878; + // aapt resource value: 0x7f08009b + public const int OpenKp2aKeyboardAutomatically_key = 2131230875; // aapt resource value: 0x7f080197 - public const int PreloadDatabaseEnabled_summary = 2131231127; + public const int OpenKp2aKeyboardAutomatically_summary = 2131231127; // aapt resource value: 0x7f080196 - public const int PreloadDatabaseEnabled_title = 2131231126; + public const int OpenKp2aKeyboardAutomatically_title = 2131231126; + + // aapt resource value: 0x7f0801f9 + public const int OtpKeyError = 2131231225; + + // aapt resource value: 0x7f0801b4 + public const int ParsingDatabase = 2131231156; + + // aapt resource value: 0x7f0800a0 + public const int PreloadDatabaseEnabled_key = 2131230880; + + // aapt resource value: 0x7f08019b + public const int PreloadDatabaseEnabled_summary = 2131231131; + + // aapt resource value: 0x7f08019a + public const int PreloadDatabaseEnabled_title = 2131231130; // aapt resource value: 0x7f08008b public const int QuickUnlockDefaultEnabled_key = 2131230859; - // aapt resource value: 0x7f08016b - public const int QuickUnlockDefaultEnabled_summary = 2131231083; + // aapt resource value: 0x7f08016d + public const int QuickUnlockDefaultEnabled_summary = 2131231085; - // aapt resource value: 0x7f08016a - public const int QuickUnlockDefaultEnabled_title = 2131231082; + // aapt resource value: 0x7f08016c + public const int QuickUnlockDefaultEnabled_title = 2131231084; // aapt resource value: 0x7f08008e public const int QuickUnlockIconHidden_key = 2131230862; - // aapt resource value: 0x7f08016d - public const int QuickUnlockIconHidden_summary = 2131231085; + // aapt resource value: 0x7f08016f + public const int QuickUnlockIconHidden_summary = 2131231087; - // aapt resource value: 0x7f08016c - public const int QuickUnlockIconHidden_title = 2131231084; + // aapt resource value: 0x7f08016e + public const int QuickUnlockIconHidden_title = 2131231086; // aapt resource value: 0x7f08008d public const int QuickUnlockLength_default = 2131230861; @@ -3541,152 +3565,152 @@ namespace keepass2android // aapt resource value: 0x7f08008c public const int QuickUnlockLength_key = 2131230860; - // aapt resource value: 0x7f08016f - public const int QuickUnlockLength_summary = 2131231087; - - // aapt resource value: 0x7f08016e - public const int QuickUnlockLength_title = 2131231086; - - // aapt resource value: 0x7f080168 - public const int QuickUnlock_button = 2131231080; + // aapt resource value: 0x7f080171 + public const int QuickUnlockLength_summary = 2131231089; // aapt resource value: 0x7f080170 - public const int QuickUnlock_fail = 2131231088; + public const int QuickUnlockLength_title = 2131231088; - // aapt resource value: 0x7f080167 - public const int QuickUnlock_label = 2131231079; + // aapt resource value: 0x7f08016a + public const int QuickUnlock_button = 2131231082; + + // aapt resource value: 0x7f080172 + public const int QuickUnlock_fail = 2131231090; // aapt resource value: 0x7f080169 - public const int QuickUnlock_lockButton = 2131231081; + public const int QuickUnlock_label = 2131231081; - // aapt resource value: 0x7f0800b9 - public const int QuickUnlock_prefs = 2131230905; + // aapt resource value: 0x7f08016b + public const int QuickUnlock_lockButton = 2131231083; + + // aapt resource value: 0x7f0800bb + public const int QuickUnlock_prefs = 2131230907; // aapt resource value: 0x7f080089 public const int QuickUnlock_prefs_key = 2131230857; - // aapt resource value: 0x7f08019d - public const int RecycleBin = 2131231133; + // aapt resource value: 0x7f0801a1 + public const int RecycleBin = 2131231137; // aapt resource value: 0x7f080081 public const int RememberRecentFiles_key = 2131230849; - // aapt resource value: 0x7f08015b - public const int RememberRecentFiles_summary = 2131231067; + // aapt resource value: 0x7f08015d + public const int RememberRecentFiles_summary = 2131231069; - // aapt resource value: 0x7f08015a - public const int RememberRecentFiles_title = 2131231066; + // aapt resource value: 0x7f08015c + public const int RememberRecentFiles_title = 2131231068; - // aapt resource value: 0x7f0801c4 - public const int RemoteDatabaseUnchanged = 2131231172; + // aapt resource value: 0x7f0801c8 + public const int RemoteDatabaseUnchanged = 2131231176; - // aapt resource value: 0x7f0801c6 - public const int ResolvedCacheConflictByUsingLocalOtpAux = 2131231174; + // aapt resource value: 0x7f0801ca + public const int ResolvedCacheConflictByUsingLocalOtpAux = 2131231178; - // aapt resource value: 0x7f0801c5 - public const int ResolvedCacheConflictByUsingRemoteOtpAux = 2131231173; + // aapt resource value: 0x7f0801c9 + public const int ResolvedCacheConflictByUsingRemoteOtpAux = 2131231177; - // aapt resource value: 0x7f0801ba - public const int RestoringRemoteFile = 2131231162; - - // aapt resource value: 0x7f080176 - public const int SaveAttachmentDialog_open = 2131231094; - - // aapt resource value: 0x7f080175 - public const int SaveAttachmentDialog_save = 2131231093; - - // aapt resource value: 0x7f080174 - public const int SaveAttachmentDialog_text = 2131231092; - - // aapt resource value: 0x7f080173 - public const int SaveAttachmentDialog_title = 2131231091; + // aapt resource value: 0x7f0801be + public const int RestoringRemoteFile = 2131231166; // aapt resource value: 0x7f080178 - public const int SaveAttachment_Failed = 2131231096; + public const int SaveAttachmentDialog_open = 2131231096; // aapt resource value: 0x7f080177 - public const int SaveAttachment_doneMessage = 2131231095; + public const int SaveAttachmentDialog_save = 2131231095; - // aapt resource value: 0x7f0801f7 - public const int SavingOtpAuxFile = 2131231223; + // aapt resource value: 0x7f080176 + public const int SaveAttachmentDialog_text = 2131231094; - // aapt resource value: 0x7f0801ac - public const int SettingPassword = 2131231148; + // aapt resource value: 0x7f080175 + public const int SaveAttachmentDialog_title = 2131231093; - // aapt resource value: 0x7f08018f - public const int ShowCopyToClipboardNotification_summary = 2131231119; + // aapt resource value: 0x7f08017a + public const int SaveAttachment_Failed = 2131231098; - // aapt resource value: 0x7f08018e - public const int ShowCopyToClipboardNotification_title = 2131231118; + // aapt resource value: 0x7f080179 + public const int SaveAttachment_doneMessage = 2131231097; - // aapt resource value: 0x7f080191 - public const int ShowKp2aKeyboardNotification_summary = 2131231121; + // aapt resource value: 0x7f0801fb + public const int SavingOtpAuxFile = 2131231227; - // aapt resource value: 0x7f080190 - public const int ShowKp2aKeyboardNotification_title = 2131231120; + // aapt resource value: 0x7f0801b0 + public const int SettingPassword = 2131231152; - // aapt resource value: 0x7f08009d - public const int ShowUnlockedNotification_key = 2131230877; + // aapt resource value: 0x7f080193 + public const int ShowCopyToClipboardNotification_summary = 2131231123; + + // aapt resource value: 0x7f080192 + public const int ShowCopyToClipboardNotification_title = 2131231122; // aapt resource value: 0x7f080195 - public const int ShowUnlockedNotification_summary = 2131231125; + public const int ShowKp2aKeyboardNotification_summary = 2131231125; // aapt resource value: 0x7f080194 - public const int ShowUnlockedNotification_title = 2131231124; + public const int ShowKp2aKeyboardNotification_title = 2131231124; + + // aapt resource value: 0x7f08009f + public const int ShowUnlockedNotification_key = 2131230879; + + // aapt resource value: 0x7f080199 + public const int ShowUnlockedNotification_summary = 2131231129; + + // aapt resource value: 0x7f080198 + public const int ShowUnlockedNotification_title = 2131231128; // aapt resource value: 0x7f080080 public const int ShowUsernameInList_key = 2131230848; - // aapt resource value: 0x7f080159 - public const int ShowUsernameInList_summary = 2131231065; + // aapt resource value: 0x7f08015b + public const int ShowUsernameInList_summary = 2131231067; - // aapt resource value: 0x7f080158 - public const int ShowUsernameInList_title = 2131231064; + // aapt resource value: 0x7f08015a + public const int ShowUsernameInList_title = 2131231066; - // aapt resource value: 0x7f080096 - public const int SuggestionsURL = 2131230870; + // aapt resource value: 0x7f080097 + public const int SuggestionsURL = 2131230871; - // aapt resource value: 0x7f0801bc - public const int SynchronizedDatabaseSuccessfully = 2131231164; + // aapt resource value: 0x7f0801c0 + public const int SynchronizedDatabaseSuccessfully = 2131231168; - // aapt resource value: 0x7f0801b7 - public const int SynchronizingCachedDatabase = 2131231159; + // aapt resource value: 0x7f0801bb + public const int SynchronizingCachedDatabase = 2131231163; - // aapt resource value: 0x7f0801b4 - public const int SynchronizingDatabase = 2131231156; + // aapt resource value: 0x7f0801b8 + public const int SynchronizingDatabase = 2131231160; - // aapt resource value: 0x7f0801c7 - public const int SynchronizingOtpAuxFile = 2131231175; + // aapt resource value: 0x7f0801cb + public const int SynchronizingOtpAuxFile = 2131231179; // aapt resource value: 0x7f08007f public const int TanExpiresOnUse_key = 2131230847; - // aapt resource value: 0x7f080157 - public const int TanExpiresOnUse_summary = 2131231063; + // aapt resource value: 0x7f080159 + public const int TanExpiresOnUse_summary = 2131231065; - // aapt resource value: 0x7f080156 - public const int TanExpiresOnUse_title = 2131231062; + // aapt resource value: 0x7f080158 + public const int TanExpiresOnUse_title = 2131231064; + + // aapt resource value: 0x7f0801b6 + public const int TitleSyncQuestion = 2131231158; // aapt resource value: 0x7f0801b2 - public const int TitleSyncQuestion = 2131231154; + public const int TransformingKey = 2131231154; - // aapt resource value: 0x7f0801ae - public const int TransformingKey = 2131231150; + // aapt resource value: 0x7f080098 + public const int TranslationURL = 2131230872; - // aapt resource value: 0x7f080097 - public const int TranslationURL = 2131230871; + // aapt resource value: 0x7f0801b1 + public const int UndoingChanges = 2131231153; - // aapt resource value: 0x7f0801ad - public const int UndoingChanges = 2131231149; + // aapt resource value: 0x7f0801c7 + public const int UpdatedCachedFileOnLoad = 2131231175; - // aapt resource value: 0x7f0801c3 - public const int UpdatedCachedFileOnLoad = 2131231171; + // aapt resource value: 0x7f0801c4 + public const int UpdatedRemoteFileOnLoad = 2131231172; - // aapt resource value: 0x7f0801c0 - public const int UpdatedRemoteFileOnLoad = 2131231168; - - // aapt resource value: 0x7f0801b9 - public const int UploadingFile = 2131231161; + // aapt resource value: 0x7f0801bd + public const int UploadingFile = 2131231165; // aapt resource value: 0x7f08008f public const int UsageCount_key = 2131230863; @@ -3694,26 +3718,26 @@ namespace keepass2android // aapt resource value: 0x7f080091 public const int UseFileTransactions_key = 2131230865; - // aapt resource value: 0x7f080185 - public const int UseFileTransactions_summary = 2131231109; + // aapt resource value: 0x7f080187 + public const int UseFileTransactions_summary = 2131231111; - // aapt resource value: 0x7f080184 - public const int UseFileTransactions_title = 2131231108; + // aapt resource value: 0x7f080186 + public const int UseFileTransactions_title = 2131231110; - // aapt resource value: 0x7f080099 - public const int UseKp2aKeyboard_key = 2131230873; + // aapt resource value: 0x7f08009a + public const int UseKp2aKeyboard_key = 2131230874; // aapt resource value: 0x7f080093 public const int UseOfflineCache_key = 2131230867; - // aapt resource value: 0x7f080189 - public const int UseOfflineCache_summary = 2131231113; + // aapt resource value: 0x7f08018b + public const int UseOfflineCache_summary = 2131231115; - // aapt resource value: 0x7f080188 - public const int UseOfflineCache_title = 2131231112; + // aapt resource value: 0x7f08018a + public const int UseOfflineCache_title = 2131231114; - // aapt resource value: 0x7f0801b5 - public const int YesSynchronize = 2131231157; + // aapt resource value: 0x7f0801b9 + public const int YesSynchronize = 2131231161; // aapt resource value: 0x7f080021 public const int abc_action_bar_home_description = 2131230753; @@ -3754,32 +3778,32 @@ namespace keepass2android // aapt resource value: 0x7f08002b public const int abc_shareactionprovider_share_with_application = 2131230763; - // aapt resource value: 0x7f08009f - public const int about_feedback = 2131230879; + // aapt resource value: 0x7f0800a1 + public const int about_feedback = 2131230881; - // aapt resource value: 0x7f0800a0 - public const int about_homepage = 2131230880; - - // aapt resource value: 0x7f0800a3 - public const int accept = 2131230883; - - // aapt resource value: 0x7f08017e - public const int add_binary = 2131231102; - - // aapt resource value: 0x7f0800a4 - public const int add_entry = 2131230884; - - // aapt resource value: 0x7f08017f - public const int add_extra_string = 2131231103; - - // aapt resource value: 0x7f0800a6 - public const int add_group = 2131230886; - - // aapt resource value: 0x7f0800a7 - public const int add_group_title = 2131230887; + // aapt resource value: 0x7f0800a2 + public const int about_homepage = 2131230882; // aapt resource value: 0x7f0800a5 - public const int add_url_entry = 2131230885; + public const int accept = 2131230885; + + // aapt resource value: 0x7f080180 + public const int add_binary = 2131231104; + + // aapt resource value: 0x7f0800a6 + public const int add_entry = 2131230886; + + // aapt resource value: 0x7f080181 + public const int add_extra_string = 2131231105; + + // aapt resource value: 0x7f0800a8 + public const int add_group = 2131230888; + + // aapt resource value: 0x7f0800a9 + public const int add_group_title = 2131230889; + + // aapt resource value: 0x7f0800a7 + public const int add_url_entry = 2131230887; // aapt resource value: 0x7f080067 public const int afc_bullet = 2131230823; @@ -3961,11 +3985,11 @@ namespace keepass2android // aapt resource value: 0x7f080066 public const int afc_yesterday = 2131230822; - // aapt resource value: 0x7f0800a9 - public const int algorithm = 2131230889; + // aapt resource value: 0x7f0800ab + public const int algorithm = 2131230891; - // aapt resource value: 0x7f0800aa - public const int algorithm_colon = 2131230890; + // aapt resource value: 0x7f0800ac + public const int algorithm_colon = 2131230892; // aapt resource value: 0x7f080073 public const int algorithm_key = 2131230835; @@ -3973,26 +3997,26 @@ namespace keepass2android // aapt resource value: 0x7f080074 public const int app_key = 2131230836; - // aapt resource value: 0x7f0800ab - public const int app_name = 2131230891; - // aapt resource value: 0x7f0800ad - public const int app_name_nonet = 2131230893; + public const int app_name = 2131230893; // aapt resource value: 0x7f0800af - public const int app_timeout = 2131230895; + public const int app_name_nonet = 2131230895; + + // aapt resource value: 0x7f0800b1 + public const int app_timeout = 2131230897; // aapt resource value: 0x7f080075 public const int app_timeout_key = 2131230837; - // aapt resource value: 0x7f0800b0 - public const int app_timeout_summary = 2131230896; + // aapt resource value: 0x7f0800b2 + public const int app_timeout_summary = 2131230898; - // aapt resource value: 0x7f0800b4 - public const int application = 2131230900; + // aapt resource value: 0x7f0800b6 + public const int application = 2131230902; - // aapt resource value: 0x7f0800b5 - public const int application_settings = 2131230901; + // aapt resource value: 0x7f0800b7 + public const int application_settings = 2131230903; // aapt resource value: 0x7f080010 public const int auth_client_needs_enabling_title = 2131230736; @@ -4012,38 +4036,38 @@ namespace keepass2android // aapt resource value: 0x7f08000f public const int auth_client_using_bad_version_title = 2131230735; - // aapt resource value: 0x7f08014f - public const int author = 2131231055; + // aapt resource value: 0x7f080151 + public const int author = 2131231057; - // aapt resource value: 0x7f0800c2 - public const int available_through_keyboard = 2131230914; + // aapt resource value: 0x7f0800c4 + public const int available_through_keyboard = 2131230916; - // aapt resource value: 0x7f0800bb - public const int brackets = 2131230907; + // aapt resource value: 0x7f0800bd + public const int brackets = 2131230909; - // aapt resource value: 0x7f0801e1 - public const int button_change_location = 2131231201; + // aapt resource value: 0x7f0801e5 + public const int button_change_location = 2131231205; - // aapt resource value: 0x7f0800bc - public const int cancel = 2131230908; + // aapt resource value: 0x7f0800be + public const int cancel = 2131230910; - // aapt resource value: 0x7f08015f - public const int caseSensitive = 2131231071; + // aapt resource value: 0x7f080161 + public const int caseSensitive = 2131231073; // aapt resource value: 0x7f080018 public const int change_entry = 2131230744; - // aapt resource value: 0x7f0800be - public const int clipboard_timeout = 2131230910; + // aapt resource value: 0x7f0800c0 + public const int clipboard_timeout = 2131230912; - // aapt resource value: 0x7f08009b - public const int clipboard_timeout_default = 2131230875; + // aapt resource value: 0x7f08009c + public const int clipboard_timeout_default = 2131230876; // aapt resource value: 0x7f080077 public const int clipboard_timeout_key = 2131230839; - // aapt resource value: 0x7f0800bf - public const int clipboard_timeout_summary = 2131230911; + // aapt resource value: 0x7f0800c1 + public const int clipboard_timeout_summary = 2131230913; // aapt resource value: 0x7f080006 public const int common_google_play_services_enable_button = 2131230726; @@ -4090,53 +4114,53 @@ namespace keepass2android // aapt resource value: 0x7f08000e public const int common_signin_button_text_long = 2131230734; - // aapt resource value: 0x7f080154 - public const int contributors = 2131231060; + // aapt resource value: 0x7f080156 + public const int contributors = 2131231062; - // aapt resource value: 0x7f0800c1 - public const int copy_password = 2131230913; + // aapt resource value: 0x7f0800c3 + public const int copy_password = 2131230915; - // aapt resource value: 0x7f0800c0 - public const int copy_username = 2131230912; + // aapt resource value: 0x7f0800c2 + public const int copy_username = 2131230914; - // aapt resource value: 0x7f08012e - public const int create_database = 2131231022; - - // aapt resource value: 0x7f0800c5 - public const int creating_db_key = 2131230917; - - // aapt resource value: 0x7f080183 - public const int credentials_dialog_title = 2131231107; - - // aapt resource value: 0x7f080152 - public const int credit_android_filechooser = 2131231058; - - // aapt resource value: 0x7f080151 - public const int credit_plugin1 = 2131231057; - - // aapt resource value: 0x7f0800c6 - public const int current_group = 2131230918; + // aapt resource value: 0x7f080130 + public const int create_database = 2131231024; // aapt resource value: 0x7f0800c7 - public const int current_group_root = 2131230919; + public const int creating_db_key = 2131230919; + + // aapt resource value: 0x7f080185 + public const int credentials_dialog_title = 2131231109; + + // aapt resource value: 0x7f080154 + public const int credit_android_filechooser = 2131231060; + + // aapt resource value: 0x7f080153 + public const int credit_plugin1 = 2131231059; // aapt resource value: 0x7f0800c8 - public const int database = 2131230920; + public const int current_group = 2131230920; - // aapt resource value: 0x7f0801c8 - public const int database_file = 2131231176; + // aapt resource value: 0x7f0800c9 + public const int current_group_root = 2131230921; - // aapt resource value: 0x7f080181 - public const int database_loaded_quickunlock_enabled = 2131231105; + // aapt resource value: 0x7f0800ca + public const int database = 2131230922; - // aapt resource value: 0x7f080182 - public const int database_loaded_unlocked = 2131231106; + // aapt resource value: 0x7f0801cc + public const int database_file = 2131231180; - // aapt resource value: 0x7f0801de - public const int database_location = 2131231198; + // aapt resource value: 0x7f080183 + public const int database_loaded_quickunlock_enabled = 2131231107; - // aapt resource value: 0x7f080138 - public const int database_name = 2131231032; + // aapt resource value: 0x7f080184 + public const int database_loaded_unlocked = 2131231108; + + // aapt resource value: 0x7f0801e2 + public const int database_location = 2131231202; + + // aapt resource value: 0x7f08013a + public const int database_name = 2131231034; // aapt resource value: 0x7f080083 public const int database_name_key = 2131230851; @@ -4147,281 +4171,281 @@ namespace keepass2android // aapt resource value: 0x7f08006a public const int default_file_path = 2131230826; - // aapt resource value: 0x7f080139 - public const int default_username = 2131231033; + // aapt resource value: 0x7f08013b + public const int default_username = 2131231035; // aapt resource value: 0x7f080082 public const int default_username_key = 2131230850; - // aapt resource value: 0x7f080180 - public const int delete_extra_string = 2131231104; + // aapt resource value: 0x7f080182 + public const int delete_extra_string = 2131231106; - // aapt resource value: 0x7f0800c9 - public const int digits = 2131230921; + // aapt resource value: 0x7f0800cb + public const int digits = 2131230923; - // aapt resource value: 0x7f0800ca - public const int disclaimer_formal = 2131230922; + // aapt resource value: 0x7f0800cc + public const int disclaimer_formal = 2131230924; - // aapt resource value: 0x7f0800b7 - public const int display_prefs = 2131230903; + // aapt resource value: 0x7f0800b9 + public const int display_prefs = 2131230905; // aapt resource value: 0x7f080088 public const int display_prefs_key = 2131230856; - // aapt resource value: 0x7f0801cd - public const int donate_question = 2131231181; + // aapt resource value: 0x7f0801d1 + public const int donate_question = 2131231185; // aapt resource value: 0x7f08006b public const int donate_url = 2131230827; - // aapt resource value: 0x7f0800a8 - public const int edit_group_title = 2131230888; - - // aapt resource value: 0x7f0800cb - public const int ellipsis = 2131230923; - - // aapt resource value: 0x7f080166 - public const int enable_quickunlock = 2131231078; - - // aapt resource value: 0x7f0800cc - public const int enter_filename = 2131230924; - - // aapt resource value: 0x7f080165 - public const int enter_filename_details_create_import = 2131231077; - - // aapt resource value: 0x7f080164 - public const int enter_filename_details_url = 2131231076; + // aapt resource value: 0x7f0800aa + public const int edit_group_title = 2131230890; // aapt resource value: 0x7f0800cd - public const int entry_accessed = 2131230925; + public const int ellipsis = 2131230925; - // aapt resource value: 0x7f0800dd - public const int entry_binaries = 2131230941; + // aapt resource value: 0x7f080168 + public const int enable_quickunlock = 2131231080; // aapt resource value: 0x7f0800ce - public const int entry_cancel = 2131230926; + public const int enter_filename = 2131230926; + + // aapt resource value: 0x7f080167 + public const int enter_filename_details_create_import = 2131231079; + + // aapt resource value: 0x7f080166 + public const int enter_filename_details_url = 2131231078; // aapt resource value: 0x7f0800cf - public const int entry_comment = 2131230927; - - // aapt resource value: 0x7f0800d2 - public const int entry_confpassword = 2131230930; - - // aapt resource value: 0x7f0800d3 - public const int entry_created = 2131230931; - - // aapt resource value: 0x7f0800d4 - public const int entry_expires = 2131230932; - - // aapt resource value: 0x7f0800dc - public const int entry_extra_strings = 2131230940; - - // aapt resource value: 0x7f0800d5 - public const int entry_keyfile = 2131230933; - - // aapt resource value: 0x7f0800d6 - public const int entry_modified = 2131230934; - - // aapt resource value: 0x7f0800d1 - public const int entry_override_url = 2131230929; - - // aapt resource value: 0x7f0800d7 - public const int entry_password = 2131230935; - - // aapt resource value: 0x7f0800d8 - public const int entry_save = 2131230936; - - // aapt resource value: 0x7f0800d0 - public const int entry_tags = 2131230928; - - // aapt resource value: 0x7f0800d9 - public const int entry_title = 2131230937; - - // aapt resource value: 0x7f0800da - public const int entry_url = 2131230938; - - // aapt resource value: 0x7f0800db - public const int entry_user_name = 2131230939; - - // aapt resource value: 0x7f0801e9 - public const int error_adding_keyfile = 2131231209; - - // aapt resource value: 0x7f0800de - public const int error_can_not_handle_uri = 2131230942; + public const int entry_accessed = 2131230927; // aapt resource value: 0x7f0800df - public const int error_could_not_create_group = 2131230943; + public const int entry_binaries = 2131230943; + + // aapt resource value: 0x7f0800d0 + public const int entry_cancel = 2131230928; + + // aapt resource value: 0x7f0800d1 + public const int entry_comment = 2131230929; + + // aapt resource value: 0x7f0800d4 + public const int entry_confpassword = 2131230932; + + // aapt resource value: 0x7f0800d5 + public const int entry_created = 2131230933; + + // aapt resource value: 0x7f0800d6 + public const int entry_expires = 2131230934; + + // aapt resource value: 0x7f0800de + public const int entry_extra_strings = 2131230942; + + // aapt resource value: 0x7f0800d7 + public const int entry_keyfile = 2131230935; + + // aapt resource value: 0x7f0800d8 + public const int entry_modified = 2131230936; + + // aapt resource value: 0x7f0800d3 + public const int entry_override_url = 2131230931; + + // aapt resource value: 0x7f0800d9 + public const int entry_password = 2131230937; + + // aapt resource value: 0x7f0800da + public const int entry_save = 2131230938; + + // aapt resource value: 0x7f0800d2 + public const int entry_tags = 2131230930; + + // aapt resource value: 0x7f0800db + public const int entry_title = 2131230939; + + // aapt resource value: 0x7f0800dc + public const int entry_url = 2131230940; + + // aapt resource value: 0x7f0800dd + public const int entry_user_name = 2131230941; + + // aapt resource value: 0x7f0801ed + public const int error_adding_keyfile = 2131231213; // aapt resource value: 0x7f0800e0 - public const int error_could_not_create_parent = 2131230944; + public const int error_can_not_handle_uri = 2131230944; // aapt resource value: 0x7f0800e1 - public const int error_database_exists = 2131230945; + public const int error_could_not_create_group = 2131230945; // aapt resource value: 0x7f0800e2 - public const int error_database_settings = 2131230946; + public const int error_could_not_create_parent = 2131230946; // aapt resource value: 0x7f0800e3 - public const int error_failed_to_launch_link = 2131230947; - - // aapt resource value: 0x7f0800e5 - public const int error_file_not_create = 2131230949; + public const int error_database_exists = 2131230947; // aapt resource value: 0x7f0800e4 - public const int error_filename_required = 2131230948; + public const int error_database_settings = 2131230948; - // aapt resource value: 0x7f0800e6 - public const int error_invalid_db = 2131230950; - - // aapt resource value: 0x7f080179 - public const int error_invalid_expiry_date = 2131231097; + // aapt resource value: 0x7f0800e5 + public const int error_failed_to_launch_link = 2131230949; // aapt resource value: 0x7f0800e7 - public const int error_invalid_path = 2131230951; + public const int error_file_not_create = 2131230951; + + // aapt resource value: 0x7f0800e6 + public const int error_filename_required = 2131230950; // aapt resource value: 0x7f0800e8 - public const int error_no_name = 2131230952; - - // aapt resource value: 0x7f0800e9 - public const int error_nopass = 2131230953; - - // aapt resource value: 0x7f0800ea - public const int error_pass_gen_type = 2131230954; - - // aapt resource value: 0x7f0800eb - public const int error_pass_match = 2131230955; - - // aapt resource value: 0x7f0800ec - public const int error_rounds_not_number = 2131230956; - - // aapt resource value: 0x7f08017a - public const int error_string_key = 2131231098; - - // aapt resource value: 0x7f0800ed - public const int error_title_required = 2131230957; - - // aapt resource value: 0x7f0800ee - public const int error_wrong_length = 2131230958; - - // aapt resource value: 0x7f08015d - public const int excludeExpiredEntries = 2131231069; + public const int error_invalid_db = 2131230952; // aapt resource value: 0x7f08017b - public const int field_name = 2131231099; + public const int error_invalid_expiry_date = 2131231099; + + // aapt resource value: 0x7f0800e9 + public const int error_invalid_path = 2131230953; + + // aapt resource value: 0x7f0800ea + public const int error_no_name = 2131230954; + + // aapt resource value: 0x7f0800eb + public const int error_nopass = 2131230955; + + // aapt resource value: 0x7f0800ec + public const int error_pass_gen_type = 2131230956; + + // aapt resource value: 0x7f0800ed + public const int error_pass_match = 2131230957; + + // aapt resource value: 0x7f0800ee + public const int error_rounds_not_number = 2131230958; // aapt resource value: 0x7f08017c - public const int field_value = 2131231100; + public const int error_string_key = 2131231100; + + // aapt resource value: 0x7f0800ef + public const int error_title_required = 2131230959; // aapt resource value: 0x7f0800f0 - public const int file_browser = 2131230960; + public const int error_wrong_length = 2131230960; + + // aapt resource value: 0x7f08015f + public const int excludeExpiredEntries = 2131231071; + + // aapt resource value: 0x7f08017d + public const int field_name = 2131231101; + + // aapt resource value: 0x7f08017e + public const int field_value = 2131231102; + + // aapt resource value: 0x7f0800f2 + public const int file_browser = 2131230962; + + // aapt resource value: 0x7f0801e1 + public const int filestorage_setup_title = 2131231201; // aapt resource value: 0x7f0801dd - public const int filestorage_setup_title = 2131231197; - - // aapt resource value: 0x7f0801d9 - public const int filestoragehelp_dropboxKP2A = 2131231193; - - // aapt resource value: 0x7f0801d2 - public const int filestoragename_androidget = 2131231186; - - // aapt resource value: 0x7f0801d3 - public const int filestoragename_androidsend = 2131231187; - - // aapt resource value: 0x7f0801d7 - public const int filestoragename_dropbox = 2131231191; - - // aapt resource value: 0x7f0801d8 - public const int filestoragename_dropboxKP2A = 2131231192; - - // aapt resource value: 0x7f0801d1 - public const int filestoragename_file = 2131231185; - - // aapt resource value: 0x7f0801d4 - public const int filestoragename_ftp = 2131231188; - - // aapt resource value: 0x7f0801da - public const int filestoragename_gdrive = 2131231194; - - // aapt resource value: 0x7f0801d5 - public const int filestoragename_http = 2131231189; + public const int filestoragehelp_dropboxKP2A = 2131231197; // aapt resource value: 0x7f0801d6 - public const int filestoragename_https = 2131231190; + public const int filestoragename_androidget = 2131231190; - // aapt resource value: 0x7f0801dc - public const int filestoragename_sftp = 2131231196; + // aapt resource value: 0x7f0801d7 + public const int filestoragename_androidsend = 2131231191; // aapt resource value: 0x7f0801db - public const int filestoragename_skydrive = 2131231195; + public const int filestoragename_dropbox = 2131231195; + + // aapt resource value: 0x7f0801dc + public const int filestoragename_dropboxKP2A = 2131231196; + + // aapt resource value: 0x7f0801d5 + public const int filestoragename_file = 2131231189; + + // aapt resource value: 0x7f0801d8 + public const int filestoragename_ftp = 2131231192; + + // aapt resource value: 0x7f0801de + public const int filestoragename_gdrive = 2131231198; + + // aapt resource value: 0x7f0801d9 + public const int filestoragename_http = 2131231193; + + // aapt resource value: 0x7f0801da + public const int filestoragename_https = 2131231194; + + // aapt resource value: 0x7f0801e0 + public const int filestoragename_sftp = 2131231200; + + // aapt resource value: 0x7f0801df + public const int filestoragename_skydrive = 2131231199; // aapt resource value: 0x7f08006e public const int further_author_names = 2131230830; - // aapt resource value: 0x7f080150 - public const int further_authors = 2131231056; - - // aapt resource value: 0x7f0800f1 - public const int generate_password = 2131230961; - - // aapt resource value: 0x7f0800f2 - public const int group = 2131230962; - - // aapt resource value: 0x7f0801df - public const int help_database_location = 2131231199; - - // aapt resource value: 0x7f0801e6 - public const int help_key_file = 2131231206; - - // aapt resource value: 0x7f0801e3 - public const int help_master_password = 2131231203; + // aapt resource value: 0x7f080152 + public const int further_authors = 2131231058; // aapt resource value: 0x7f0800f3 - public const int hint_comment = 2131230963; + public const int generate_password = 2131230963; // aapt resource value: 0x7f0800f4 - public const int hint_conf_pass = 2131230964; + public const int group = 2131230964; - // aapt resource value: 0x7f0801e0 - public const int hint_database_location = 2131231200; + // aapt resource value: 0x7f0801e3 + public const int help_database_location = 2131231203; - // aapt resource value: 0x7f0800f5 - public const int hint_generated_password = 2131230965; - - // aapt resource value: 0x7f0800f6 - public const int hint_group_name = 2131230966; + // aapt resource value: 0x7f0801ea + public const int help_key_file = 2131231210; // aapt resource value: 0x7f0801e7 - public const int hint_key_file = 2131231207; + public const int help_master_password = 2131231207; - // aapt resource value: 0x7f0800f7 - public const int hint_keyfile = 2131230967; + // aapt resource value: 0x7f0800f5 + public const int hint_comment = 2131230965; - // aapt resource value: 0x7f0800f8 - public const int hint_length = 2131230968; - - // aapt resource value: 0x7f0800fa - public const int hint_login_pass = 2131230970; + // aapt resource value: 0x7f0800f6 + public const int hint_conf_pass = 2131230966; // aapt resource value: 0x7f0801e4 - public const int hint_master_password = 2131231204; + public const int hint_database_location = 2131231204; - // aapt resource value: 0x7f0800fd - public const int hint_override_url = 2131230973; + // aapt resource value: 0x7f0800f7 + public const int hint_generated_password = 2131230967; + + // aapt resource value: 0x7f0800f8 + public const int hint_group_name = 2131230968; + + // aapt resource value: 0x7f0801eb + public const int hint_key_file = 2131231211; // aapt resource value: 0x7f0800f9 - public const int hint_pass = 2131230969; + public const int hint_keyfile = 2131230969; - // aapt resource value: 0x7f0800fe - public const int hint_tags = 2131230974; - - // aapt resource value: 0x7f0800fb - public const int hint_title = 2131230971; + // aapt resource value: 0x7f0800fa + public const int hint_length = 2131230970; // aapt resource value: 0x7f0800fc - public const int hint_url = 2131230972; + public const int hint_login_pass = 2131230972; + + // aapt resource value: 0x7f0801e8 + public const int hint_master_password = 2131231208; // aapt resource value: 0x7f0800ff - public const int hint_username = 2131230975; + public const int hint_override_url = 2131230975; + + // aapt resource value: 0x7f0800fb + public const int hint_pass = 2131230971; + + // aapt resource value: 0x7f080100 + public const int hint_tags = 2131230976; + + // aapt resource value: 0x7f0800fd + public const int hint_title = 2131230973; + + // aapt resource value: 0x7f0800fe + public const int hint_url = 2131230974; + + // aapt resource value: 0x7f080101 + public const int hint_username = 2131230977; // aapt resource value: 0x7f08006c public const int homepage = 2131230828; @@ -4435,38 +4459,38 @@ namespace keepass2android // aapt resource value: 0x7f080016 public const int ime_name = 2131230742; - // aapt resource value: 0x7f0801ea - public const int init_otp = 2131231210; + // aapt resource value: 0x7f0801ee + public const int init_otp = 2131231214; - // aapt resource value: 0x7f080146 - public const int insert_element_here = 2131231046; + // aapt resource value: 0x7f080148 + public const int insert_element_here = 2131231048; - // aapt resource value: 0x7f080101 - public const int invalid_algorithm = 2131230977; + // aapt resource value: 0x7f080103 + public const int invalid_algorithm = 2131230979; - // aapt resource value: 0x7f080102 - public const int invalid_db_sig = 2131230978; + // aapt resource value: 0x7f080104 + public const int invalid_db_sig = 2131230980; // aapt resource value: 0x7f08006f public const int issues = 2131230831; - // aapt resource value: 0x7f0801e5 - public const int key_file = 2131231205; + // aapt resource value: 0x7f0801e9 + public const int key_file = 2131231209; - // aapt resource value: 0x7f080103 - public const int keyfile_does_not_exist = 2131230979; + // aapt resource value: 0x7f080105 + public const int keyfile_does_not_exist = 2131230981; - // aapt resource value: 0x7f080104 - public const int keyfile_is_empty = 2131230980; + // aapt resource value: 0x7f080106 + public const int keyfile_is_empty = 2131230982; // aapt resource value: 0x7f08007a public const int keyfile_key = 2131230842; - // aapt resource value: 0x7f0800b1 - public const int kill_app_label = 2131230897; + // aapt resource value: 0x7f0800b3 + public const int kill_app_label = 2131230899; - // aapt resource value: 0x7f08015c - public const int kp2a_findUrl = 2131231068; + // aapt resource value: 0x7f08015e + public const int kp2a_findUrl = 2131231070; // aapt resource value: 0x7f08001b public const int label_go_key = 2131230747; @@ -4480,128 +4504,128 @@ namespace keepass2android // aapt resource value: 0x7f08001e public const int label_subtype_generic = 2131230750; - // aapt resource value: 0x7f080105 - public const int length = 2131230981; + // aapt resource value: 0x7f080107 + public const int length = 2131230983; // aapt resource value: 0x7f08001f public const int library_name = 2131230751; - // aapt resource value: 0x7f08009c - public const int list_size_default = 2131230876; + // aapt resource value: 0x7f08009d + public const int list_size_default = 2131230877; // aapt resource value: 0x7f08007d public const int list_size_key = 2131230845; - // aapt resource value: 0x7f080107 - public const int list_size_summary = 2131230983; - - // aapt resource value: 0x7f080106 - public const int list_size_title = 2131230982; - - // aapt resource value: 0x7f0801f8 - public const int loading = 2131231224; + // aapt resource value: 0x7f080109 + public const int list_size_summary = 2131230985; // aapt resource value: 0x7f080108 - public const int loading_database = 2131230984; + public const int list_size_title = 2131230984; - // aapt resource value: 0x7f080109 - public const int lowercase = 2131230985; + // aapt resource value: 0x7f0801fc + public const int loading = 2131231228; + + // aapt resource value: 0x7f08010a + public const int loading_database = 2131230986; + + // aapt resource value: 0x7f08010b + public const int lowercase = 2131230987; // aapt resource value: 0x7f08007b public const int maskpass_key = 2131230843; - // aapt resource value: 0x7f08010c - public const int maskpass_summary = 2131230988; - - // aapt resource value: 0x7f08010b - public const int maskpass_title = 2131230987; - - // aapt resource value: 0x7f08012c - public const int master_key_type = 2131231020; - - // aapt resource value: 0x7f0801e2 - public const int master_password = 2131231202; + // aapt resource value: 0x7f08010e + public const int maskpass_summary = 2131230990; // aapt resource value: 0x7f08010d - public const int menu_about = 2131230989; + public const int maskpass_title = 2131230989; - // aapt resource value: 0x7f080112 - public const int menu_app_settings = 2131230994; + // aapt resource value: 0x7f08012e + public const int master_key_type = 2131231022; - // aapt resource value: 0x7f08011f - public const int menu_change_db = 2131231007; - - // aapt resource value: 0x7f08010e - public const int menu_change_key = 2131230990; + // aapt resource value: 0x7f0801e6 + public const int master_password = 2131231206; // aapt resource value: 0x7f08010f - public const int menu_copy_pass = 2131230991; - - // aapt resource value: 0x7f080110 - public const int menu_copy_user = 2131230992; - - // aapt resource value: 0x7f080111 - public const int menu_create = 2131230993; - - // aapt resource value: 0x7f080113 - public const int menu_db_settings = 2131230995; + public const int menu_about = 2131230991; // aapt resource value: 0x7f080114 - public const int menu_delete = 2131230996; - - // aapt resource value: 0x7f080116 - public const int menu_donate = 2131230998; - - // aapt resource value: 0x7f080117 - public const int menu_edit = 2131230999; - - // aapt resource value: 0x7f080118 - public const int menu_hide_password = 2131231000; - - // aapt resource value: 0x7f080119 - public const int menu_lock = 2131231001; - - // aapt resource value: 0x7f080115 - public const int menu_move = 2131230997; - - // aapt resource value: 0x7f08011a - public const int menu_open = 2131231002; - - // aapt resource value: 0x7f08011b - public const int menu_rename = 2131231003; - - // aapt resource value: 0x7f08011c - public const int menu_search = 2131231004; - - // aapt resource value: 0x7f08011d - public const int menu_search_advanced = 2131231005; - - // aapt resource value: 0x7f08011e - public const int menu_url = 2131231006; - - // aapt resource value: 0x7f080120 - public const int minus = 2131231008; + public const int menu_app_settings = 2131230996; // aapt resource value: 0x7f080121 - public const int never = 2131231009; + public const int menu_change_db = 2131231009; + + // aapt resource value: 0x7f080110 + public const int menu_change_key = 2131230992; + + // aapt resource value: 0x7f080111 + public const int menu_copy_pass = 2131230993; + + // aapt resource value: 0x7f080112 + public const int menu_copy_user = 2131230994; + + // aapt resource value: 0x7f080113 + public const int menu_create = 2131230995; + + // aapt resource value: 0x7f080115 + public const int menu_db_settings = 2131230997; + + // aapt resource value: 0x7f080116 + public const int menu_delete = 2131230998; + + // aapt resource value: 0x7f080118 + public const int menu_donate = 2131231000; + + // aapt resource value: 0x7f080119 + public const int menu_edit = 2131231001; + + // aapt resource value: 0x7f08011a + public const int menu_hide_password = 2131231002; + + // aapt resource value: 0x7f08011b + public const int menu_lock = 2131231003; + + // aapt resource value: 0x7f080117 + public const int menu_move = 2131230999; + + // aapt resource value: 0x7f08011c + public const int menu_open = 2131231004; + + // aapt resource value: 0x7f08011d + public const int menu_rename = 2131231005; + + // aapt resource value: 0x7f08011e + public const int menu_search = 2131231006; + + // aapt resource value: 0x7f08011f + public const int menu_search_advanced = 2131231007; + + // aapt resource value: 0x7f080120 + public const int menu_url = 2131231008; + + // aapt resource value: 0x7f080122 + public const int minus = 2131231010; // aapt resource value: 0x7f080123 - public const int no = 2131231011; - - // aapt resource value: 0x7f080124 - public const int no_keys = 2131231012; + public const int never = 2131231011; // aapt resource value: 0x7f080125 - public const int no_results = 2131231013; - - // aapt resource value: 0x7f0801cf - public const int no_thanks = 2131231183; + public const int no = 2131231013; // aapt resource value: 0x7f080126 - public const int no_url_handler = 2131231014; + public const int no_keys = 2131231014; - // aapt resource value: 0x7f0800c3 - public const int not_possible_im_picker = 2131230915; + // aapt resource value: 0x7f080127 + public const int no_results = 2131231015; + + // aapt resource value: 0x7f0801d3 + public const int no_thanks = 2131231187; + + // aapt resource value: 0x7f080128 + public const int no_url_handler = 2131231016; + + // aapt resource value: 0x7f0800c5 + public const int not_possible_im_picker = 2131230917; // aapt resource value: 0x7f080070 public const int oi_filemanager_market = 2131230832; @@ -4609,17 +4633,17 @@ namespace keepass2android // aapt resource value: 0x7f080071 public const int oi_filemanager_web = 2131230833; - // aapt resource value: 0x7f0801ce - public const int ok_donate = 2131231182; + // aapt resource value: 0x7f0801d2 + public const int ok_donate = 2131231186; // aapt resource value: 0x7f08007c public const int omitbackup_key = 2131230844; - // aapt resource value: 0x7f080129 - public const int omitbackup_summary = 2131231017; + // aapt resource value: 0x7f08012b + public const int omitbackup_summary = 2131231019; - // aapt resource value: 0x7f080128 - public const int omitbackup_title = 2131231016; + // aapt resource value: 0x7f08012a + public const int omitbackup_title = 2131231018; // aapt resource value: 0x7f080019 public const int open_entry = 2131230745; @@ -4627,215 +4651,215 @@ namespace keepass2android // aapt resource value: 0x7f08001a public const int open_entry_for_app = 2131230746; - // aapt resource value: 0x7f080127 - public const int open_recent = 2131231015; + // aapt resource value: 0x7f080129 + public const int open_recent = 2131231017; - // aapt resource value: 0x7f0801c9 - public const int otp_aux_file = 2131231177; + // aapt resource value: 0x7f0801cd + public const int otp_aux_file = 2131231181; - // aapt resource value: 0x7f0801f1 - public const int otp_discarded_because_db_open = 2131231217; - - // aapt resource value: 0x7f0801ef - public const int otp_discarded_because_no_db = 2131231215; - - // aapt resource value: 0x7f0801f0 - public const int otp_discarded_no_space = 2131231216; - - // aapt resource value: 0x7f0801eb - public const int otp_explanation = 2131231211; - - // aapt resource value: 0x7f0801ec - public const int otp_hint = 2131231212; - - // aapt resource value: 0x7f0801f2 - public const int otps_pending = 2131231218; + // aapt resource value: 0x7f0801f5 + public const int otp_discarded_because_db_open = 2131231221; // aapt resource value: 0x7f0801f3 - public const int otpsecret_hint = 2131231219; + public const int otp_discarded_because_no_db = 2131231219; - // aapt resource value: 0x7f08012a - public const int pass_filename = 2131231018; + // aapt resource value: 0x7f0801f4 + public const int otp_discarded_no_space = 2131231220; - // aapt resource value: 0x7f0800b8 - public const int password_access_prefs = 2131230904; + // aapt resource value: 0x7f0801ef + public const int otp_explanation = 2131231215; + + // aapt resource value: 0x7f0801f0 + public const int otp_hint = 2131231216; + + // aapt resource value: 0x7f0801f6 + public const int otps_pending = 2131231222; + + // aapt resource value: 0x7f0801f7 + public const int otpsecret_hint = 2131231223; + + // aapt resource value: 0x7f08012c + public const int pass_filename = 2131231020; + + // aapt resource value: 0x7f0800ba + public const int password_access_prefs = 2131230906; // aapt resource value: 0x7f080086 public const int password_access_prefs_key = 2131230854; - // aapt resource value: 0x7f08012b - public const int password_title = 2131231019; + // aapt resource value: 0x7f08012d + public const int password_title = 2131231021; // aapt resource value: 0x7f080072 public const int permission_desc = 2131230834; - // aapt resource value: 0x7f0800c4 - public const int please_activate_keyboard = 2131230916; - - // aapt resource value: 0x7f080153 - public const int please_note = 2131231059; - - // aapt resource value: 0x7f08012d - public const int progress_create = 2131231021; - - // aapt resource value: 0x7f08012f - public const int progress_title = 2131231023; - - // aapt resource value: 0x7f08017d - public const int protection = 2131231101; - - // aapt resource value: 0x7f0801a6 - public const int rate_app = 2131231142; + // aapt resource value: 0x7f0800c6 + public const int please_activate_keyboard = 2131230918; // aapt resource value: 0x7f080155 - public const int regular_expression = 2131231061; + public const int please_note = 2131231061; - // aapt resource value: 0x7f080130 - public const int remember_keyfile_summary = 2131231024; + // aapt resource value: 0x7f08012f + public const int progress_create = 2131231023; // aapt resource value: 0x7f080131 - public const int remember_keyfile_title = 2131231025; + public const int progress_title = 2131231025; + + // aapt resource value: 0x7f08017f + public const int protection = 2131231103; + + // aapt resource value: 0x7f0801aa + public const int rate_app = 2131231146; + + // aapt resource value: 0x7f080157 + public const int regular_expression = 2131231063; // aapt resource value: 0x7f080132 - public const int remove_from_filelist = 2131231026; + public const int remember_keyfile_summary = 2131231026; // aapt resource value: 0x7f080133 - public const int rijndael = 2131231027; + public const int remember_keyfile_title = 2131231027; // aapt resource value: 0x7f080134 - public const int root = 2131231028; + public const int remove_from_filelist = 2131231028; // aapt resource value: 0x7f080135 - public const int rounds = 2131231029; + public const int rijndael = 2131231029; // aapt resource value: 0x7f080136 - public const int rounds_explaination = 2131231030; + public const int root = 2131231030; // aapt resource value: 0x7f080137 - public const int rounds_hint = 2131231031; + public const int rounds = 2131231031; + + // aapt resource value: 0x7f080138 + public const int rounds_explaination = 2131231032; + + // aapt resource value: 0x7f080139 + public const int rounds_hint = 2131231033; // aapt resource value: 0x7f080079 public const int rounds_key = 2131230841; - // aapt resource value: 0x7f08013a - public const int saving_database = 2131231034; - - // aapt resource value: 0x7f080141 - public const int search_hint = 2131231041; + // aapt resource value: 0x7f08013c + public const int saving_database = 2131231036; // aapt resource value: 0x7f080143 - public const int search_in = 2131231043; + public const int search_hint = 2131231043; - // aapt resource value: 0x7f08013c - public const int search_label = 2131231036; + // aapt resource value: 0x7f080145 + public const int search_in = 2131231045; - // aapt resource value: 0x7f08015e - public const int search_options = 2131231070; + // aapt resource value: 0x7f08013e + public const int search_label = 2131231038; - // aapt resource value: 0x7f080142 - public const int search_results = 2131231042; + // aapt resource value: 0x7f080160 + public const int search_options = 2131231072; - // aapt resource value: 0x7f0800b6 - public const int security_prefs = 2131230902; + // aapt resource value: 0x7f080144 + public const int search_results = 2131231044; + + // aapt resource value: 0x7f0800b8 + public const int security_prefs = 2131230904; // aapt resource value: 0x7f080087 public const int security_prefs_key = 2131230855; - // aapt resource value: 0x7f080145 - public const int select_group_then_add = 2131231045; + // aapt resource value: 0x7f080147 + public const int select_group_then_add = 2131231047; - // aapt resource value: 0x7f080144 - public const int select_other_entry = 2131231044; + // aapt resource value: 0x7f080146 + public const int select_other_entry = 2131231046; - // aapt resource value: 0x7f0801d0 - public const int select_storage_type = 2131231184; - - // aapt resource value: 0x7f0800ac - public const int short_app_name = 2131230892; + // aapt resource value: 0x7f0801d4 + public const int select_storage_type = 2131231188; // aapt resource value: 0x7f0800ae - public const int short_app_name_nonet = 2131230894; + public const int short_app_name = 2131230894; - // aapt resource value: 0x7f0800b2 - public const int show_kill_app = 2131230898; + // aapt resource value: 0x7f0800b0 + public const int short_app_name_nonet = 2131230896; + + // aapt resource value: 0x7f0800b4 + public const int show_kill_app = 2131230900; // aapt resource value: 0x7f080076 public const int show_kill_app_key = 2131230838; - // aapt resource value: 0x7f0800b3 - public const int show_kill_app_summary = 2131230899; - - // aapt resource value: 0x7f08013d - public const int show_password = 2131231037; + // aapt resource value: 0x7f0800b5 + public const int show_kill_app_summary = 2131230901; // aapt resource value: 0x7f08013f - public const int sort_db = 2131231039; + public const int show_password = 2131231039; + + // aapt resource value: 0x7f080141 + public const int sort_db = 2131231041; // aapt resource value: 0x7f08007e public const int sort_key = 2131230846; - // aapt resource value: 0x7f08013e - public const int sort_name = 2131231038; - - // aapt resource value: 0x7f08013b - public const int space = 2131231035; - // aapt resource value: 0x7f080140 - public const int special = 2131231040; + public const int sort_name = 2131231040; - // aapt resource value: 0x7f080161 - public const int start_create = 2131231073; + // aapt resource value: 0x7f08013d + public const int space = 2131231037; + + // aapt resource value: 0x7f080142 + public const int special = 2131231042; // aapt resource value: 0x7f080163 - public const int start_create_import = 2131231075; + public const int start_create = 2131231075; - // aapt resource value: 0x7f080160 - public const int start_open_file = 2131231072; + // aapt resource value: 0x7f080165 + public const int start_create_import = 2131231077; // aapt resource value: 0x7f080162 - public const int start_open_url = 2131231074; + public const int start_open_file = 2131231074; - // aapt resource value: 0x7f0801a5 - public const int suggest_improvements = 2131231141; + // aapt resource value: 0x7f080164 + public const int start_open_url = 2131231076; - // aapt resource value: 0x7f0801cb - public const int synchronize_database_menu = 2131231179; + // aapt resource value: 0x7f0801a9 + public const int suggest_improvements = 2131231145; - // aapt resource value: 0x7f0801a7 - public const int translate_app = 2131231143; + // aapt resource value: 0x7f0801cf + public const int synchronize_database_menu = 2131231183; - // aapt resource value: 0x7f080147 - public const int twofish = 2131231047; - - // aapt resource value: 0x7f080148 - public const int underline = 2131231048; + // aapt resource value: 0x7f0801ab + public const int translate_app = 2131231147; // aapt resource value: 0x7f080149 - public const int unsupported_db_version = 2131231049; + public const int twofish = 2131231049; // aapt resource value: 0x7f08014a - public const int uppercase = 2131231050; - - // aapt resource value: 0x7f0801e8 - public const int use_key_file = 2131231208; - - // aapt resource value: 0x7f08014e - public const int version_history = 2131231054; - - // aapt resource value: 0x7f08014d - public const int version_label = 2131231053; + public const int underline = 2131231050; // aapt resource value: 0x7f08014b - public const int warning_read_only = 2131231051; + public const int unsupported_db_version = 2131231051; // aapt resource value: 0x7f08014c - public const int warning_unmounted = 2131231052; + public const int uppercase = 2131231052; + + // aapt resource value: 0x7f0801ec + public const int use_key_file = 2131231212; + + // aapt resource value: 0x7f080150 + public const int version_history = 2131231056; + + // aapt resource value: 0x7f08014f + public const int version_label = 2131231055; + + // aapt resource value: 0x7f08014d + public const int warning_read_only = 2131231053; + + // aapt resource value: 0x7f08014e + public const int warning_unmounted = 2131231054; // aapt resource value: 0x7f080017 public const int word_separators = 2131230743; - // aapt resource value: 0x7f080122 - public const int yes = 2131231010; + // aapt resource value: 0x7f080124 + public const int yes = 2131231012; static String() { @@ -5810,7 +5834,7 @@ namespace keepass2android 16843055, 16843056, 16843057, - 16843788}; + 16843754}; // aapt resource value: 4 public const int MenuView_android_headerBackground = 4; diff --git a/src/keepass2android/Resources/values/config.xml b/src/keepass2android/Resources/values/config.xml index 351a1c12..126186ed 100644 --- a/src/keepass2android/Resources/values/config.xml +++ b/src/keepass2android/Resources/values/config.xml @@ -89,6 +89,7 @@ UseFileTransactions LockWhenScreenOff UseOfflineCache + AcceptAllServerCertificates CheckForFileChangesOnSave market://details?id= @@ -122,6 +123,13 @@ 28 + WARN + + IGNORE + WARN + ERROR + + ShowUnlockedNotification true diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index 1b40577f..c8ecb255 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -239,6 +239,11 @@ Lock the database when screen is switched off. Database caching Keep a copy of remote database files in the application cache directory. This allows to use remote databases even when offline. + + SSL certificates + Define the behavior when certificate validation fails. Note: you can install certificates on your device if validation fails! + + Clear cache? This will delete all cached database files. Any changes you made while being offline which have not yet been synchronized will be lost! Continue? Check for modifications @@ -372,16 +377,20 @@ Saving auxiliary OTP file… Loading… + + Warning: Server certificate validation failed: %1$s. Install appropriate root certificate on your device or see settings! + Error: Server certificate validation failed! Install appropriate root certificate on your device or see settings! Change log - Version 0.9.2b (preview)\n + Version 0.9.2\n * Added OTP support (compatible with OtpKeyProv plugin)\n * Integrated NFC support for OTPs from YubiKey NEO \n * Several UI improvements\n * Integrated Keepass 2.24 library\n * Added option to kill the app process (see settings)\n + * Improved SSL certificate validation\n * Bug fixes\n @@ -501,4 +510,10 @@ Initial public release Password + OTP Password + OTP secret (recovery mode) + + Ignore certificate validation failures + Warn when validation fails + Do not accept invalid certificates + + diff --git a/src/keepass2android/Resources/xml/preferences.xml b/src/keepass2android/Resources/xml/preferences.xml index 1e28479c..953dce8e 100644 --- a/src/keepass2android/Resources/xml/preferences.xml +++ b/src/keepass2android/Resources/xml/preferences.xml @@ -204,6 +204,16 @@ android:defaultValue="true" android:title="@string/UseOfflineCache_title" android:key="@string/UseOfflineCache_key" /> + + + full False bin\Debug - DEBUG;EXCLUDE_TWOFISH;INCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;INCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE + DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_KEYTRANSFORM;EXCLUDE_FILECHOOSER;EXCLUDE_JAVAFILESTORAGE prompt 4 False