Allow unlock cancellation using cancel flag in the use case

This commit is contained in:
Markus Kreusch 2021-02-16 22:59:02 +01:00
parent dc8f2f0333
commit abd7e74590
No known key found for this signature in database
GPG Key ID: 1EE9C2089D33B557
11 changed files with 40 additions and 14 deletions

View File

@ -29,8 +29,10 @@ import org.cryptomator.domain.CloudFile;
import org.cryptomator.domain.CloudFolder; import org.cryptomator.domain.CloudFolder;
import org.cryptomator.domain.Vault; import org.cryptomator.domain.Vault;
import org.cryptomator.domain.exception.BackendException; import org.cryptomator.domain.exception.BackendException;
import org.cryptomator.domain.exception.CancellationException;
import org.cryptomator.domain.repository.CloudContentRepository; import org.cryptomator.domain.repository.CloudContentRepository;
import org.cryptomator.domain.usecases.cloud.ByteArrayDataSource; import org.cryptomator.domain.usecases.cloud.ByteArrayDataSource;
import org.cryptomator.domain.usecases.cloud.Flag;
import org.cryptomator.domain.usecases.vault.UnlockToken; import org.cryptomator.domain.usecases.vault.UnlockToken;
import org.cryptomator.util.Optional; import org.cryptomator.util.Optional;
@ -76,13 +78,18 @@ public class CryptoCloudFactory {
return new CryptoCloud(aCopyOf(vault).build()); return new CryptoCloud(aCopyOf(vault).build());
} }
public Vault unlock(Vault vault, CharSequence password) throws BackendException { public Vault unlock(Vault vault, CharSequence password, Flag cancelledFlag) throws BackendException {
return unlock(createUnlockToken(vault), password); return unlock(createUnlockToken(vault), password, cancelledFlag);
} }
public Vault unlock(UnlockToken token, CharSequence password) throws BackendException { public Vault unlock(UnlockToken token, CharSequence password, Flag cancelledFlag) throws BackendException {
UnlockTokenImpl impl = (UnlockTokenImpl) token; UnlockTokenImpl impl = (UnlockTokenImpl) token;
Cryptor cryptor = cryptorFor(impl.getKeyFile(), password); Cryptor cryptor = cryptorFor(impl.getKeyFile(), password);
if (cancelledFlag.get()) {
throw new CancellationException();
}
cryptoCloudContentRepositoryFactory.registerCryptor(impl.getVault(), cryptor); cryptoCloudContentRepositoryFactory.registerCryptor(impl.getVault(), cryptor);
return aCopyOf(token.getVault()) // return aCopyOf(token.getVault()) //

View File

@ -10,6 +10,7 @@ import org.cryptomator.domain.CloudType;
import org.cryptomator.domain.Vault; import org.cryptomator.domain.Vault;
import org.cryptomator.domain.exception.BackendException; import org.cryptomator.domain.exception.BackendException;
import org.cryptomator.domain.repository.CloudRepository; import org.cryptomator.domain.repository.CloudRepository;
import org.cryptomator.domain.usecases.cloud.Flag;
import org.cryptomator.domain.usecases.vault.UnlockToken; import org.cryptomator.domain.usecases.vault.UnlockToken;
import java.util.ArrayList; import java.util.ArrayList;
@ -92,14 +93,14 @@ class CloudRepositoryImpl implements CloudRepository {
} }
@Override @Override
public Cloud unlock(Vault vault, CharSequence password) throws BackendException { public Cloud unlock(Vault vault, CharSequence password, Flag cancelledFlag) throws BackendException {
Vault vaultWithVersion = cryptoCloudFactory.unlock(vault, password); Vault vaultWithVersion = cryptoCloudFactory.unlock(vault, password, cancelledFlag);
return decryptedViewOf(vaultWithVersion); return decryptedViewOf(vaultWithVersion);
} }
@Override @Override
public Cloud unlock(UnlockToken token, CharSequence password) throws BackendException { public Cloud unlock(UnlockToken token, CharSequence password, Flag cancelledFlag) throws BackendException {
Vault vaultWithVersion = cryptoCloudFactory.unlock(token, password); Vault vaultWithVersion = cryptoCloudFactory.unlock(token, password, cancelledFlag);
return decryptedViewOf(vaultWithVersion); return decryptedViewOf(vaultWithVersion);
} }

View File

@ -5,6 +5,7 @@ import org.cryptomator.domain.CloudFolder;
import org.cryptomator.domain.CloudType; import org.cryptomator.domain.CloudType;
import org.cryptomator.domain.Vault; import org.cryptomator.domain.Vault;
import org.cryptomator.domain.exception.BackendException; import org.cryptomator.domain.exception.BackendException;
import org.cryptomator.domain.usecases.cloud.Flag;
import org.cryptomator.domain.usecases.vault.UnlockToken; import org.cryptomator.domain.usecases.vault.UnlockToken;
import java.util.List; import java.util.List;
@ -31,8 +32,8 @@ public interface CloudRepository {
UnlockToken prepareUnlock(Vault vault) throws BackendException; UnlockToken prepareUnlock(Vault vault) throws BackendException;
Cloud unlock(UnlockToken token, CharSequence password) throws BackendException; Cloud unlock(UnlockToken token, CharSequence password, Flag cancelledFlag) throws BackendException;
Cloud unlock(Vault vault, CharSequence password) throws BackendException; Cloud unlock(Vault vault, CharSequence password, Flag cancelledFlag) throws BackendException;
} }

