From 8411e28f0d2d845d0ac2f693153e8a4d075695cd Mon Sep 17 00:00:00 2001 From: Avently <7953703+avently@users.noreply.github.com> Date: Tue, 5 Sep 2023 19:53:47 +0800 Subject: [PATCH] desktop: disable storing password on password change --- .../DatabaseEncryptionView.android.kt | 5 +-- .../views/database/DatabaseEncryptionView.kt | 38 ++++++++++--------- .../DatabaseEncryptionView.desktop.kt | 5 +-- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.android.kt b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.android.kt index df2499926f..7194a3fa86 100644 --- a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.android.kt +++ b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.android.kt @@ -4,8 +4,7 @@ import SectionItemView import SectionTextFooter import androidx.compose.foundation.layout.* import androidx.compose.material.* -import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -51,7 +50,7 @@ actual fun SavePassphraseSetting( @Composable actual fun DatabaseEncryptionFooter( - useKeychain: MutableState, + useKeychain: State, chatDbEncrypted: Boolean?, storedKey: MutableState, initialRandomDBPassphrase: MutableState, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.kt index e34f80a7ef..a043e2964c 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.kt @@ -1,9 +1,7 @@ package chat.simplex.common.views.database import SectionBottomSpacer -import SectionItemView import SectionItemViewSpaceBetween -import SectionTextFooter import SectionView import androidx.compose.foundation.* import androidx.compose.foundation.interaction.MutableInteractionSource @@ -24,13 +22,11 @@ import androidx.compose.ui.text.* import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.* import androidx.compose.desktop.ui.tooling.preview.Preview -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.* import chat.simplex.common.model.* +import chat.simplex.common.platform.appPlatform import chat.simplex.common.ui.theme.* import chat.simplex.common.views.helpers.* -import chat.simplex.common.model.* -import chat.simplex.common.platform.appPlatform import chat.simplex.res.MR import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.datetime.Clock @@ -40,7 +36,7 @@ import kotlin.math.log2 fun DatabaseEncryptionView(m: ChatModel) { val progressIndicator = remember { mutableStateOf(false) } val prefs = m.controller.appPrefs - val useKeychain = remember { mutableStateOf(prefs.storeDBPassphrase.get()) } + val useKeychain = remember { prefs.storeDBPassphrase.state } val initialRandomDBPassphrase = remember { mutableStateOf(prefs.initialRandomDBPassphrase.get()) } val storedKey = remember { val key = DatabaseUtils.ksDatabasePassword.get(); mutableStateOf(key != null && key != "") } // Do not do rememberSaveable on current key to prevent saving it on disk in clear text @@ -63,7 +59,15 @@ fun DatabaseEncryptionView(m: ChatModel) { progressIndicator, onConfirmEncrypt = { withApi { - encryptDatabase(currentKey, newKey, confirmNewKey, initialRandomDBPassphrase, useKeychain, storedKey, progressIndicator) + val disableStoring = appPlatform.isDesktop && initialRandomDBPassphrase.value + if (disableStoring) { + prefs.storeDBPassphrase.set(false) + } + val success = encryptDatabase(currentKey, newKey, confirmNewKey, initialRandomDBPassphrase, useKeychain, storedKey, progressIndicator) + if (!success && disableStoring) { + // Rollback in case of it is finished with error in order to allow to repeat the process again + prefs.storeDBPassphrase.set(true) + } } } ) @@ -86,7 +90,7 @@ fun DatabaseEncryptionView(m: ChatModel) { @Composable fun DatabaseEncryptionLayout( - useKeychain: MutableState, + useKeychain: State, prefs: AppPreferences, chatDbEncrypted: Boolean?, currentKey: MutableState, @@ -104,15 +108,15 @@ fun DatabaseEncryptionLayout( SectionView(null) { SavePassphraseSetting(useKeychain.value, initialRandomDBPassphrase.value, storedKey.value, progressIndicator.value) { checked -> if (checked) { - setUseKeychain(true, useKeychain, prefs) + setUseKeychain(true, prefs) } else if (storedKey.value) { removePassphraseAlert { DatabaseUtils.ksDatabasePassword.remove() - setUseKeychain(false, useKeychain, prefs) + setUseKeychain(false, prefs) storedKey.value = false } } else { - setUseKeychain(false, useKeychain, prefs) + setUseKeychain(false, prefs) } } @@ -135,15 +139,16 @@ fun DatabaseEncryptionLayout( keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }), ) val onClickUpdate = { + val disableStoring = appPlatform.isDesktop && initialRandomDBPassphrase.value // Don't do things concurrently. Shouldn't be here concurrently, just in case if (!progressIndicator.value) { if (currentKey.value == "") { - if (useKeychain.value) + if (useKeychain.value && !disableStoring) encryptDatabaseSavedAlert(onConfirmEncrypt) else encryptDatabaseAlert(onConfirmEncrypt) } else { - if (useKeychain.value) + if (useKeychain.value && !disableStoring) changeDatabaseKeySavedAlert(onConfirmEncrypt) else changeDatabaseKeyAlert(onConfirmEncrypt) @@ -218,7 +223,7 @@ expect fun SavePassphraseSetting( @Composable expect fun DatabaseEncryptionFooter( - useKeychain: MutableState, + useKeychain: State, chatDbEncrypted: Boolean?, storedKey: MutableState, initialRandomDBPassphrase: MutableState, @@ -242,8 +247,7 @@ fun resetFormAfterEncryption( storedKey.value = stored } -fun setUseKeychain(value: Boolean, useKeychain: MutableState, prefs: AppPreferences) { - useKeychain.value = value +fun setUseKeychain(value: Boolean, prefs: AppPreferences) { prefs.storeDBPassphrase.set(value) } @@ -361,7 +365,7 @@ suspend fun encryptDatabase( newKey: MutableState, confirmNewKey: MutableState, initialRandomDBPassphrase: MutableState, - useKeychain: MutableState, + useKeychain: State, storedKey: MutableState, progressIndicator: MutableState ): Boolean { diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.desktop.kt index af2b269b58..d68fac1185 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/database/DatabaseEncryptionView.desktop.kt @@ -4,8 +4,7 @@ import SectionItemView import SectionTextFooter import androidx.compose.foundation.layout.* import androidx.compose.material.* -import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -51,7 +50,7 @@ actual fun SavePassphraseSetting( @Composable actual fun DatabaseEncryptionFooter( - useKeychain: MutableState, + useKeychain: State, chatDbEncrypted: Boolean?, storedKey: MutableState, initialRandomDBPassphrase: MutableState,