From e5413653d0f3828afb978f5d77845457815d4c69 Mon Sep 17 00:00:00 2001 From: Hardcore Sushi Date: Fri, 23 Oct 2020 13:21:14 +0200 Subject: [PATCH] usf_keep_volume_open & Closing volume on fingerprint auth failed --- .../java/sushi/hardcore/droidfs/CreateActivity.kt | 9 +++++++++ .../java/sushi/hardcore/droidfs/OpenActivity.kt | 8 ++++++-- .../sushi/hardcore/droidfs/VolumeActionActivity.kt | 13 +++++++++++-- .../droidfs/explorers/BaseExplorerActivity.kt | 4 +++- .../droidfs/explorers/ExplorerActivityPick.kt | 2 +- .../droidfs/file_viewers/FileViewerActivity.kt | 6 +++++- app/src/main/res/values/strings.xml | 1 + .../main/res/xml/unsafe_features_preferences.xml | 6 ++++++ 8 files changed, 42 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/sushi/hardcore/droidfs/CreateActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/CreateActivity.kt index 7488f9f..e8b619b 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/CreateActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/CreateActivity.kt @@ -191,6 +191,15 @@ class CreateActivity : VolumeActionActivity() { } } + override fun onPause() { + super.onPause() + //Closing volume if leaving activity while showing dialog + if (sessionID != -1){ + GocryptfsVolume(sessionID).close() + finish() + } + } + override fun onDestroy() { super.onDestroy() Wiper.wipeEditText(edit_password) diff --git a/app/src/main/java/sushi/hardcore/droidfs/OpenActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/OpenActivity.kt index e72d45f..73bc52f 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/OpenActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/OpenActivity.kt @@ -163,8 +163,12 @@ class OpenActivity : VolumeActionActivity() { } if (checkbox_save_password.isChecked && returnedHash != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ stopTask { - savePasswordHash(returnedHash) { - startExplorer() + savePasswordHash(returnedHash) { success -> + if (success){ + startExplorer() + } else { + GocryptfsVolume(sessionID).close() + } } } } else { diff --git a/app/src/main/java/sushi/hardcore/droidfs/VolumeActionActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/VolumeActionActivity.kt index 6ea3200..be6a893 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/VolumeActionActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/VolumeActionActivity.kt @@ -3,7 +3,6 @@ package sushi.hardcore.droidfs import android.app.KeyguardManager import android.content.Context import android.os.Build -import android.os.Bundle import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyPermanentlyInvalidatedException import android.security.keystore.KeyProperties @@ -54,13 +53,20 @@ open class VolumeActionActivity : BaseActivity() { override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) Toast.makeText(applicationContext, errString, Toast.LENGTH_SHORT).show() + if (actionMode == Cipher.ENCRYPT_MODE){ + onAuthenticationResult(false) + } } override fun onAuthenticationFailed() { super.onAuthenticationFailed() Toast.makeText(applicationContext, R.string.authentication_failed, Toast.LENGTH_SHORT).show() + if (actionMode == Cipher.ENCRYPT_MODE){ + onAuthenticationResult(false) + } } override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { super.onAuthenticationSucceeded(result) + var success = false val cipherObject = result.cryptoObject?.cipher if (cipherObject != null){ try { @@ -72,7 +78,7 @@ open class VolumeActionActivity : BaseActivity() { val sharedPrefsEditor = sharedPrefs.edit() sharedPrefsEditor.putString(rootCipherDir, "$encodedIv:$encodedCipherText") sharedPrefsEditor.apply() - onAuthenticationResult(true) + success = true } Cipher.DECRYPT_MODE -> { try { @@ -103,6 +109,9 @@ open class VolumeActionActivity : BaseActivity() { } else { Toast.makeText(applicationContext, R.string.error_cipher_null, Toast.LENGTH_SHORT).show() } + if (actionMode == Cipher.ENCRYPT_MODE){ + onAuthenticationResult(success) + } } } biometricPrompt = BiometricPrompt(this, executor, callback) diff --git a/app/src/main/java/sushi/hardcore/droidfs/explorers/BaseExplorerActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/explorers/BaseExplorerActivity.kt index 50ac5e0..c38ce77 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/explorers/BaseExplorerActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/explorers/BaseExplorerActivity.kt @@ -56,9 +56,11 @@ open class BaseExplorerActivity : BaseActivity() { private var isCreating = true protected var isStartingActivity = false private var usf_open = false + protected var usf_keep_open = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) usf_open = sharedPrefs.getBoolean("usf_open", false) + usf_keep_open = sharedPrefs.getBoolean("usf_keep_open", false) val intent = intent volumeName = intent.getStringExtra("volume_name") ?: "" val sessionID = intent.getIntExtra("sessionID", -1) @@ -434,7 +436,7 @@ open class BaseExplorerActivity : BaseActivity() { if (!isChangingConfigurations){ if (isStartingActivity){ isStartingActivity = false - } else { + } else if (!usf_keep_open){ finish() } } diff --git a/app/src/main/java/sushi/hardcore/droidfs/explorers/ExplorerActivityPick.kt b/app/src/main/java/sushi/hardcore/droidfs/explorers/ExplorerActivityPick.kt index 7a0e3cd..d5f2fe3 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/explorers/ExplorerActivityPick.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/explorers/ExplorerActivityPick.kt @@ -80,7 +80,7 @@ class ExplorerActivityPick : BaseExplorerActivity() { } override fun closeVolumeOnDestroy() { - if (!isFinishingIntentionally){ + if (!isFinishingIntentionally && !usf_keep_open){ val sessionID = intent.getIntExtra("originalSessionID", -1) if (sessionID != -1){ val v = GocryptfsVolume(sessionID) diff --git a/app/src/main/java/sushi/hardcore/droidfs/file_viewers/FileViewerActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/file_viewers/FileViewerActivity.kt index bffc007..deccf66 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/file_viewers/FileViewerActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/file_viewers/FileViewerActivity.kt @@ -12,11 +12,13 @@ abstract class FileViewerActivity: BaseActivity() { lateinit var gocryptfsVolume: GocryptfsVolume lateinit var filePath: String private var isFinishingIntentionally = false + protected var usf_keep_open = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) filePath = intent.getStringExtra("path")!! val sessionID = intent.getIntExtra("sessionID", -1) gocryptfsVolume = GocryptfsVolume(sessionID) + usf_keep_open = sharedPrefs.getBoolean("usf_keep_open", false) hideSystemUi() viewFile() } @@ -99,7 +101,9 @@ abstract class FileViewerActivity: BaseActivity() { override fun onPause() { super.onPause() - finish() + if (!usf_keep_open) { + finish() + } } override fun onBackPressed() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 08de5bd..138f957 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -97,6 +97,7 @@ Allow screenshots Allow saving password hash using fingerprint Volume Management + Keep volume open when the app goes in background Unsafe Features Manage unsafe features Enable/Disable unsafe features diff --git a/app/src/main/res/xml/unsafe_features_preferences.xml b/app/src/main/res/xml/unsafe_features_preferences.xml index 0cbc737..5b07d1e 100644 --- a/app/src/main/res/xml/unsafe_features_preferences.xml +++ b/app/src/main/res/xml/unsafe_features_preferences.xml @@ -31,6 +31,12 @@ android:title="@string/usf_share" android:defaultValue="false"/> + +