View File

@ -3,6 +3,7 @@ package org.cryptomator.domain.usecases.vault;
import org.cryptomator.domain.Cloud; import org.cryptomator.domain.Cloud;
import org.cryptomator.domain.exception.BackendException; import org.cryptomator.domain.exception.BackendException;
import org.cryptomator.domain.repository.CloudRepository; import org.cryptomator.domain.repository.CloudRepository;
import org.cryptomator.domain.usecases.cloud.Flag;
import org.cryptomator.generator.Parameter; import org.cryptomator.generator.Parameter;
import org.cryptomator.generator.UseCase; import org.cryptomator.generator.UseCase;
@ -13,17 +14,29 @@ class UnlockVault {
private final VaultOrUnlockToken vaultOrUnlockToken; private final VaultOrUnlockToken vaultOrUnlockToken;
private final String password; private final String password;
private volatile boolean cancelled;
private final Flag cancelledFlag = new Flag() {
@Override
public boolean get() {
return cancelled;
}
};
public UnlockVault(CloudRepository cloudRepository, @Parameter VaultOrUnlockToken vaultOrUnlockToken, @Parameter String password) { public UnlockVault(CloudRepository cloudRepository, @Parameter VaultOrUnlockToken vaultOrUnlockToken, @Parameter String password) {
this.cloudRepository = cloudRepository; this.cloudRepository = cloudRepository;
this.vaultOrUnlockToken = vaultOrUnlockToken; this.vaultOrUnlockToken = vaultOrUnlockToken;
this.password = password; this.password = password;
} }
public void onCancel() {
cancelled = true;
}
public Cloud execute() throws BackendException { public Cloud execute() throws BackendException {
if (vaultOrUnlockToken.getVault().isPresent()) { if (vaultOrUnlockToken.getVault().isPresent()) {
return cloudRepository.unlock(vaultOrUnlockToken.getVault().get(), password); return cloudRepository.unlock(vaultOrUnlockToken.getVault().get(), password, cancelledFlag);
} else { } else {
return cloudRepository.unlock(vaultOrUnlockToken.getUnlockToken().get(), password); return cloudRepository.unlock(vaultOrUnlockToken.getUnlockToken().get(), password, cancelledFlag);
} }
} }

View File

@ -37,7 +37,7 @@ public class CryptoTestCloud extends TestCloud {
appComponent.cloudRepository().create(vaultFolder, VAULT_PASSWORD); appComponent.cloudRepository().create(vaultFolder, VAULT_PASSWORD);
vault = appComponent.vaultRepository().store(vault); vault = appComponent.vaultRepository().store(vault);
return appComponent.cloudRepository().unlock(vault, VAULT_PASSWORD); return appComponent.cloudRepository().unlock(vault, VAULT_PASSWORD, () -> false);
} catch (BackendException e) { } catch (BackendException e) {
throw new AssertionError(e); throw new AssertionError(e);
} }

View File

@ -152,7 +152,7 @@ class AutoUploadChooseVaultPresenter @Inject constructor( //
} }
fun onUnlockCanceled() { fun onUnlockCanceled() {
// empty unlockVaultUseCase.cancel()
} }
fun onUnlockPressed(vaultModel: VaultModel, password: String?) { fun onUnlockPressed(vaultModel: VaultModel, password: String?) {

View File

@ -190,6 +190,7 @@ class BiometricAuthSettingsPresenter @Inject constructor( //
} }
fun onUnlockCanceled() { fun onUnlockCanceled() {
unlockVaultUseCase.cancel()
loadVaultList() loadVaultList()
} }

View File

@ -422,7 +422,7 @@ class SharedFilesPresenter @Inject constructor( //
} }
fun onUnlockCanceled() { fun onUnlockCanceled() {
// empty unlockVaultUseCase.cancel()
} }
fun useConfirmationInFaceUnlockBiometricAuthentication(): Boolean { fun useConfirmationInFaceUnlockBiometricAuthentication(): Boolean {

View File

@ -228,6 +228,7 @@ class VaultListPresenter @Inject constructor( //
fun onUnlockCanceled() { fun onUnlockCanceled() {
prepareUnlockUseCase.unsubscribe() prepareUnlockUseCase.unsubscribe()
unlockVaultUseCase.cancel()
} }
private fun browseFilesOf(vault: VaultModel) { private fun browseFilesOf(vault: VaultModel) {

View File

@ -38,6 +38,7 @@ class EnterPasswordDialog : BaseProgressErrorDialog<EnterPasswordDialog.Callback
val vaultModel = vaultModel() val vaultModel = vaultModel()
callback?.onUnlockClick(vaultModel, et_password.text.toString()) callback?.onUnlockClick(vaultModel, et_password.text.toString())
onWaitForResponse(et_password) onWaitForResponse(et_password)
dialog.getButton(android.app.Dialog.BUTTON_NEGATIVE)?.isEnabled = true
} }
it.setCanceledOnTouchOutside(false) it.setCanceledOnTouchOutside(false)

View File

@ -270,6 +270,7 @@ public class VaultListPresenterTest {
inTest.onUnlockCanceled(); inTest.onUnlockCanceled();
verify(prepareUnlockUseCase).unsubscribe(); verify(prepareUnlockUseCase).unsubscribe();
verify(unlockVaultUseCase).cancel();
} }
@Test @Test