Use GENERAL_SHOW_TIME
for decryption screen timeout (#2107)
* feat(app): use `GENERAL_SHOW_TIME` for decryption screen as well Signed-off-by: Aditya Wasan <adityawasan55@gmail.com> * feat: update timeout to 60 seconds Signed-off-by: Aditya Wasan <adityawasan55@gmail.com> * refactor(app): use constant instead of using a magic number Signed-off-by: Aditya Wasan <adityawasan55@gmail.com> * Add changelog entry Signed-off-by: Aditya Wasan <adityawasan55@gmail.com> Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
e5f02a3aca
commit
244fd92f8b
6 changed files with 21 additions and 7 deletions
|
@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file.
|
|||
- Add the ability to run garbage collection on the internal Git repository
|
||||
- Introduce crash reporting backed by Sentry
|
||||
- TOTP field now shows the remaining time for which it is valid
|
||||
- Allow customizing the timeout for decrypted password screen
|
||||
|
||||
### Fixed
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import app.passwordstore.util.extensions.getString
|
|||
import app.passwordstore.util.extensions.snackbar
|
||||
import app.passwordstore.util.extensions.unsafeLazy
|
||||
import app.passwordstore.util.services.ClipboardService
|
||||
import app.passwordstore.util.settings.Constants
|
||||
import app.passwordstore.util.settings.PreferenceKeys
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
|
@ -87,7 +88,9 @@ open class BasePgpActivity : AppCompatActivity() {
|
|||
fun copyPasswordToClipboard(password: String?) {
|
||||
copyTextToClipboard(password)
|
||||
|
||||
val clearAfter = settings.getString(PreferenceKeys.GENERAL_SHOW_TIME)?.toIntOrNull() ?: 45
|
||||
val clearAfter =
|
||||
settings.getString(PreferenceKeys.GENERAL_SHOW_TIME)?.toIntOrNull()
|
||||
?: Constants.DEFAULT_DECRYPTION_TIMEOUT
|
||||
|
||||
if (clearAfter != 0) {
|
||||
val service =
|
||||
|
|
|
@ -16,9 +16,11 @@ import app.passwordstore.data.passfile.PasswordEntry
|
|||
import app.passwordstore.data.password.FieldItem
|
||||
import app.passwordstore.databinding.DecryptLayoutBinding
|
||||
import app.passwordstore.ui.adapters.FieldItemAdapter
|
||||
import app.passwordstore.util.extensions.getString
|
||||
import app.passwordstore.util.extensions.isErr
|
||||
import app.passwordstore.util.extensions.unsafeLazy
|
||||
import app.passwordstore.util.extensions.viewBinding
|
||||
import app.passwordstore.util.settings.Constants
|
||||
import app.passwordstore.util.settings.PreferenceKeys
|
||||
import com.github.michaelbull.result.runCatching
|
||||
import com.github.michaelbull.result.unwrapError
|
||||
|
@ -91,15 +93,20 @@ class DecryptActivity : BasePgpActivity() {
|
|||
}
|
||||
|
||||
/**
|
||||
* Automatically finishes the activity 60 seconds after decryption succeeded to prevent
|
||||
* information leaks from stale activities.
|
||||
* Automatically finishes the activity after [PreferenceKeys.GENERAL_SHOW_TIME] seconds decryption
|
||||
* succeeded to prevent information leaks from stale activities.
|
||||
*/
|
||||
private fun startAutoDismissTimer() {
|
||||
lifecycleScope.launch {
|
||||
delay(60.seconds)
|
||||
val timeout =
|
||||
settings.getString(PreferenceKeys.GENERAL_SHOW_TIME)?.toIntOrNull()
|
||||
?: Constants.DEFAULT_DECRYPTION_TIMEOUT
|
||||
if (timeout != 0) {
|
||||
delay(timeout.seconds)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit the current password and hide all the fields populated by encrypted data so that when the
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
package app.passwordstore.util.settings
|
||||
|
||||
object Constants {
|
||||
const val DEFAULT_DECRYPTION_TIMEOUT = 60
|
||||
}
|
|
@ -35,7 +35,6 @@
|
|||
<ID>LongMethod:RepositorySettings.kt$RepositorySettings$override fun provideSettings(builder: PreferenceScreen.Builder)</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:AutofillMatcher.kt$AutofillMatcher.Companion$for ((key, value) in prefs.all) { if (!key.startsWith(PREFERENCE_PREFIX_MATCHES)) continue // We know that preferences starting with `PREFERENCE_PREFIX_MATCHES` were // created with `putStringSet`. @Suppress("UNCHECKED_CAST") val oldMatches = value as? Set<String> if (oldMatches == null) { logcat(WARN) { "Failed to read matches for $key" } continue } // Delete all matches for file locations that are going to be overwritten, then // transfer matches over to the files at their new locations. val newMatches = oldMatches .asSequence() .minus(deletePathList) .minus(oldNewPathMap.values) .map { match -> val newPath = oldNewPathMap[match] ?: return@map match logcat { "Updating match for $key: $match --> $newPath" } newPath } .toSet() if (newMatches != oldMatches) prefs.edit { putStringSet(key, newMatches) } }</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:ErrorMessages.kt$ErrorMessages$while (cause.cause != null) { if (cause is GitException) break val nextCause = cause.cause!! if (nextCause is RemoteException) break cause = nextCause }</ID>
|
||||
<ID>MagicNumber:BasePgpActivity.kt$BasePgpActivity$45</ID>
|
||||
<ID>MagicNumber:ClipboardService.kt$ClipboardService$1000</ID>
|
||||
<ID>MagicNumber:ClipboardService.kt$ClipboardService$1000L</ID>
|
||||
<ID>MagicNumber:ClipboardService.kt$ClipboardService$45</ID>
|
||||
|
|
|
@ -10,6 +10,5 @@
|
|||
<ID>MagicNumber:GpgIdentifier.kt$GpgIdentifier.KeyId$8</ID>
|
||||
<ID>NestedBlockDepth:GpgIdentifier.kt$GpgIdentifier.Companion$private fun splitUserId(userId: String): String?</ID>
|
||||
<ID>ReturnCount:GpgIdentifier.kt$GpgIdentifier.Companion$public fun fromString(identifier: String): GpgIdentifier?</ID>
|
||||
<ID>ReturnCount:KeyUtils.kt$KeyUtils$public fun tryParseKeyring(key: PGPKey): PGPKeyRing?</ID>
|
||||
</CurrentIssues>
|
||||
</SmellBaseline>
|
||||
|
|
Loading…
Reference in a new issue