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.Vault;
|
||||
import org.cryptomator.domain.exception.BackendException;
|
||||
import org.cryptomator.domain.exception.CancellationException;
|
||||
import org.cryptomator.domain.repository.CloudContentRepository;
|
||||
import org.cryptomator.domain.usecases.cloud.ByteArrayDataSource;
|
||||
import org.cryptomator.domain.usecases.cloud.Flag;
|
||||
import org.cryptomator.domain.usecases.vault.UnlockToken;
|
||||
import org.cryptomator.util.Optional;
|
||||
|
||||
@ -76,13 +78,18 @@ public class CryptoCloudFactory {
|
||||
return new CryptoCloud(aCopyOf(vault).build());
|
||||
}
|
||||
|
||||
public Vault unlock(Vault vault, CharSequence password) throws BackendException {
|
||||
return unlock(createUnlockToken(vault), password);
|
||||
public Vault unlock(Vault vault, CharSequence password, Flag cancelledFlag) throws BackendException {
|
||||
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;
|
||||
Cryptor cryptor = cryptorFor(impl.getKeyFile(), password);
|
||||
|
||||
if (cancelledFlag.get()) {
|
||||
throw new CancellationException();
|
||||
}
|
||||
|
||||
cryptoCloudContentRepositoryFactory.registerCryptor(impl.getVault(), cryptor);
|
||||
|
||||
return aCopyOf(token.getVault()) //
|
||||
|
@ -10,6 +10,7 @@ import org.cryptomator.domain.CloudType;
|
||||
import org.cryptomator.domain.Vault;
|
||||
import org.cryptomator.domain.exception.BackendException;
|
||||
import org.cryptomator.domain.repository.CloudRepository;
|
||||
import org.cryptomator.domain.usecases.cloud.Flag;
|
||||
import org.cryptomator.domain.usecases.vault.UnlockToken;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -92,14 +93,14 @@ class CloudRepositoryImpl implements CloudRepository {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cloud unlock(Vault vault, CharSequence password) throws BackendException {
|
||||
Vault vaultWithVersion = cryptoCloudFactory.unlock(vault, password);
|
||||
public Cloud unlock(Vault vault, CharSequence password, Flag cancelledFlag) throws BackendException {
|
||||
Vault vaultWithVersion = cryptoCloudFactory.unlock(vault, password, cancelledFlag);
|
||||
return decryptedViewOf(vaultWithVersion);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cloud unlock(UnlockToken token, CharSequence password) throws BackendException {
|
||||
Vault vaultWithVersion = cryptoCloudFactory.unlock(token, password);
|
||||
public Cloud unlock(UnlockToken token, CharSequence password, Flag cancelledFlag) throws BackendException {
|
||||
Vault vaultWithVersion = cryptoCloudFactory.unlock(token, password, cancelledFlag);
|
||||
return decryptedViewOf(vaultWithVersion);
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@ import org.cryptomator.domain.CloudFolder;
|
||||
import org.cryptomator.domain.CloudType;
|
||||
import org.cryptomator.domain.Vault;
|
||||
import org.cryptomator.domain.exception.BackendException;
|
||||
import org.cryptomator.domain.usecases.cloud.Flag;
|
||||
import org.cryptomator.domain.usecases.vault.UnlockToken;
|
||||
|
||||
import java.util.List;
|
||||
@ -31,8 +32,8 @@ public interface CloudRepository {
|
||||
|
||||
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.exception.BackendException;
|
||||
import org.cryptomator.domain.repository.CloudRepository;
|
||||
import org.cryptomator.domain.usecases.cloud.Flag;
|
||||
import org.cryptomator.generator.Parameter;
|
||||
import org.cryptomator.generator.UseCase;
|
||||
|
||||
@ -13,17 +14,29 @@ class UnlockVault {
|
||||
private final VaultOrUnlockToken vaultOrUnlockToken;
|
||||
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) {
|
||||
this.cloudRepository = cloudRepository;
|
||||
this.vaultOrUnlockToken = vaultOrUnlockToken;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public void onCancel() {
|
||||
cancelled = true;
|
||||
}
|
||||
|
||||
public Cloud execute() throws BackendException {
|
||||
if (vaultOrUnlockToken.getVault().isPresent()) {
|
||||
return cloudRepository.unlock(vaultOrUnlockToken.getVault().get(), password);
|
||||
return cloudRepository.unlock(vaultOrUnlockToken.getVault().get(), password, cancelledFlag);
|
||||
} 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);
|
||||
vault = appComponent.vaultRepository().store(vault);
|
||||
|
||||
return appComponent.cloudRepository().unlock(vault, VAULT_PASSWORD);
|
||||
return appComponent.cloudRepository().unlock(vault, VAULT_PASSWORD, () -> false);
|
||||
} catch (BackendException e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
|
@ -152,7 +152,7 @@ class AutoUploadChooseVaultPresenter @Inject constructor( //
|
||||
}
|
||||
|
||||
fun onUnlockCanceled() {
|
||||
// empty
|
||||
unlockVaultUseCase.cancel()
|
||||
}
|
||||
|
||||
fun onUnlockPressed(vaultModel: VaultModel, password: String?) {
|
||||
|
@ -190,6 +190,7 @@ class BiometricAuthSettingsPresenter @Inject constructor( //
|
||||
}
|
||||
|
||||
fun onUnlockCanceled() {
|
||||
unlockVaultUseCase.cancel()
|
||||
loadVaultList()
|
||||
}
|
||||
|
||||
|
@ -422,7 +422,7 @@ class SharedFilesPresenter @Inject constructor( //
|
||||
}
|
||||
|
||||
fun onUnlockCanceled() {
|
||||
// empty
|
||||
unlockVaultUseCase.cancel()
|
||||
}
|
||||
|
||||
fun useConfirmationInFaceUnlockBiometricAuthentication(): Boolean {
|
||||
|
@ -228,6 +228,7 @@ class VaultListPresenter @Inject constructor( //
|
||||
|
||||
fun onUnlockCanceled() {
|
||||
prepareUnlockUseCase.unsubscribe()
|
||||
unlockVaultUseCase.cancel()
|
||||
}
|
||||
|
||||
private fun browseFilesOf(vault: VaultModel) {
|
||||
|
@ -38,6 +38,7 @@ class EnterPasswordDialog : BaseProgressErrorDialog<EnterPasswordDialog.Callback
|
||||
val vaultModel = vaultModel()
|
||||
callback?.onUnlockClick(vaultModel, et_password.text.toString())
|
||||
onWaitForResponse(et_password)
|
||||
dialog.getButton(android.app.Dialog.BUTTON_NEGATIVE)?.isEnabled = true
|
||||
}
|
||||
|
||||
it.setCanceledOnTouchOutside(false)
|
||||
|
@ -270,6 +270,7 @@ public class VaultListPresenterTest {
|
||||
inTest.onUnlockCanceled();
|
||||
|
||||
verify(prepareUnlockUseCase).unsubscribe();
|
||||
verify(unlockVaultUseCase).cancel();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
Loading…
x
Reference in New Issue
Block a user