Allow unlock cancellation using cancel flag in the use case
This commit is contained in:
parent
dc8f2f0333
commit
abd7e74590
@ -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()) //
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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?) {
|
||||||
|
@ -190,6 +190,7 @@ class BiometricAuthSettingsPresenter @Inject constructor( //
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun onUnlockCanceled() {
|
fun onUnlockCanceled() {
|
||||||
|
unlockVaultUseCase.cancel()
|
||||||
loadVaultList()
|
loadVaultList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,7 +422,7 @@ class SharedFilesPresenter @Inject constructor( //
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun onUnlockCanceled() {
|
fun onUnlockCanceled() {
|
||||||
// empty
|
unlockVaultUseCase.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun useConfirmationInFaceUnlockBiometricAuthentication(): Boolean {
|
fun useConfirmationInFaceUnlockBiometricAuthentication(): Boolean {
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -270,6 +270,7 @@ public class VaultListPresenterTest {
|
|||||||
inTest.onUnlockCanceled();
|
inTest.onUnlockCanceled();
|
||||||
|
|
||||||
verify(prepareUnlockUseCase).unsubscribe();
|
verify(prepareUnlockUseCase).unsubscribe();
|
||||||
|
verify(unlockVaultUseCase).cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
x
Reference in New Issue
Block a user