Enhance error handling while verifying vault

Display error messages when failed to read or verify the vault config
This commit is contained in:
Julian Raufelder 2021-04-08 20:26:55 +02:00
parent 9b989561df
commit 9c0067b7e2
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
7 changed files with 32 additions and 18 deletions

View File

@ -16,6 +16,9 @@ import org.cryptomator.domain.exception.license.LicenseNotValidException
import org.cryptomator.domain.exception.license.NoLicenseAvailableException
import org.cryptomator.domain.exception.update.GeneralUpdateErrorException
import org.cryptomator.domain.exception.update.SSLHandshakePreAndroid5UpdateCheckException
import org.cryptomator.domain.exception.vaultconfig.VaultConfigLoadException
import org.cryptomator.domain.exception.vaultconfig.VaultKeyInvalidException
import org.cryptomator.domain.exception.vaultconfig.VaultVersionMismatchException
import org.cryptomator.presentation.R
import org.cryptomator.presentation.ui.activity.view.View
import java.util.ArrayList
@ -45,6 +48,9 @@ class ExceptionHandlers @Inject constructor(private val context: Context, defaul
staticHandler(NoLicenseAvailableException::class.java, R.string.dialog_enter_license_no_content)
staticHandler(GeneralUpdateErrorException::class.java, R.string.error_general_update)
staticHandler(SSLHandshakePreAndroid5UpdateCheckException::class.java, R.string.error_general_update)
staticHandler(VaultVersionMismatchException::class.java, R.string.error_vault_version_mismatch)
staticHandler(VaultKeyInvalidException::class.java, R.string.error_vault_key_invalid)
staticHandler(VaultConfigLoadException::class.java, R.string.error_vault_config_loading)
exceptionHandlers.add(MissingCryptorExceptionHandler())
exceptionHandlers.add(CancellationExceptionHandler())
exceptionHandlers.add(NoSuchVaultExceptionHandler())

View File

@ -29,6 +29,7 @@ import org.cryptomator.presentation.model.ProgressModel
import org.cryptomator.presentation.model.ProgressStateModel
import org.cryptomator.presentation.model.VaultModel
import org.cryptomator.presentation.ui.activity.view.UnlockVaultView
import org.cryptomator.presentation.ui.dialog.EnterPasswordDialog
import org.cryptomator.presentation.workflow.ActivityResult
import org.cryptomator.presentation.workflow.AuthenticationExceptionHandler
import org.cryptomator.util.Optional
@ -238,6 +239,14 @@ class UnlockVaultPresenter @Inject constructor(
else -> TODO("Not yet implemented")
}
}
override fun onError(e: Throwable) {
super.onError(e)
// finish in case of biometric auth, otherwise show error in dialog
if(view?.isShowingDialog(EnterPasswordDialog::class) == false) {
finishWithResult(null)
}
}
})
}
@ -266,6 +275,7 @@ class UnlockVaultPresenter @Inject constructor(
override fun onError(e: Throwable) {
Timber.tag("VaultListPresenter").e(e, "Error while removing vault passwords")
finishWithResult(null)
}
})
}
@ -352,6 +362,10 @@ class UnlockVaultPresenter @Inject constructor(
})
}
fun onCancelMissingVaultClicked(vault: Vault) {
finishWithResult(null)
}
private open class PendingUnlock(private val vault: Vault?) : Serializable {
private var unlockToken: UnlockToken? = null

View File

@ -185,12 +185,8 @@ class VaultListPresenter @Inject constructor( //
}
fun deleteVault(vaultModel: VaultModel) {
deleteVault(vaultModel.toVault())
}
private fun deleteVault(vault: Vault) {
deleteVaultUseCase //
.withVault(vault) //
.withVault(vaultModel.toVault()) //
.run(object : DefaultResultHandler<Long>() {
override fun onSuccess(vaultId: Long) {
view?.deleteVaultFromAdapter(vaultId)
@ -433,10 +429,6 @@ class VaultListPresenter @Inject constructor( //
}
}
fun onDeleteMissingVaultClicked(vault: Vault) {
deleteVault(vault)
}
fun onFilteredTouchEventForSecurity() {
view?.showDialog(AppIsObscuredInfoDialog.newInstance())
}

View File

@ -114,4 +114,8 @@ class UnlockVaultActivity : BaseActivity(), //
presenter.onDeleteMissingVaultClicked(vault)
}
override fun onCancelMissingVaultClicked(vault: Vault) {
presenter.onCancelMissingVaultClicked(vault)
}
}

View File

@ -4,7 +4,6 @@ import android.content.Intent
import android.net.Uri
import android.view.View
import androidx.fragment.app.Fragment
import org.cryptomator.domain.Vault
import org.cryptomator.generator.Activity
import org.cryptomator.generator.InjectIntent
import org.cryptomator.presentation.CryptomatorApp
@ -26,7 +25,6 @@ import org.cryptomator.presentation.ui.dialog.BetaConfirmationDialog
import org.cryptomator.presentation.ui.dialog.UpdateAppAvailableDialog
import org.cryptomator.presentation.ui.dialog.UpdateAppDialog
import org.cryptomator.presentation.ui.dialog.VaultDeleteConfirmationDialog
import org.cryptomator.presentation.ui.dialog.VaultNotFoundDialog
import org.cryptomator.presentation.ui.dialog.VaultRenameDialog
import org.cryptomator.presentation.ui.fragment.VaultListFragment
import org.cryptomator.presentation.ui.layout.ObscuredAwareCoordinatorLayout.Listener
@ -40,7 +38,6 @@ class VaultListActivity : BaseActivity(), //
VaultListView, //
VaultListCallback, //
AskForLockScreenDialog.Callback, //
VaultNotFoundDialog.Callback, //
UpdateAppAvailableDialog.Callback, //
UpdateAppDialog.Callback, //
BetaConfirmationDialog.Callback {
@ -197,10 +194,6 @@ class VaultListActivity : BaseActivity(), //
private fun vaultListFragment(): VaultListFragment = //
getCurrentFragment(R.id.fragmentContainer) as VaultListFragment
override fun onDeleteMissingVaultClicked(vault: Vault) {
vaultListPresenter.onDeleteMissingVaultClicked(vault)
}
override fun onUpdateAppDialogLoaded() {
showProgress(ProgressModel.GENERIC)
}

View File

@ -14,6 +14,8 @@ class VaultNotFoundDialog private constructor(private val context: Context) {
interface Callback {
fun onDeleteMissingVaultClicked(vault: Vault)
fun onCancelMissingVaultClicked(vault: Vault)
}
fun show(vault: Vault) {
@ -21,7 +23,8 @@ class VaultNotFoundDialog private constructor(private val context: Context) {
.setTitle(String.format(ResourceHelper.getString(R.string.dialog_vault_not_found_title), vault.name)) //
.setMessage(ResourceHelper.getString(R.string.dialog_vault_not_found_message)) //
.setPositiveButton(ResourceHelper.getString(R.string.dialog_vault_not_found_positive_button_text)) { _: DialogInterface, _: Int -> callback.onDeleteMissingVaultClicked(vault) } //
.setNegativeButton(ResourceHelper.getString(R.string.dialog_button_cancel)) { dialog: DialogInterface, _: Int -> dialog.dismiss() } //
.setNegativeButton(ResourceHelper.getString(R.string.dialog_button_cancel)) { _: DialogInterface, _: Int -> callback.onCancelMissingVaultClicked(vault) } //
.setOnCancelListener { callback.onCancelMissingVaultClicked(vault) }
.create().show()
}

View File

@ -32,7 +32,9 @@
<string name="error_failed_to_decrypt_webdav_password">Failed to decrypt WebDAV password, please re add in settings</string>
<string name="error_play_services_not_available">Play Services not installed</string>
<string name="error_biometric_auth_aborted">Biometric authentication aborted</string>
<string name="error_vault_version_mismatch">Version specified in vault.cryptomator is different to masterkey.cryptomator</string>
<string name="error_vault_key_invalid">vault.cryptomator does not match with this masterkey.cryptomator</string>
<string name="error_vault_config_loading">General error while loading the vault config</string>
<!-- # clouds -->
<!-- ## cloud names -->