From 977393a9aa80e76008a827e2ff4a0ef1801f7e67 Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Mon, 1 Oct 2018 11:12:37 +0200 Subject: [PATCH] refactoring, remove Loaded property from database. instead, make GetDb() return null if database is not loaded. --- src/Kp2aBusinessLogic/database/Database.cs | 63 ++++--------------- .../database/edit/CreateDB.cs | 1 - src/keepass2android/EntryActivity.cs | 2 +- src/keepass2android/GroupBaseActivity.cs | 2 +- src/keepass2android/LockingActivity.cs | 33 +++++----- src/keepass2android/NfcOtpActivity.cs | 2 +- src/keepass2android/PasswordActivity.cs | 3 +- src/keepass2android/QuickUnlock.cs | 2 +- src/keepass2android/StackBaseActivity.cs | 4 +- src/keepass2android/app/App.cs | 39 +++++------- src/keepass2android/app/AppTask.cs | 2 +- .../fileselect/FileSelectActivity.cs | 2 +- src/keepass2android/search/SearchProvider.cs | 9 +-- .../Kp2aAutofill/ChooseForAutofillActivity.cs | 2 +- .../settings/DatabaseSettingsActivity.cs | 4 +- src/keepass2android/timeout/TimeoutHelper.cs | 2 +- 16 files changed, 57 insertions(+), 115 deletions(-) diff --git a/src/Kp2aBusinessLogic/database/Database.cs b/src/Kp2aBusinessLogic/database/Database.cs index 6956e7b2..4c4afe90 100644 --- a/src/Kp2aBusinessLogic/database/Database.cs +++ b/src/Kp2aBusinessLogic/database/Database.cs @@ -45,7 +45,7 @@ namespace keepass2android { get { - return KpDatabase == null ? null : KpDatabase.IOConnectionInfo; + return KpDatabase?.IOConnectionInfo; } } @@ -73,8 +73,6 @@ namespace keepass2android _app = app; CanWrite = true; //default } - - private bool _loaded; private bool _reloadRequested; private IDatabaseFormat _databaseFormat = new KdbxDatabaseFormat(KdbxFormat.Default); @@ -85,19 +83,9 @@ namespace keepass2android set { _reloadRequested = value; } } - public bool Loaded { - get { return _loaded;} - set { _loaded = value; } - } - public bool DidOpenFileChange() { - if (Loaded == false) - { - return false; - } return _app.GetFileStorage(Ioc).CheckForFileChangeFast(Ioc, LastFileVersion); - } @@ -112,32 +100,20 @@ namespace keepass2android Stream s = databaseData ?? fileStorage.OpenFileForRead(iocInfo); var fileVersion = _app.GetFileStorage(iocInfo).GetCurrentFileVersionFast(iocInfo); PopulateDatabaseFromStream(pwDatabase, s, iocInfo, compositeKey, status, databaseFormat); - try - { - LastFileVersion = fileVersion; + LastFileVersion = fileVersion; - status.UpdateSubMessage(""); + status.UpdateSubMessage(""); - Root = pwDatabase.RootGroup; - PopulateGlobals(Root); + Root = pwDatabase.RootGroup; + PopulateGlobals(Root); - KpDatabase = pwDatabase; - SearchHelper = new SearchDbHelper(app); + KpDatabase = pwDatabase; + SearchHelper = new SearchDbHelper(app); - _databaseFormat = databaseFormat; + _databaseFormat = databaseFormat; - CanWrite = databaseFormat.CanWrite && !fileStorage.IsReadOnly(iocInfo); - Loaded = true; - } - catch (Exception) - { - Clear(); - throw; - } - - - + CanWrite = databaseFormat.CanWrite && !fileStorage.IsReadOnly(iocInfo); } /// @@ -266,25 +242,8 @@ namespace keepass2android { PopulateGlobals(currentGroup, _app.CheckForDuplicateUuids); } - - public void Clear() { - _loaded = false; - - Groups.Clear(); - Entries.Clear(); - Dirty.Clear(); - DrawableFactory.Clear(); - - Root = null; - KpDatabase = null; - - CanWrite = true; - _reloadRequested = false; - OtpAuxFileIoc = null; - LastOpenedEntry = null; - } - - public void MarkAllGroupsAsDirty() { + + public void MarkAllGroupsAsDirty() { foreach ( PwGroup group in Groups.Values ) { Dirty.Add(group); } diff --git a/src/Kp2aBusinessLogic/database/edit/CreateDB.cs b/src/Kp2aBusinessLogic/database/edit/CreateDB.cs index 2e066ca2..ae05e981 100644 --- a/src/Kp2aBusinessLogic/database/edit/CreateDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/CreateDB.cs @@ -74,7 +74,6 @@ namespace keepass2android // Set Database state db.Root = db.KpDatabase.RootGroup; - db.Loaded = true; db.SearchHelper = new SearchDbHelper(_app); // Add a couple default groups diff --git a/src/keepass2android/EntryActivity.cs b/src/keepass2android/EntryActivity.cs index 17e7422a..04455c71 100644 --- a/src/keepass2android/EntryActivity.cs +++ b/src/keepass2android/EntryActivity.cs @@ -391,7 +391,7 @@ namespace keepass2android Database db = App.Kp2a.GetDb(); // Likely the app has been killed exit the activity - if (!db.Loaded || (App.Kp2a.QuickLocked)) + if (db == null || (App.Kp2a.QuickLocked)) { Finish(); return; diff --git a/src/keepass2android/GroupBaseActivity.cs b/src/keepass2android/GroupBaseActivity.cs index 45bf2bf8..ab6675f3 100644 --- a/src/keepass2android/GroupBaseActivity.cs +++ b/src/keepass2android/GroupBaseActivity.cs @@ -407,7 +407,7 @@ namespace keepass2android AppTask = AppTask.GetTaskInOnCreate(savedInstanceState, Intent); // Likely the app has been killed exit the activity - if (!App.Kp2a.GetDb().Loaded) + if (App.Kp2a.GetDb() == null) { Finish(); return; diff --git a/src/keepass2android/LockingActivity.cs b/src/keepass2android/LockingActivity.cs index 4c2eb773..f92e0726 100644 --- a/src/keepass2android/LockingActivity.cs +++ b/src/keepass2android/LockingActivity.cs @@ -43,35 +43,30 @@ namespace keepass2android { base.OnStart(); - if (App.Kp2a.GetDb().Loaded) + var xcKey = App.Kp2a.GetDb()?.KpDatabase.MasterKey.GetUserKey(); + if (xcKey != null) { - var xcKey = App.Kp2a.GetDb().KpDatabase.MasterKey.GetUserKey(); - if (xcKey != null) - { - xcKey.Activity = this; - _currentlyWaitingKey = xcKey; - - } + xcKey.Activity = this; + _currentlyWaitingKey = xcKey; } - } + + + } protected override void OnStop() { base.OnStop(); - if (App.Kp2a.GetDb().Loaded) + var xcKey = App.Kp2a.GetDb()?.KpDatabase.MasterKey.GetUserKey(); + if (xcKey != null) { - var xcKey = App.Kp2a.GetDb().KpDatabase.MasterKey.GetUserKey(); - if (xcKey != null) - { - //don't store a pointer to this activity in the static database object to avoid memory leak - if (xcKey.Activity == this) //don't reset if another activity has come to foreground already - xcKey.Activity = null; - } - + //don't store a pointer to this activity in the static database object to avoid memory leak + if (xcKey.Activity == this) //don't reset if another activity has come to foreground already + xcKey.Activity = null; } - } + + } protected override void OnPause() { base.OnPause(); diff --git a/src/keepass2android/NfcOtpActivity.cs b/src/keepass2android/NfcOtpActivity.cs index 76f662db..45ab7000 100644 --- a/src/keepass2android/NfcOtpActivity.cs +++ b/src/keepass2android/NfcOtpActivity.cs @@ -93,7 +93,7 @@ namespace keepass2android return; } - if (App.Kp2a.GetDb().Loaded) + if (App.Kp2a.GetDb() != null) { Toast.MakeText(this, GetString(Resource.String.otp_discarded_because_db_open), ToastLength.Long).Show(); } diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index 6f13b8e2..5d87c676 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -737,8 +737,7 @@ namespace keepass2android } } - if (App.Kp2a.GetDb().Loaded && App.Kp2a.GetDb().Ioc != null && - App.Kp2a.GetDb().Ioc.GetDisplayName() != _ioConnection.GetDisplayName()) + if (App.Kp2a.GetDb()?.Ioc != null && App.Kp2a.GetDb().Ioc.GetDisplayName() != _ioConnection.GetDisplayName()) { // A different database is currently loaded, unload it before loading the new one requested App.Kp2a.LockDatabase(false); diff --git a/src/keepass2android/QuickUnlock.cs b/src/keepass2android/QuickUnlock.cs index f23c013f..5bcc3e75 100644 --- a/src/keepass2android/QuickUnlock.cs +++ b/src/keepass2android/QuickUnlock.cs @@ -427,7 +427,7 @@ namespace keepass2android private void CheckIfUnloaded() { - if ((App.Kp2a.GetDb() == null) || (App.Kp2a.GetDb().Loaded == false)) + if (App.Kp2a.GetDb() == null) { Finish(); } diff --git a/src/keepass2android/StackBaseActivity.cs b/src/keepass2android/StackBaseActivity.cs index 51449e0e..3bc518c6 100644 --- a/src/keepass2android/StackBaseActivity.cs +++ b/src/keepass2android/StackBaseActivity.cs @@ -46,7 +46,7 @@ namespace keepass2android base.OnResume(); if (!IsFinishing) { - if (!App.Kp2a.GetDb().Loaded) + if (App.Kp2a.GetDb() == null) { // Load default database ISharedPreferences prefs = Android.Preferences.PreferenceManager.GetDefaultSharedPreferences(this); @@ -128,7 +128,7 @@ namespace keepass2android break; case KeePass.ExitReloadDb: - if (App.Kp2a.GetDb().Loaded) + if (App.Kp2a.GetDb() != null) { //remember the composite key for reloading: var compositeKey = App.Kp2a.GetDb().KpDatabase.MasterKey; diff --git a/src/keepass2android/app/App.cs b/src/keepass2android/app/App.cs index e51c2984..f016a048 100644 --- a/src/keepass2android/app/App.cs +++ b/src/keepass2android/app/App.cs @@ -102,19 +102,18 @@ namespace keepass2android { public void LockDatabase(bool allowQuickUnlock = true) { - if (GetDb().Loaded) + if (GetDb() != null) { if (QuickUnlockEnabled && allowQuickUnlock && - _db.KpDatabase.MasterKey.ContainsType(typeof(KcpPassword)) && + GetDb().KpDatabase.MasterKey.ContainsType(typeof(KcpPassword)) && !((KcpPassword)App.Kp2a.GetDb().KpDatabase.MasterKey.GetUserKey(typeof(KcpPassword))).Password.IsEmpty) { if (!QuickLocked) { Kp2aLog.Log("QuickLocking database"); - BroadcastDatabaseAction(Application.Context, Strings.ActionLockDatabase); - - QuickLocked = true; - _db.LastOpenedEntry = null; + QuickLocked = true; + GetDb().LastOpenedEntry = null; + BroadcastDatabaseAction(Application.Context, Strings.ActionLockDatabase); } else { @@ -127,8 +126,8 @@ namespace keepass2android BroadcastDatabaseAction(Application.Context, Strings.ActionCloseDatabase); - // Couldn't quick-lock, so unload database instead - _db.Clear(); + // Couldn't quick-lock, so unload database instead + _db = null; QuickLocked = false; } } @@ -181,7 +180,7 @@ namespace keepass2android memoryStream.Seek(0, SeekOrigin.Begin); } - + _db = CreateNewDatabase(); _db.LoadData(this, ioConnectionInfo, memoryStream, compositeKey, statusLogger, databaseFormat); if (createBackup) @@ -259,7 +258,7 @@ namespace keepass2android public bool DatabaseIsUnlocked { - get { return _db.Loaded && !QuickLocked; } + get { return GetDb() != null && !QuickLocked; } } #region QuickUnlock @@ -300,11 +299,6 @@ namespace keepass2android public Database GetDb() { - if (_db == null) - { - _db = CreateNewDatabase(); - } - return _db; } @@ -331,9 +325,9 @@ namespace keepass2android public void CheckForOpenFileChanged(Activity activity) { - if (_db.DidOpenFileChange()) + if (GetDb()?.DidOpenFileChange() == true) { - if (_db.ReloadRequested) + if (GetDb().ReloadRequested) { LockDatabase(false); activity.SetResult(KeePass.ExitReloadDb); @@ -353,7 +347,7 @@ namespace keepass2android builder.SetPositiveButton(activity.GetString(Android.Resource.String.Yes), (dlgSender, dlgEvt) => { - _db.ReloadRequested = true; + GetDb().ReloadRequested = true; activity.SetResult(KeePass.ExitReloadDb); activity.Finish(); @@ -729,15 +723,14 @@ namespace keepass2android internal void OnTerminate() { - if (_db != null) - { - _db.Clear(); - } - + + _db = null; + if (FileDbHelper != null && FileDbHelper.IsOpen()) { FileDbHelper.Close(); } + GC.Collect(); } internal void OnCreate(Application app) diff --git a/src/keepass2android/app/AppTask.cs b/src/keepass2android/app/AppTask.cs index 9108ca6b..1a804c46 100644 --- a/src/keepass2android/app/AppTask.cs +++ b/src/keepass2android/app/AppTask.cs @@ -943,7 +943,7 @@ namespace keepass2android PwUuid nextGroupPwUuid = new PwUuid (MemUtil.HexStringToByteArray (nextGroupUuid)); // Create Group Activity - PwGroup nextGroup = App.Kp2a.GetDb ().Groups [nextGroupPwUuid]; + PwGroup nextGroup = App.Kp2a.GetDb ().Groups[nextGroupPwUuid]; GroupActivity.Launch (groupBaseActivity, nextGroup, this); } return; diff --git a/src/keepass2android/fileselect/FileSelectActivity.cs b/src/keepass2android/fileselect/FileSelectActivity.cs index 19f06183..a44ec446 100644 --- a/src/keepass2android/fileselect/FileSelectActivity.cs +++ b/src/keepass2android/fileselect/FileSelectActivity.cs @@ -461,7 +461,7 @@ namespace keepass2android Kp2aLog.Log("FileSelect.OnStart"); var db = App.Kp2a.GetDb(); - if (db.Loaded) + if (db != null) { LaunchPasswordActivityForIoc(db.Ioc); } diff --git a/src/keepass2android/search/SearchProvider.cs b/src/keepass2android/search/SearchProvider.cs index 6680836a..07e78118 100644 --- a/src/keepass2android/search/SearchProvider.cs +++ b/src/keepass2android/search/SearchProvider.cs @@ -48,8 +48,6 @@ namespace keepass2android.search private const string IconIdParameter = "IconId"; private const string CustomIconUuidParameter = "CustomIconUuid"; - private Database _db; - private static UriMatcher UriMatcher = BuildUriMatcher(); static UriMatcher BuildUriMatcher() @@ -65,7 +63,6 @@ namespace keepass2android.search public override bool OnCreate() { - _db = App.Kp2a.GetDb(); return true; } @@ -82,7 +79,7 @@ namespace keepass2android.search try { var resultsContexts = new Dictionary>(); - var result = _db.Search(new SearchParameters { SearchString = searchString }, resultsContexts ); + var result = App.Kp2a.GetDb().Search(new SearchParameters { SearchString = searchString }, resultsContexts ); return new GroupCursor(result, resultsContexts); } catch (Exception e) @@ -120,8 +117,8 @@ namespace keepass2android.search var iconId = (PwIcon)Enum.Parse(typeof(PwIcon), uri.GetQueryParameter(IconIdParameter)); var customIconUuid = new PwUuid(MemUtil.HexStringToByteArray(uri.GetQueryParameter(CustomIconUuidParameter))); - var iconDrawable = _db.DrawableFactory.GetIconDrawable(App.Context, _db.KpDatabase, iconId, customIconUuid, false) as BitmapDrawable; - if ((iconDrawable != null) && (iconDrawable.Bitmap != null)) + var iconDrawable = App.Kp2a.GetDb().DrawableFactory.GetIconDrawable(App.Context, App.Kp2a.GetDb().KpDatabase, iconId, customIconUuid, false) as BitmapDrawable; + if (iconDrawable?.Bitmap != null) { var pipe = ParcelFileDescriptor.CreatePipe(); diff --git a/src/keepass2android/services/Kp2aAutofill/ChooseForAutofillActivity.cs b/src/keepass2android/services/Kp2aAutofill/ChooseForAutofillActivity.cs index a07b52ac..f257e548 100644 --- a/src/keepass2android/services/Kp2aAutofill/ChooseForAutofillActivity.cs +++ b/src/keepass2android/services/Kp2aAutofill/ChooseForAutofillActivity.cs @@ -39,7 +39,7 @@ namespace keepass2android.services.Kp2aAutofill protected override FilledAutofillFieldCollection GetDataset(Intent data) { - if (!App.Kp2a.GetDb().Loaded || (App.Kp2a.QuickLocked)) + if (App.Kp2a.GetDb()==null || (App.Kp2a.QuickLocked)) return null; var entryOutput = App.Kp2a.GetDb().LastOpenedEntry; diff --git a/src/keepass2android/settings/DatabaseSettingsActivity.cs b/src/keepass2android/settings/DatabaseSettingsActivity.cs index d65a0ff7..eed864b7 100644 --- a/src/keepass2android/settings/DatabaseSettingsActivity.cs +++ b/src/keepass2android/settings/DatabaseSettingsActivity.cs @@ -424,7 +424,7 @@ namespace keepass2android FindPreference(GetString(Resource.String.design_key)).PreferenceChange += (sender, args) => Activity.Recreate(); Database db = App.Kp2a.GetDb(); - if (db.Loaded) + if (db != null) { ListPreference kdfPref = (ListPreference) FindPreference(GetString(Resource.String.kdf_key)); kdfPref.SetEntries(KdfPool.Engines.Select(eng => eng.Name).ToArray()); @@ -791,7 +791,7 @@ namespace keepass2android private void OnUseOfflineCacheChanged(object sender, Preference.PreferenceChangeEventArgs e) { //ensure the user gets a matching database - if (App.Kp2a.GetDb().Loaded && !App.Kp2a.GetDb().Ioc.IsLocalFile()) + if (App.Kp2a.GetDb() != null && !App.Kp2a.GetDb().Ioc.IsLocalFile()) App.Kp2a.LockDatabase(false); if (!(bool)e.NewValue) diff --git a/src/keepass2android/timeout/TimeoutHelper.cs b/src/keepass2android/timeout/TimeoutHelper.cs index c49e6383..4d34ec8a 100644 --- a/src/keepass2android/timeout/TimeoutHelper.cs +++ b/src/keepass2android/timeout/TimeoutHelper.cs @@ -83,7 +83,7 @@ namespace keepass2android public static void Resume(Activity act) { - if ( App.Kp2a.GetDb().Loaded ) + if ( App.Kp2a.GetDb() != null) { Timeout.Cancel(act); }