Enhance error handling while verifying vault
Display error messages when failed to read or verify the vault config
This commit is contained in:
parent
9b989561df
commit
9c0067b7e2
@ -16,6 +16,9 @@ import org.cryptomator.domain.exception.license.LicenseNotValidException
|
|||||||
import org.cryptomator.domain.exception.license.NoLicenseAvailableException
|
import org.cryptomator.domain.exception.license.NoLicenseAvailableException
|
||||||
import org.cryptomator.domain.exception.update.GeneralUpdateErrorException
|
import org.cryptomator.domain.exception.update.GeneralUpdateErrorException
|
||||||
import org.cryptomator.domain.exception.update.SSLHandshakePreAndroid5UpdateCheckException
|
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.R
|
||||||
import org.cryptomator.presentation.ui.activity.view.View
|
import org.cryptomator.presentation.ui.activity.view.View
|
||||||
import java.util.ArrayList
|
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(NoLicenseAvailableException::class.java, R.string.dialog_enter_license_no_content)
|
||||||
staticHandler(GeneralUpdateErrorException::class.java, R.string.error_general_update)
|
staticHandler(GeneralUpdateErrorException::class.java, R.string.error_general_update)
|
||||||
staticHandler(SSLHandshakePreAndroid5UpdateCheckException::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(MissingCryptorExceptionHandler())
|
||||||
exceptionHandlers.add(CancellationExceptionHandler())
|
exceptionHandlers.add(CancellationExceptionHandler())
|
||||||
exceptionHandlers.add(NoSuchVaultExceptionHandler())
|
exceptionHandlers.add(NoSuchVaultExceptionHandler())
|
||||||
|
@ -29,6 +29,7 @@ import org.cryptomator.presentation.model.ProgressModel
|
|||||||
import org.cryptomator.presentation.model.ProgressStateModel
|
import org.cryptomator.presentation.model.ProgressStateModel
|
||||||
import org.cryptomator.presentation.model.VaultModel
|
import org.cryptomator.presentation.model.VaultModel
|
||||||
import org.cryptomator.presentation.ui.activity.view.UnlockVaultView
|
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.ActivityResult
|
||||||
import org.cryptomator.presentation.workflow.AuthenticationExceptionHandler
|
import org.cryptomator.presentation.workflow.AuthenticationExceptionHandler
|
||||||
import org.cryptomator.util.Optional
|
import org.cryptomator.util.Optional
|
||||||
@ -238,6 +239,14 @@ class UnlockVaultPresenter @Inject constructor(
|
|||||||
else -> TODO("Not yet implemented")
|
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) {
|
override fun onError(e: Throwable) {
|
||||||
Timber.tag("VaultListPresenter").e(e, "Error while removing vault passwords")
|
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 open class PendingUnlock(private val vault: Vault?) : Serializable {
|
||||||
|
|
||||||
private var unlockToken: UnlockToken? = null
|
private var unlockToken: UnlockToken? = null
|
||||||
|
@ -185,12 +185,8 @@ class VaultListPresenter @Inject constructor( //
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun deleteVault(vaultModel: VaultModel) {
|
fun deleteVault(vaultModel: VaultModel) {
|
||||||
deleteVault(vaultModel.toVault())
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun deleteVault(vault: Vault) {
|
|
||||||
deleteVaultUseCase //
|
deleteVaultUseCase //
|
||||||
.withVault(vault) //
|
.withVault(vaultModel.toVault()) //
|
||||||
.run(object : DefaultResultHandler<Long>() {
|
.run(object : DefaultResultHandler<Long>() {
|
||||||
override fun onSuccess(vaultId: Long) {
|
override fun onSuccess(vaultId: Long) {
|
||||||
view?.deleteVaultFromAdapter(vaultId)
|
view?.deleteVaultFromAdapter(vaultId)
|
||||||
@ -433,10 +429,6 @@ class VaultListPresenter @Inject constructor( //
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onDeleteMissingVaultClicked(vault: Vault) {
|
|
||||||
deleteVault(vault)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onFilteredTouchEventForSecurity() {
|
fun onFilteredTouchEventForSecurity() {
|
||||||
view?.showDialog(AppIsObscuredInfoDialog.newInstance())
|
view?.showDialog(AppIsObscuredInfoDialog.newInstance())
|
||||||
}
|
}
|
||||||
|
@ -114,4 +114,8 @@ class UnlockVaultActivity : BaseActivity(), //
|
|||||||
presenter.onDeleteMissingVaultClicked(vault)
|
presenter.onDeleteMissingVaultClicked(vault)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onCancelMissingVaultClicked(vault: Vault) {
|
||||||
|
presenter.onCancelMissingVaultClicked(vault)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import android.content.Intent
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import org.cryptomator.domain.Vault
|
|
||||||
import org.cryptomator.generator.Activity
|
import org.cryptomator.generator.Activity
|
||||||
import org.cryptomator.generator.InjectIntent
|
import org.cryptomator.generator.InjectIntent
|
||||||
import org.cryptomator.presentation.CryptomatorApp
|
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.UpdateAppAvailableDialog
|
||||||
import org.cryptomator.presentation.ui.dialog.UpdateAppDialog
|
import org.cryptomator.presentation.ui.dialog.UpdateAppDialog
|
||||||
import org.cryptomator.presentation.ui.dialog.VaultDeleteConfirmationDialog
|
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.dialog.VaultRenameDialog
|
||||||
import org.cryptomator.presentation.ui.fragment.VaultListFragment
|
import org.cryptomator.presentation.ui.fragment.VaultListFragment
|
||||||
import org.cryptomator.presentation.ui.layout.ObscuredAwareCoordinatorLayout.Listener
|
import org.cryptomator.presentation.ui.layout.ObscuredAwareCoordinatorLayout.Listener
|
||||||
@ -40,7 +38,6 @@ class VaultListActivity : BaseActivity(), //
|
|||||||
VaultListView, //
|
VaultListView, //
|
||||||
VaultListCallback, //
|
VaultListCallback, //
|
||||||
AskForLockScreenDialog.Callback, //
|
AskForLockScreenDialog.Callback, //
|
||||||
VaultNotFoundDialog.Callback, //
|
|
||||||
UpdateAppAvailableDialog.Callback, //
|
UpdateAppAvailableDialog.Callback, //
|
||||||
UpdateAppDialog.Callback, //
|
UpdateAppDialog.Callback, //
|
||||||
BetaConfirmationDialog.Callback {
|
BetaConfirmationDialog.Callback {
|
||||||
@ -197,10 +194,6 @@ class VaultListActivity : BaseActivity(), //
|
|||||||
private fun vaultListFragment(): VaultListFragment = //
|
private fun vaultListFragment(): VaultListFragment = //
|
||||||
getCurrentFragment(R.id.fragmentContainer) as VaultListFragment
|
getCurrentFragment(R.id.fragmentContainer) as VaultListFragment
|
||||||
|
|
||||||
override fun onDeleteMissingVaultClicked(vault: Vault) {
|
|
||||||
vaultListPresenter.onDeleteMissingVaultClicked(vault)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onUpdateAppDialogLoaded() {
|
override fun onUpdateAppDialogLoaded() {
|
||||||
showProgress(ProgressModel.GENERIC)
|
showProgress(ProgressModel.GENERIC)
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,8 @@ class VaultNotFoundDialog private constructor(private val context: Context) {
|
|||||||
interface Callback {
|
interface Callback {
|
||||||
|
|
||||||
fun onDeleteMissingVaultClicked(vault: Vault)
|
fun onDeleteMissingVaultClicked(vault: Vault)
|
||||||
|
fun onCancelMissingVaultClicked(vault: Vault)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun show(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)) //
|
.setTitle(String.format(ResourceHelper.getString(R.string.dialog_vault_not_found_title), vault.name)) //
|
||||||
.setMessage(ResourceHelper.getString(R.string.dialog_vault_not_found_message)) //
|
.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) } //
|
.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()
|
.create().show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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_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_play_services_not_available">Play Services not installed</string>
|
||||||
<string name="error_biometric_auth_aborted">Biometric authentication aborted</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 -->
|
<!-- # clouds -->
|
||||||
|
|
||||||
<!-- ## cloud names -->
|
<!-- ## cloud names -->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user