Skip to content
This repository has been archived by the owner on Oct 15, 2024. It is now read-only.

more robust switch actions in pgp settings #3148

Merged
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
more robust switch actions in pgp settings
  • Loading branch information
agrahn committed Aug 3, 2024
commit 791ca585bcf486a0115e7ea04548c17dba3bd589
81 changes: 55 additions & 26 deletions app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt
Original file line number Diff line number Diff line change
@@ -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,44 @@ 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)) {
var promptTitle = R.string.pref_passphrase_cache_authenticate_disable
if (checked) promptTitle = R.string.pref_passphrase_cache_authenticate_enable
agrahn marked this conversation as resolved.
Show resolved Hide resolved
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)
agrahn marked this conversation as resolved.
Show resolved Hide resolved
}
if (!checked)
activity.sharedPrefs.edit { remove(PreferenceKeys.CLEAR_PASSPHRASE_CACHE) }
agrahn marked this conversation as resolved.
Show resolved Hide resolved
}
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 +97,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
}
}
}
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -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>