diff options
author | agrahn <agrahn@users.noreply.github.com> | 2024-08-04 18:45:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-04 16:45:09 +0000 |
commit | 17a8bbc3b8848acafc1b1d4f8ff90f9252bbebb4 (patch) | |
tree | 5d6721e982aa8fa29a03f398111aa1ac7ddc5443 | |
parent | 6fcee50f924a715f0e7fde773918d874c5180035 (diff) |
more robust switch actions in pgp settings (#3148)
* more robust switch actions in pgp settings
* Update app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt
Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
Signed-off-by: agrahn <agrahn@users.noreply.github.com>
* Update app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt
Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
Signed-off-by: agrahn <agrahn@users.noreply.github.com>
* Update app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt
Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
Signed-off-by: agrahn <agrahn@users.noreply.github.com>
* formatting fixed (ktfmtFormat)
---------
Signed-off-by: agrahn <agrahn@users.noreply.github.com>
Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
-rw-r--r-- | app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt | 82 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 1 |
2 files changed, 57 insertions, 26 deletions
diff --git a/app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt b/app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt index c21036ed..60c9929b 100644 --- a/app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt +++ b/app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt @@ -17,7 +17,6 @@ import app.passwordstore.util.extensions.sharedPrefs import app.passwordstore.util.features.Feature import app.passwordstore.util.settings.PreferenceKeys import de.Maxr1998.modernpreferences.PreferenceScreen -import de.Maxr1998.modernpreferences.helpers.onCheckedChange import de.Maxr1998.modernpreferences.helpers.onClick import de.Maxr1998.modernpreferences.helpers.pref import de.Maxr1998.modernpreferences.helpers.switch @@ -47,27 +46,45 @@ class PGPSettings( titleRes = R.string.pref_passphrase_cache_title summaryRes = R.string.pref_passphrase_cache_summary defaultValue = false - onCheckedChange { checked -> - if (checked) { - if (BiometricAuthenticator.canAuthenticate(activity)) { - BiometricAuthenticator.authenticate( - activity, - R.string.pref_passphrase_cache_authenticate_enable, - ) { - if (!(it is BiometricAuthenticator.Result.Success)) + onClick { + if (BiometricAuthenticator.canAuthenticate(activity)) { + val promptTitle = + if (checked) R.string.pref_passphrase_cache_authenticate_enable + else R.string.pref_passphrase_cache_authenticate_disable + + BiometricAuthenticator.authenticate(activity, promptTitle) { result -> + when (result) { + is BiometricAuthenticator.Result.Success -> { + /* Any successful change of this setting clears the passphrase + * cache for safety */ + activity.lifecycleScope.launch { + passphraseCache.clearAllCachedPassphrases(activity) + } activity.sharedPrefs.edit { - putBoolean(Feature.EnablePGPPassphraseCache.configKey, false) + putBoolean(Feature.EnablePGPPassphraseCache.configKey, checked) + if (!checked) remove(PreferenceKeys.CLEAR_PASSPHRASE_CACHE) } + } + is BiometricAuthenticator.Result.Retry -> {} + else -> { + /* revert back to previous state in case of error or cancellation */ + checked = !checked + activity.sharedPrefs.edit { + putBoolean(Feature.EnablePGPPassphraseCache.configKey, checked) + } + } } - } else - activity.sharedPrefs.edit { - putBoolean(Feature.EnablePGPPassphraseCache.configKey, false) - } + } } else { - activity.sharedPrefs.edit { remove(PreferenceKeys.CLEAR_PASSPHRASE_CACHE) } - activity.lifecycleScope.launch { passphraseCache.clearAllCachedPassphrases(activity) } + /* we may get here if device lock has been disabled while PGP settings + * screen was left open */ + checked = false + enabled = false + activity.sharedPrefs.edit { + putBoolean(Feature.EnablePGPPassphraseCache.configKey, false) + } } - true + false } } switch(PreferenceKeys.CLEAR_PASSPHRASE_CACHE) { @@ -81,26 +98,39 @@ class PGPSettings( * authentication, otherwise the app crashes. Thus, the bad user could still bypass cache * clearing by dismissing the auhentication dialog. To prevent this, we enforce cache * clearing to stay enabled in case of any authentication failure. */ - onCheckedChange { checked -> + onClick { if (!checked) { - if (BiometricAuthenticator.canAuthenticate(activity)) { + if ( + BiometricAuthenticator.canAuthenticate(activity) && + activity.sharedPrefs.getBoolean(Feature.EnablePGPPassphraseCache.configKey, false) + ) { BiometricAuthenticator.authenticate( activity, R.string.pref_passphrase_cache_auto_clear_authenticate_disable, - ) { - if (it is BiometricAuthenticator.Result.Success) { - activity.lifecycleScope.launch { - passphraseCache.clearAllCachedPassphrases(activity) + ) { result -> + when (result) { + is BiometricAuthenticator.Result.Success -> { + activity.sharedPrefs.edit { + putBoolean(PreferenceKeys.CLEAR_PASSPHRASE_CACHE, false) + } + activity.lifecycleScope.launch { + passphraseCache.clearAllCachedPassphrases(activity) + } + } + is BiometricAuthenticator.Result.Retry -> {} + else -> { + activity.sharedPrefs.edit { remove(PreferenceKeys.CLEAR_PASSPHRASE_CACHE) } + checked = true } - } else { - activity.sharedPrefs.edit { remove(PreferenceKeys.CLEAR_PASSPHRASE_CACHE) } } } } else { activity.sharedPrefs.edit { remove(PreferenceKeys.CLEAR_PASSPHRASE_CACHE) } + checked = true + enabled = false } } - true + false } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a971006e..5c2a7b93 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -138,6 +138,7 @@ <string name="pref_passphrase_cache_title">Enable passphrase caching</string> <string name="pref_passphrase_cache_summary">WARNING: this feature is functional but very experimental. Requires an active screen lock.</string> <string name="pref_passphrase_cache_authenticate_enable">Authenticate to enable cache</string> + <string name="pref_passphrase_cache_authenticate_disable">Authenticate to disable cache</string> <string name="pref_passphrase_cache_auto_clear_authenticate_disable">Authenticate to disable cache clearing</string> <string name="pref_passphrase_cache_auto_clear_title">Automatically clear passphrase cache</string> <string name="pref_passphrase_cache_auto_clear_summary">Clears the passphrase cache when the screen is turned off</string> |