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
Show file tree
Hide file tree
Changes from all commits
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
82 changes: 56 additions & 26 deletions app/src/main/java/app/passwordstore/ui/settings/PGPSettings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
agrahn marked this conversation as resolved.
Show resolved Hide resolved
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) {
Expand All @@ -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
}
}
}
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down