Merge pull request #260 from markuskreusch/feature/253-cancel-unlocking

Feature/253 cancel unlocking
This commit is contained in:
Julian Raufelder 2021-02-17 20:33:42 +01:00 committed by GitHub
commit 3755eed300
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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.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()) //

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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)

View File

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