From 843d8e8e77f124f77ab95af05720439ba89b727f Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sun, 7 Feb 2021 14:06:44 +0100 Subject: [PATCH 1/4] Refactor Main Credential object --- .../activities/FileDatabaseSelectActivity.kt | 17 +++------ .../dialogs/AssignMasterKeyDialogFragment.kt | 29 +++++++------- .../dialogs/PasswordEncodingDialogFragment.kt | 31 ++++----------- .../AssignPasswordInDatabaseRunnable.kt | 16 +------- .../database/action/CreateDatabaseRunnable.kt | 18 +++++++-- .../action/ProgressDatabaseTaskProvider.kt | 8 ---- .../kunzisoft/keepass/model/MainCredential.kt | 32 ++++++++++++++++ .../DatabaseTaskNotificationService.kt | 12 ------ .../keepass/settings/SettingsActivity.kt | 38 ++++++------------- 9 files changed, 85 insertions(+), 116 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/model/MainCredential.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt index ecda01dcd..46813dc45 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -52,6 +52,7 @@ import com.kunzisoft.keepass.autofill.AutofillHelper import com.kunzisoft.keepass.database.action.ProgressDatabaseTaskProvider import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.education.FileDatabaseSelectActivityEducation +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.model.RegisterInfo import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_CREATE_TASK @@ -330,9 +331,7 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), outState.putParcelable(EXTRA_DATABASE_URI, mDatabaseFileUri) } - override fun onAssignKeyDialogPositiveClick( - masterPasswordChecked: Boolean, masterPassword: String?, - keyFileChecked: Boolean, keyFile: Uri?) { + override fun onAssignKeyDialogPositiveClick(mainCredential: MainCredential) { try { mDatabaseFileUri?.let { databaseUri -> @@ -340,10 +339,8 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), // Create the new database mProgressDatabaseTaskProvider?.startDatabaseCreate( databaseUri, - masterPasswordChecked, - masterPassword, - keyFileChecked, - keyFile + mainCredential.masterPassword, + mainCredential.keyFile ) } } catch (e: Exception) { @@ -353,11 +350,7 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), } } - override fun onAssignKeyDialogNegativeClick( - masterPasswordChecked: Boolean, masterPassword: String?, - keyFileChecked: Boolean, keyFile: Uri?) { - - } + override fun onAssignKeyDialogNegativeClick(mainCredential: MainCredential) {} override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/AssignMasterKeyDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/AssignMasterKeyDialogFragment.kt index cabface80..55a7fed9b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/AssignMasterKeyDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/AssignMasterKeyDialogFragment.kt @@ -37,6 +37,7 @@ import androidx.fragment.app.DialogFragment import com.google.android.material.textfield.TextInputLayout import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.helpers.SelectFileHelper +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.utils.UriUtil import com.kunzisoft.keepass.view.KeyFileSelectionView @@ -76,10 +77,8 @@ class AssignMasterKeyDialogFragment : DialogFragment() { } interface AssignPasswordDialogListener { - fun onAssignKeyDialogPositiveClick(masterPasswordChecked: Boolean, masterPassword: String?, - keyFileChecked: Boolean, keyFile: Uri?) - fun onAssignKeyDialogNegativeClick(masterPasswordChecked: Boolean, masterPassword: String?, - keyFileChecked: Boolean, keyFile: Uri?) + fun onAssignKeyDialogPositiveClick(mainCredential: MainCredential) + fun onAssignKeyDialogNegativeClick(mainCredential: MainCredential) } override fun onAttach(activity: Context) { @@ -161,17 +160,13 @@ class AssignMasterKeyDialogFragment : DialogFragment() { } } if (!error) { - mListener?.onAssignKeyDialogPositiveClick( - passwordCheckBox!!.isChecked, mMasterPassword, - keyFileCheckBox!!.isChecked, mKeyFile) + mListener?.onAssignKeyDialogPositiveClick(retrieveMainCredential()) dismiss() } } val negativeButton = dialog1.getButton(DialogInterface.BUTTON_NEGATIVE) negativeButton.setOnClickListener { - mListener?.onAssignKeyDialogNegativeClick( - passwordCheckBox!!.isChecked, mMasterPassword, - keyFileCheckBox!!.isChecked, mKeyFile) + mListener?.onAssignKeyDialogNegativeClick(retrieveMainCredential()) dismiss() } } @@ -183,6 +178,12 @@ class AssignMasterKeyDialogFragment : DialogFragment() { return super.onCreateDialog(savedInstanceState) } + private inline fun retrieveMainCredential(): MainCredential { + val masterPassword = if (passwordCheckBox!!.isChecked) mMasterPassword else null + val keyFile = if (keyFileCheckBox!!.isChecked) mKeyFile else null + return MainCredential(masterPassword, keyFile) + } + override fun onResume() { super.onResume() @@ -242,9 +243,7 @@ class AssignMasterKeyDialogFragment : DialogFragment() { builder.setMessage(R.string.warning_empty_password) .setPositiveButton(android.R.string.ok) { _, _ -> if (!verifyKeyFile()) { - mListener?.onAssignKeyDialogPositiveClick( - passwordCheckBox!!.isChecked, mMasterPassword, - keyFileCheckBox!!.isChecked, mKeyFile) + mListener?.onAssignKeyDialogPositiveClick(retrieveMainCredential()) this@AssignMasterKeyDialogFragment.dismiss() } } @@ -259,9 +258,7 @@ class AssignMasterKeyDialogFragment : DialogFragment() { val builder = AlertDialog.Builder(it) builder.setMessage(R.string.warning_no_encryption_key) .setPositiveButton(android.R.string.ok) { _, _ -> - mListener?.onAssignKeyDialogPositiveClick( - passwordCheckBox!!.isChecked, mMasterPassword, - keyFileCheckBox!!.isChecked, mKeyFile) + mListener?.onAssignKeyDialogPositiveClick(retrieveMainCredential()) this@AssignMasterKeyDialogFragment.dismiss() } .setNegativeButton(android.R.string.cancel) { _, _ -> } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/PasswordEncodingDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/PasswordEncodingDialogFragment.kt index 60da08681..e9f033e2d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/PasswordEncodingDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/PasswordEncodingDialogFragment.kt @@ -26,6 +26,7 @@ import android.net.Uri import android.os.Bundle import androidx.fragment.app.DialogFragment import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.model.MainCredential class PasswordEncodingDialogFragment : DialogFragment() { @@ -49,10 +50,7 @@ class PasswordEncodingDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val databaseUri: Uri? = savedInstanceState?.getParcelable(DATABASE_URI_KEY) - val masterPasswordChecked: Boolean = savedInstanceState?.getBoolean(MASTER_PASSWORD_CHECKED_KEY) ?: false - val masterPassword: String? = savedInstanceState?.getString(MASTER_PASSWORD_KEY) - val keyFileChecked: Boolean = savedInstanceState?.getBoolean(KEY_FILE_CHECKED_KEY) ?: false - val keyFile: Uri? = savedInstanceState?.getParcelable(KEY_FILE_URI_KEY) + val mainCredential: MainCredential = savedInstanceState?.getParcelable(MAIN_CREDENTIAL) ?: MainCredential() activity?.let { activity -> val builder = AlertDialog.Builder(activity) @@ -60,10 +58,7 @@ class PasswordEncodingDialogFragment : DialogFragment() { builder.setPositiveButton(android.R.string.ok) { _, _ -> mListener?.onPasswordEncodingValidateListener( databaseUri, - masterPasswordChecked, - masterPassword, - keyFileChecked, - keyFile + mainCredential ) } builder.setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.cancel() } @@ -75,32 +70,20 @@ class PasswordEncodingDialogFragment : DialogFragment() { interface Listener { fun onPasswordEncodingValidateListener(databaseUri: Uri?, - masterPasswordChecked: Boolean, - masterPassword: String?, - keyFileChecked: Boolean, - keyFile: Uri?) + mainCredential: MainCredential) } companion object { private const val DATABASE_URI_KEY = "DATABASE_URI_KEY" - private const val MASTER_PASSWORD_CHECKED_KEY = "MASTER_PASSWORD_CHECKED_KEY" - private const val MASTER_PASSWORD_KEY = "MASTER_PASSWORD_KEY" - private const val KEY_FILE_CHECKED_KEY = "KEY_FILE_CHECKED_KEY" - private const val KEY_FILE_URI_KEY = "KEY_FILE_URI_KEY" + private const val MAIN_CREDENTIAL = "MAIN_CREDENTIAL" fun getInstance(databaseUri: Uri, - masterPasswordChecked: Boolean, - masterPassword: String?, - keyFileChecked: Boolean, - keyFile: Uri?): SortDialogFragment { + mainCredential: MainCredential): SortDialogFragment { val fragment = SortDialogFragment() fragment.arguments = Bundle().apply { putParcelable(DATABASE_URI_KEY, databaseUri) - putBoolean(MASTER_PASSWORD_CHECKED_KEY, masterPasswordChecked) - putString(MASTER_PASSWORD_KEY, masterPassword) - putBoolean(KEY_FILE_CHECKED_KEY, keyFileChecked) - putParcelable(KEY_FILE_URI_KEY, keyFile) + putParcelable(MAIN_CREDENTIAL, mainCredential) } return fragment } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt index c21307375..623c9e9ed 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt @@ -30,24 +30,12 @@ open class AssignPasswordInDatabaseRunnable ( context: Context, database: Database, protected val mDatabaseUri: Uri, - withMasterPassword: Boolean, - masterPassword: String?, - withKeyFile: Boolean, - keyFile: Uri?) + protected val mMasterPassword: String?, + protected val mKeyFileUri: Uri?) : SaveDatabaseRunnable(context, database, true) { - private var mMasterPassword: String? = null - protected var mKeyFileUri: Uri? = null - private var mBackupKey: ByteArray? = null - init { - if (withMasterPassword) - this.mMasterPassword = masterPassword - if (withKeyFile) - this.mKeyFileUri = keyFile - } - override fun onStartRun() { // Set key try { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt index f2763f30a..993000f62 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt @@ -32,12 +32,10 @@ class CreateDatabaseRunnable(context: Context, databaseUri: Uri, private val databaseName: String, private val rootName: String, - withMasterPassword: Boolean, masterPassword: String?, - withKeyFile: Boolean, keyFile: Uri?, private val createDatabaseResult: ((Result) -> Unit)?) - : AssignPasswordInDatabaseRunnable(context, mDatabase, databaseUri, withMasterPassword, masterPassword, withKeyFile, keyFile) { + : AssignPasswordInDatabaseRunnable(context, mDatabase, databaseUri, masterPassword, keyFile) { override fun onStartRun() { try { @@ -69,6 +67,20 @@ class CreateDatabaseRunnable(context: Context, } else { Log.e("CreateDatabaseRunnable", "Unable to create the database") } + + /* + TODO Load after creation + LoadDatabaseRunnable(context, + mDatabase, + mDatabaseUri, + mMasterPassword, + mKeyFileUri, + false, + null, + false, + null, + null) + */ } override fun onFinishRun() { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt index 3d071c337..84e4022fb 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt @@ -264,15 +264,11 @@ class ProgressDatabaseTaskProvider(private val activity: FragmentActivity) { */ fun startDatabaseCreate(databaseUri: Uri, - masterPasswordChecked: Boolean, masterPassword: String?, - keyFileChecked: Boolean, keyFile: Uri?) { start(Bundle().apply { putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, databaseUri) - putBoolean(DatabaseTaskNotificationService.MASTER_PASSWORD_CHECKED_KEY, masterPasswordChecked) putString(DatabaseTaskNotificationService.MASTER_PASSWORD_KEY, masterPassword) - putBoolean(DatabaseTaskNotificationService.KEY_FILE_CHECKED_KEY, keyFileChecked) putParcelable(DatabaseTaskNotificationService.KEY_FILE_URI_KEY, keyFile) } , ACTION_DATABASE_CREATE_TASK) @@ -303,16 +299,12 @@ class ProgressDatabaseTaskProvider(private val activity: FragmentActivity) { } fun startDatabaseAssignPassword(databaseUri: Uri, - masterPasswordChecked: Boolean, masterPassword: String?, - keyFileChecked: Boolean, keyFile: Uri?) { start(Bundle().apply { putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, databaseUri) - putBoolean(DatabaseTaskNotificationService.MASTER_PASSWORD_CHECKED_KEY, masterPasswordChecked) putString(DatabaseTaskNotificationService.MASTER_PASSWORD_KEY, masterPassword) - putBoolean(DatabaseTaskNotificationService.KEY_FILE_CHECKED_KEY, keyFileChecked) putParcelable(DatabaseTaskNotificationService.KEY_FILE_URI_KEY, keyFile) } , ACTION_DATABASE_ASSIGN_PASSWORD_TASK) diff --git a/app/src/main/java/com/kunzisoft/keepass/model/MainCredential.kt b/app/src/main/java/com/kunzisoft/keepass/model/MainCredential.kt new file mode 100644 index 000000000..285deee08 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/model/MainCredential.kt @@ -0,0 +1,32 @@ +package com.kunzisoft.keepass.model + +import android.net.Uri +import android.os.Parcel +import android.os.Parcelable + +data class MainCredential(var masterPassword: String? = null, var keyFile: Uri? = null): Parcelable { + + constructor(parcel: Parcel) : this( + parcel.readString(), + parcel.readParcelable(Uri::class.java.classLoader)) { + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(masterPassword) + parcel.writeParcelable(keyFile, flags) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): MainCredential { + return MainCredential(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index 0226e5711..bd1b57508 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -399,9 +399,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress intent?.removeExtra(DATABASE_TASK_WARNING_KEY) intent?.removeExtra(DATABASE_URI_KEY) - intent?.removeExtra(MASTER_PASSWORD_CHECKED_KEY) intent?.removeExtra(MASTER_PASSWORD_KEY) - intent?.removeExtra(KEY_FILE_CHECKED_KEY) intent?.removeExtra(KEY_FILE_URI_KEY) intent?.removeExtra(READ_ONLY_KEY) intent?.removeExtra(CIPHER_ENTITY_KEY) @@ -474,9 +472,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private fun buildDatabaseCreateActionTask(intent: Intent): ActionRunnable? { if (intent.hasExtra(DATABASE_URI_KEY) - && intent.hasExtra(MASTER_PASSWORD_CHECKED_KEY) && intent.hasExtra(MASTER_PASSWORD_KEY) - && intent.hasExtra(KEY_FILE_CHECKED_KEY) && intent.hasExtra(KEY_FILE_URI_KEY) ) { val databaseUri: Uri? = intent.getParcelableExtra(DATABASE_URI_KEY) @@ -490,9 +486,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress databaseUri, getString(R.string.database_default_name), getString(R.string.database), - intent.getBooleanExtra(MASTER_PASSWORD_CHECKED_KEY, false), intent.getStringExtra(MASTER_PASSWORD_KEY), - intent.getBooleanExtra(KEY_FILE_CHECKED_KEY, false), keyFileUri ) { result -> result.data = Bundle().apply { @@ -561,18 +555,14 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private fun buildDatabaseAssignPasswordActionTask(intent: Intent): ActionRunnable? { return if (intent.hasExtra(DATABASE_URI_KEY) - && intent.hasExtra(MASTER_PASSWORD_CHECKED_KEY) && intent.hasExtra(MASTER_PASSWORD_KEY) - && intent.hasExtra(KEY_FILE_CHECKED_KEY) && intent.hasExtra(KEY_FILE_URI_KEY) ) { val databaseUri: Uri = intent.getParcelableExtra(DATABASE_URI_KEY) ?: return null AssignPasswordInDatabaseRunnable(this, mDatabase, databaseUri, - intent.getBooleanExtra(MASTER_PASSWORD_CHECKED_KEY, false), intent.getStringExtra(MASTER_PASSWORD_KEY), - intent.getBooleanExtra(KEY_FILE_CHECKED_KEY, false), intent.getParcelableExtra(KEY_FILE_URI_KEY) ) } else { @@ -896,9 +886,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress const val DATABASE_TASK_WARNING_KEY = "DATABASE_TASK_WARNING_KEY" const val DATABASE_URI_KEY = "DATABASE_URI_KEY" - const val MASTER_PASSWORD_CHECKED_KEY = "MASTER_PASSWORD_CHECKED_KEY" const val MASTER_PASSWORD_KEY = "MASTER_PASSWORD_KEY" - const val KEY_FILE_CHECKED_KEY = "KEY_FILE_CHECKED_KEY" const val KEY_FILE_URI_KEY = "KEY_FILE_URI_KEY" const val READ_ONLY_KEY = "READ_ONLY_KEY" const val CIPHER_ENTITY_KEY = "CIPHER_ENTITY_KEY" diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt b/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt index f800f363b..1f5d6e631 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt @@ -36,6 +36,7 @@ import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper import com.kunzisoft.keepass.activities.lock.LockingActivity import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged import com.kunzisoft.keepass.database.element.Database +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.services.DatabaseTaskNotificationService import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.view.showActionErrorIfNeeded @@ -141,52 +142,35 @@ open class SettingsActivity } override fun onPasswordEncodingValidateListener(databaseUri: Uri?, - masterPasswordChecked: Boolean, - masterPassword: String?, - keyFileChecked: Boolean, - keyFile: Uri?) { + mainCredential: MainCredential) { databaseUri?.let { mProgressDatabaseTaskProvider?.startDatabaseAssignPassword( databaseUri, - masterPasswordChecked, - masterPassword, - keyFileChecked, - keyFile + mainCredential.masterPassword, + mainCredential.keyFile ) } } - override fun onAssignKeyDialogPositiveClick(masterPasswordChecked: Boolean, - masterPassword: String?, - keyFileChecked: Boolean, - keyFile: Uri?) { + override fun onAssignKeyDialogPositiveClick(mainCredential: MainCredential) { Database.getInstance().let { database -> database.fileUri?.let { databaseUri -> // Show the progress dialog now or after dialog confirmation - if (database.validatePasswordEncoding(masterPassword, keyFileChecked)) { + if (database.validatePasswordEncoding(mainCredential.masterPassword, mainCredential.keyFile != null)) { mProgressDatabaseTaskProvider?.startDatabaseAssignPassword( databaseUri, - masterPasswordChecked, - masterPassword, - keyFileChecked, - keyFile + mainCredential.masterPassword, + mainCredential.keyFile ) } else { - PasswordEncodingDialogFragment.getInstance(databaseUri, - masterPasswordChecked, - masterPassword, - keyFileChecked, - keyFile - ).show(supportFragmentManager, "passwordEncodingTag") + PasswordEncodingDialogFragment.getInstance(databaseUri, mainCredential) + .show(supportFragmentManager, "passwordEncodingTag") } } } } - override fun onAssignKeyDialogNegativeClick(masterPasswordChecked: Boolean, - masterPassword: String?, - keyFileChecked: Boolean, - keyFile: Uri?) {} + override fun onAssignKeyDialogNegativeClick(mainCredential: MainCredential) {} private fun hideOrShowLockButton(key: NestedSettingsFragment.Screen) { if (PreferencesUtil.showLockDatabaseButton(this)) { From b064bb74cd2bb29ab18b2793ad5a4bd3fe9b68c0 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sun, 7 Feb 2021 14:26:57 +0100 Subject: [PATCH 2/4] Better main credential factorization --- .../activities/FileDatabaseSelectActivity.kt | 9 +++-- .../AssignPasswordInDatabaseRunnable.kt | 8 ++--- .../database/action/CreateDatabaseRunnable.kt | 8 ++--- .../database/action/LoadDatabaseRunnable.kt | 10 +++--- .../action/ProgressDatabaseTaskProvider.kt | 19 ++++------ .../keepass/database/element/Database.kt | 16 +++++---- .../kunzisoft/keepass/model/MainCredential.kt | 4 +-- .../DatabaseTaskNotificationService.kt | 35 +++++++------------ .../keepass/settings/SettingsActivity.kt | 8 ++--- 9 files changed, 52 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt index 46813dc45..e2c4672c5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -55,10 +55,10 @@ import com.kunzisoft.keepass.education.FileDatabaseSelectActivityEducation import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.model.RegisterInfo import com.kunzisoft.keepass.model.SearchInfo +import com.kunzisoft.keepass.services.DatabaseTaskNotificationService import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_CREATE_TASK import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_LOAD_TASK import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.DATABASE_URI_KEY -import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.KEY_FILE_URI_KEY import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.utils.* import com.kunzisoft.keepass.view.asError @@ -200,8 +200,8 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), when (actionTask) { ACTION_DATABASE_CREATE_TASK -> { result.data?.getParcelable(DATABASE_URI_KEY)?.let { databaseUri -> - val keyFileUri = result.data?.getParcelable(KEY_FILE_URI_KEY) - databaseFilesViewModel.addDatabaseFile(databaseUri, keyFileUri) + val mainCredential = result.data?.getParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY) ?: MainCredential() + databaseFilesViewModel.addDatabaseFile(databaseUri, mainCredential.keyFileUri) } } ACTION_DATABASE_LOAD_TASK -> { @@ -339,8 +339,7 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), // Create the new database mProgressDatabaseTaskProvider?.startDatabaseCreate( databaseUri, - mainCredential.masterPassword, - mainCredential.keyFile + mainCredential ) } } catch (e: Exception) { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt index 623c9e9ed..19b4acf8d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt @@ -24,14 +24,14 @@ import android.net.Uri import com.kunzisoft.keepass.app.database.CipherDatabaseAction import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.database.element.Database +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.utils.UriUtil open class AssignPasswordInDatabaseRunnable ( context: Context, database: Database, protected val mDatabaseUri: Uri, - protected val mMasterPassword: String?, - protected val mKeyFileUri: Uri?) + protected val mMainCredential: MainCredential) : SaveDatabaseRunnable(context, database, true) { private var mBackupKey: ByteArray? = null @@ -43,8 +43,8 @@ open class AssignPasswordInDatabaseRunnable ( mBackupKey = ByteArray(database.masterKey.size) System.arraycopy(database.masterKey, 0, mBackupKey!!, 0, mBackupKey!!.size) - val uriInputStream = UriUtil.getUriInputStream(context.contentResolver, mKeyFileUri) - database.retrieveMasterKey(mMasterPassword, uriInputStream) + val uriInputStream = UriUtil.getUriInputStream(context.contentResolver, mMainCredential.keyFileUri) + database.retrieveMasterKey(mMainCredential.masterPassword, uriInputStream) } catch (e: Exception) { erase(mBackupKey) setError(e) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt index 993000f62..8ac760abf 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt @@ -24,6 +24,7 @@ import android.net.Uri import android.util.Log import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.database.element.Database +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.utils.UriUtil @@ -32,10 +33,9 @@ class CreateDatabaseRunnable(context: Context, databaseUri: Uri, private val databaseName: String, private val rootName: String, - masterPassword: String?, - keyFile: Uri?, + mainCredential: MainCredential, private val createDatabaseResult: ((Result) -> Unit)?) - : AssignPasswordInDatabaseRunnable(context, mDatabase, databaseUri, masterPassword, keyFile) { + : AssignPasswordInDatabaseRunnable(context, mDatabase, databaseUri, mainCredential) { override fun onStartRun() { try { @@ -59,7 +59,7 @@ class CreateDatabaseRunnable(context: Context, if (PreferencesUtil.rememberDatabaseLocations(context)) { FileDatabaseHistoryAction.getInstance(context.applicationContext) .addOrUpdateDatabaseUri(mDatabaseUri, - if (PreferencesUtil.rememberKeyFileLocations(context)) mKeyFileUri else null) + if (PreferencesUtil.rememberKeyFileLocations(context)) mMainCredential.keyFileUri else null) } // Register the current time to init the lock timer diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt index f732f3779..5fba6d91a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt @@ -25,8 +25,8 @@ import com.kunzisoft.keepass.app.database.CipherDatabaseAction import com.kunzisoft.keepass.app.database.CipherDatabaseEntity import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.database.exception.DuplicateUuidDatabaseException import com.kunzisoft.keepass.database.exception.LoadDatabaseException +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ProgressTaskUpdater @@ -35,8 +35,7 @@ import com.kunzisoft.keepass.utils.UriUtil class LoadDatabaseRunnable(private val context: Context, private val mDatabase: Database, private val mUri: Uri, - private val mPass: String?, - private val mKey: Uri?, + private val mMainCredential: MainCredential, private val mReadonly: Boolean, private val mCipherEntity: CipherDatabaseEntity?, private val mFixDuplicateUUID: Boolean, @@ -51,7 +50,8 @@ class LoadDatabaseRunnable(private val context: Context, override fun onActionRun() { try { - mDatabase.loadData(mUri, mPass, mKey, + mDatabase.loadData(mUri, + mMainCredential, mReadonly, context.contentResolver, UriUtil.getBinaryDir(context), @@ -67,7 +67,7 @@ class LoadDatabaseRunnable(private val context: Context, if (PreferencesUtil.rememberDatabaseLocations(context)) { FileDatabaseHistoryAction.getInstance(context) .addOrUpdateDatabaseUri(mUri, - if (PreferencesUtil.rememberKeyFileLocations(context)) mKey else null) + if (PreferencesUtil.rememberKeyFileLocations(context)) mMainCredential.keyFileUri else null) } // Register the biometric diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt index 84e4022fb..2c68513f9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt @@ -37,6 +37,7 @@ import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.database.element.security.EncryptionAlgorithm +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.model.SnapFileDatabaseInfo import com.kunzisoft.keepass.services.DatabaseTaskNotificationService import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_ASSIGN_PASSWORD_TASK @@ -264,26 +265,22 @@ class ProgressDatabaseTaskProvider(private val activity: FragmentActivity) { */ fun startDatabaseCreate(databaseUri: Uri, - masterPassword: String?, - keyFile: Uri?) { + mainCredential: MainCredential) { start(Bundle().apply { putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, databaseUri) - putString(DatabaseTaskNotificationService.MASTER_PASSWORD_KEY, masterPassword) - putParcelable(DatabaseTaskNotificationService.KEY_FILE_URI_KEY, keyFile) + putParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY, mainCredential) } , ACTION_DATABASE_CREATE_TASK) } fun startDatabaseLoad(databaseUri: Uri, - masterPassword: String?, - keyFile: Uri?, + mainCredential: MainCredential, readOnly: Boolean, cipherEntity: CipherDatabaseEntity?, fixDuplicateUuid: Boolean) { start(Bundle().apply { putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, databaseUri) - putString(DatabaseTaskNotificationService.MASTER_PASSWORD_KEY, masterPassword) - putParcelable(DatabaseTaskNotificationService.KEY_FILE_URI_KEY, keyFile) + putParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY, mainCredential) putBoolean(DatabaseTaskNotificationService.READ_ONLY_KEY, readOnly) putParcelable(DatabaseTaskNotificationService.CIPHER_ENTITY_KEY, cipherEntity) putBoolean(DatabaseTaskNotificationService.FIX_DUPLICATE_UUID_KEY, fixDuplicateUuid) @@ -299,13 +296,11 @@ class ProgressDatabaseTaskProvider(private val activity: FragmentActivity) { } fun startDatabaseAssignPassword(databaseUri: Uri, - masterPassword: String?, - keyFile: Uri?) { + mainCredential: MainCredential) { start(Bundle().apply { putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, databaseUri) - putString(DatabaseTaskNotificationService.MASTER_PASSWORD_KEY, masterPassword) - putParcelable(DatabaseTaskNotificationService.KEY_FILE_URI_KEY, keyFile) + putParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY, mainCredential) } , ACTION_DATABASE_ASSIGN_PASSWORD_TASK) } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index 25788c716..3fea65521 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -41,6 +41,7 @@ import com.kunzisoft.keepass.database.file.output.DatabaseOutputKDBX import com.kunzisoft.keepass.database.search.SearchHelper import com.kunzisoft.keepass.database.search.SearchParameters import com.kunzisoft.keepass.icons.IconDrawableFactory +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.stream.readBytes4ToUInt import com.kunzisoft.keepass.tasks.ProgressTaskUpdater import com.kunzisoft.keepass.utils.SingletonHolder @@ -374,7 +375,8 @@ class Database { } @Throws(LoadDatabaseException::class) - fun loadData(uri: Uri, password: String?, keyfile: Uri?, + fun loadData(uri: Uri, + mainCredential: MainCredential, readOnly: Boolean, contentResolver: ContentResolver, cacheDirectory: File, @@ -391,8 +393,8 @@ class Database { var keyFileInputStream: InputStream? = null try { // Get keyFile inputStream - keyfile?.let { - keyFileInputStream = UriUtil.getUriInputStream(contentResolver, keyfile) + mainCredential.keyFileUri?.let { keyFile -> + keyFileInputStream = UriUtil.getUriInputStream(contentResolver, keyFile) } // Read database stream for the first time @@ -400,7 +402,7 @@ class Database { { databaseInputStream -> DatabaseInputKDB(cacheDirectory) .openDatabase(databaseInputStream, - password, + mainCredential.masterPassword, keyFileInputStream, progressTaskUpdater, fixDuplicateUUID) @@ -408,7 +410,7 @@ class Database { { databaseInputStream -> DatabaseInputKDBX(cacheDirectory) .openDatabase(databaseInputStream, - password, + mainCredential.masterPassword, keyFileInputStream, progressTaskUpdater, fixDuplicateUUID) @@ -619,7 +621,9 @@ class Database { } } - fun validatePasswordEncoding(password: String?, containsKeyFile: Boolean): Boolean { + fun validatePasswordEncoding(mainCredential: MainCredential): Boolean { + val password = mainCredential.masterPassword + val containsKeyFile = mainCredential.keyFileUri != null return mDatabaseKDB?.validatePasswordEncoding(password, containsKeyFile) ?: mDatabaseKDBX?.validatePasswordEncoding(password, containsKeyFile) ?: false diff --git a/app/src/main/java/com/kunzisoft/keepass/model/MainCredential.kt b/app/src/main/java/com/kunzisoft/keepass/model/MainCredential.kt index 285deee08..e5ee12c72 100644 --- a/app/src/main/java/com/kunzisoft/keepass/model/MainCredential.kt +++ b/app/src/main/java/com/kunzisoft/keepass/model/MainCredential.kt @@ -4,7 +4,7 @@ import android.net.Uri import android.os.Parcel import android.os.Parcelable -data class MainCredential(var masterPassword: String? = null, var keyFile: Uri? = null): Parcelable { +data class MainCredential(var masterPassword: String? = null, var keyFileUri: Uri? = null): Parcelable { constructor(parcel: Parcel) : this( parcel.readString(), @@ -13,7 +13,7 @@ data class MainCredential(var masterPassword: String? = null, var keyFile: Uri? override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(masterPassword) - parcel.writeParcelable(keyFile, flags) + parcel.writeParcelable(keyFileUri, flags) } override fun describeContents(): Int { diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index bd1b57508..1ee713ef4 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -39,6 +39,7 @@ import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.model.SnapFileDatabaseInfo import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ProgressTaskUpdater @@ -399,8 +400,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress intent?.removeExtra(DATABASE_TASK_WARNING_KEY) intent?.removeExtra(DATABASE_URI_KEY) - intent?.removeExtra(MASTER_PASSWORD_KEY) - intent?.removeExtra(KEY_FILE_URI_KEY) + intent?.removeExtra(MAIN_CREDENTIAL_KEY) intent?.removeExtra(READ_ONLY_KEY) intent?.removeExtra(CIPHER_ENTITY_KEY) intent?.removeExtra(FIX_DUPLICATE_UUID_KEY) @@ -472,11 +472,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private fun buildDatabaseCreateActionTask(intent: Intent): ActionRunnable? { if (intent.hasExtra(DATABASE_URI_KEY) - && intent.hasExtra(MASTER_PASSWORD_KEY) - && intent.hasExtra(KEY_FILE_URI_KEY) + && intent.hasExtra(MAIN_CREDENTIAL_KEY) ) { val databaseUri: Uri? = intent.getParcelableExtra(DATABASE_URI_KEY) - val keyFileUri: Uri? = intent.getParcelableExtra(KEY_FILE_URI_KEY) + val mainCredential: MainCredential = intent.getParcelableExtra(MAIN_CREDENTIAL_KEY) ?: MainCredential() if (databaseUri == null) return null @@ -486,12 +485,11 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress databaseUri, getString(R.string.database_default_name), getString(R.string.database), - intent.getStringExtra(MASTER_PASSWORD_KEY), - keyFileUri + mainCredential ) { result -> result.data = Bundle().apply { putParcelable(DATABASE_URI_KEY, databaseUri) - putParcelable(KEY_FILE_URI_KEY, keyFileUri) + putParcelable(MAIN_CREDENTIAL_KEY, mainCredential) } } } else { @@ -502,15 +500,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private fun buildDatabaseLoadActionTask(intent: Intent): ActionRunnable? { if (intent.hasExtra(DATABASE_URI_KEY) - && intent.hasExtra(MASTER_PASSWORD_KEY) - && intent.hasExtra(KEY_FILE_URI_KEY) + && intent.hasExtra(MAIN_CREDENTIAL_KEY) && intent.hasExtra(READ_ONLY_KEY) && intent.hasExtra(CIPHER_ENTITY_KEY) && intent.hasExtra(FIX_DUPLICATE_UUID_KEY) ) { val databaseUri: Uri? = intent.getParcelableExtra(DATABASE_URI_KEY) - val masterPassword: String? = intent.getStringExtra(MASTER_PASSWORD_KEY) - val keyFileUri: Uri? = intent.getParcelableExtra(KEY_FILE_URI_KEY) + val mainCredential: MainCredential = intent.getParcelableExtra(MAIN_CREDENTIAL_KEY) ?: MainCredential() val readOnly: Boolean = intent.getBooleanExtra(READ_ONLY_KEY, true) val cipherEntity: CipherDatabaseEntity? = intent.getParcelableExtra(CIPHER_ENTITY_KEY) @@ -521,8 +517,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress this, mDatabase, databaseUri, - masterPassword, - keyFileUri, + mainCredential, readOnly, cipherEntity, intent.getBooleanExtra(FIX_DUPLICATE_UUID_KEY, false), @@ -531,8 +526,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress // Add each info to reload database after thrown duplicate UUID exception result.data = Bundle().apply { putParcelable(DATABASE_URI_KEY, databaseUri) - putString(MASTER_PASSWORD_KEY, masterPassword) - putParcelable(KEY_FILE_URI_KEY, keyFileUri) + putParcelable(MAIN_CREDENTIAL_KEY, mainCredential) putBoolean(READ_ONLY_KEY, readOnly) putParcelable(CIPHER_ENTITY_KEY, cipherEntity) } @@ -555,15 +549,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private fun buildDatabaseAssignPasswordActionTask(intent: Intent): ActionRunnable? { return if (intent.hasExtra(DATABASE_URI_KEY) - && intent.hasExtra(MASTER_PASSWORD_KEY) - && intent.hasExtra(KEY_FILE_URI_KEY) + && intent.hasExtra(MAIN_CREDENTIAL_KEY) ) { val databaseUri: Uri = intent.getParcelableExtra(DATABASE_URI_KEY) ?: return null AssignPasswordInDatabaseRunnable(this, mDatabase, databaseUri, - intent.getStringExtra(MASTER_PASSWORD_KEY), - intent.getParcelableExtra(KEY_FILE_URI_KEY) + intent.getParcelableExtra(MAIN_CREDENTIAL_KEY) ?: MainCredential() ) } else { null @@ -886,8 +878,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress const val DATABASE_TASK_WARNING_KEY = "DATABASE_TASK_WARNING_KEY" const val DATABASE_URI_KEY = "DATABASE_URI_KEY" - const val MASTER_PASSWORD_KEY = "MASTER_PASSWORD_KEY" - const val KEY_FILE_URI_KEY = "KEY_FILE_URI_KEY" + const val MAIN_CREDENTIAL_KEY = "MAIN_CREDENTIAL_KEY" const val READ_ONLY_KEY = "READ_ONLY_KEY" const val CIPHER_ENTITY_KEY = "CIPHER_ENTITY_KEY" const val FIX_DUPLICATE_UUID_KEY = "FIX_DUPLICATE_UUID_KEY" diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt b/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt index 1f5d6e631..4760e86c2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt @@ -146,8 +146,7 @@ open class SettingsActivity databaseUri?.let { mProgressDatabaseTaskProvider?.startDatabaseAssignPassword( databaseUri, - mainCredential.masterPassword, - mainCredential.keyFile + mainCredential ) } } @@ -156,11 +155,10 @@ open class SettingsActivity Database.getInstance().let { database -> database.fileUri?.let { databaseUri -> // Show the progress dialog now or after dialog confirmation - if (database.validatePasswordEncoding(mainCredential.masterPassword, mainCredential.keyFile != null)) { + if (database.validatePasswordEncoding(mainCredential)) { mProgressDatabaseTaskProvider?.startDatabaseAssignPassword( databaseUri, - mainCredential.masterPassword, - mainCredential.keyFile + mainCredential ) } else { PasswordEncodingDialogFragment.getInstance(databaseUri, mainCredential) From 5203152f78027a35679e1be471b6dc6b3aa54e13 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sun, 7 Feb 2021 14:33:36 +0100 Subject: [PATCH 3/4] Better main credential factorization --- .../keepass/activities/PasswordActivity.kt | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt index 9f96774a8..502a06581 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt @@ -56,13 +56,13 @@ import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.exception.DuplicateUuidDatabaseException import com.kunzisoft.keepass.database.exception.FileNotFoundDatabaseException import com.kunzisoft.keepass.education.PasswordActivityEducation +import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.model.RegisterInfo import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_LOAD_TASK import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.CIPHER_ENTITY_KEY import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.DATABASE_URI_KEY -import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.KEY_FILE_URI_KEY -import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.MASTER_PASSWORD_KEY +import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.MAIN_CREDENTIAL_KEY import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.READ_ONLY_KEY import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.utils.BACK_PREVIOUS_KEYBOARD_ACTION @@ -236,15 +236,13 @@ open class PasswordActivity : SpecialModeActivity(), AdvancedUnlockFragment.Buil showLoadDatabaseDuplicateUuidMessage { var databaseUri: Uri? = null - var masterPassword: String? = null - var keyFileUri: Uri? = null + var mainCredential: MainCredential = MainCredential() var readOnly = true var cipherEntity: CipherDatabaseEntity? = null result.data?.let { resultData -> databaseUri = resultData.getParcelable(DATABASE_URI_KEY) - masterPassword = resultData.getString(MASTER_PASSWORD_KEY) - keyFileUri = resultData.getParcelable(KEY_FILE_URI_KEY) + mainCredential = resultData.getParcelable(MAIN_CREDENTIAL_KEY) ?: mainCredential readOnly = resultData.getBoolean(READ_ONLY_KEY) cipherEntity = resultData.getParcelable(CIPHER_ENTITY_KEY) } @@ -252,8 +250,7 @@ open class PasswordActivity : SpecialModeActivity(), AdvancedUnlockFragment.Buil databaseUri?.let { databaseFileUri -> showProgressDialogAndLoadDatabase( databaseFileUri, - masterPassword, - keyFileUri, + mainCredential, readOnly, cipherEntity, true) @@ -534,8 +531,7 @@ open class PasswordActivity : SpecialModeActivity(), AdvancedUnlockFragment.Buil // Show the progress dialog and load the database showProgressDialogAndLoadDatabase( databaseUri, - password, - keyFileUri, + MainCredential(password, keyFileUri), readOnly, cipherDatabaseEntity, false) @@ -544,15 +540,13 @@ open class PasswordActivity : SpecialModeActivity(), AdvancedUnlockFragment.Buil } private fun showProgressDialogAndLoadDatabase(databaseUri: Uri, - password: String?, - keyFile: Uri?, + mainCredential: MainCredential, readOnly: Boolean, cipherDatabaseEntity: CipherDatabaseEntity?, fixDuplicateUUID: Boolean) { mProgressDatabaseTaskProvider?.startDatabaseLoad( databaseUri, - password, - keyFile, + mainCredential, readOnly, cipherDatabaseEntity, fixDuplicateUUID From 2d40164549a312ba6b4bb9dddd72f0d781db23e0 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sun, 7 Feb 2021 14:52:43 +0100 Subject: [PATCH 4/4] Remove TODO --- .../action/AssignPasswordInDatabaseRunnable.kt | 1 - .../database/action/CreateDatabaseRunnable.kt | 14 -------------- 2 files changed, 15 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt index 19b4acf8d..3bb1ed0f7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt @@ -39,7 +39,6 @@ open class AssignPasswordInDatabaseRunnable ( override fun onStartRun() { // Set key try { - // TODO move master key methods mBackupKey = ByteArray(database.masterKey.size) System.arraycopy(database.masterKey, 0, mBackupKey!!, 0, mBackupKey!!.size) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt index 8ac760abf..0b55a1bb7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/CreateDatabaseRunnable.kt @@ -67,20 +67,6 @@ class CreateDatabaseRunnable(context: Context, } else { Log.e("CreateDatabaseRunnable", "Unable to create the database") } - - /* - TODO Load after creation - LoadDatabaseRunnable(context, - mDatabase, - mDatabaseUri, - mMasterPassword, - mKeyFileUri, - false, - null, - false, - null, - null) - */ } override fun onFinishRun() {