From 9fefe8e4628d57018a46a4d78b6a93bd51c94ed0 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Thu, 29 Dec 2022 18:20:46 +0100 Subject: [PATCH 1/3] Show info dialog when keychain is deactivated --- .../org/cryptomator/ui/common/FxmlFile.java | 1 + .../keyloading/hub/HubKeyLoadingModule.java | 12 +++++ .../keyloading/hub/HubKeyLoadingStrategy.java | 20 +++++-- .../keyloading/hub/NoKeychainController.java | 23 ++++++++ src/main/resources/fxml/hub_no_keychain.fxml | 54 +++++++++++++++++++ src/main/resources/i18n/strings.properties | 2 + 6 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/cryptomator/ui/keyloading/hub/NoKeychainController.java create mode 100644 src/main/resources/fxml/hub_no_keychain.fxml diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java index 73e805273..eac58eb86 100644 --- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -13,6 +13,7 @@ public enum FxmlFile { FORGET_PASSWORD("/fxml/forget_password.fxml"), // HEALTH_START("/fxml/health_start.fxml"), // HEALTH_CHECK_LIST("/fxml/health_check_list.fxml"), // + HUB_NO_KEYCHAIN("/fxml/hub_no_keychain.fxml"), // HUB_AUTH_FLOW("/fxml/hub_auth_flow.fxml"), // HUB_LICENSE_EXCEEDED("/fxml/hub_license_exceeded.fxml"), // HUB_RECEIVE_KEY("/fxml/hub_receive_key.fxml"), // diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java b/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java index a23a5f1b3..5adcb243d 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java @@ -87,6 +87,13 @@ public abstract class HubKeyLoadingModule { @StringKey(HubKeyLoadingStrategy.SCHEME_HUB_HTTPS) abstract KeyLoadingStrategy bindHubKeyLoadingStrategyToHubHttps(HubKeyLoadingStrategy strategy); + @Provides + @FxmlScene(FxmlFile.HUB_NO_KEYCHAIN) + @KeyLoadingScoped + static Scene provideHubNoKeychainScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene(FxmlFile.HUB_NO_KEYCHAIN); + } + @Provides @FxmlScene(FxmlFile.HUB_AUTH_FLOW) @KeyLoadingScoped @@ -136,6 +143,11 @@ public abstract class HubKeyLoadingModule { return fxmlLoaders.createScene(FxmlFile.HUB_UNAUTHORIZED_DEVICE); } + @Binds + @IntoMap + @FxControllerKey(NoKeychainController.class) + abstract FxController bindNoKeychainController(NoKeychainController controller); + @Binds @IntoMap @FxControllerKey(AuthFlowController.class) diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingStrategy.java b/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingStrategy.java index a3c2ed820..d1a3742ae 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingStrategy.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingStrategy.java @@ -3,6 +3,8 @@ package org.cryptomator.ui.keyloading.hub; import com.google.common.base.Preconditions; import com.nimbusds.jose.JWEObject; import dagger.Lazy; +import org.cryptomator.common.keychain.KeychainManager; +import org.cryptomator.common.keychain.NoKeychainAccessProviderException; import org.cryptomator.common.settings.DeviceKey; import org.cryptomator.cryptolib.api.Masterkey; import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException; @@ -31,15 +33,19 @@ public class HubKeyLoadingStrategy implements KeyLoadingStrategy { static final String SCHEME_HUB_HTTPS = SCHEME_PREFIX + "https"; private final Stage window; + private final KeychainManager keychainManager; private final Lazy authFlowScene; + private final Lazy noKeychainScene; private final CompletableFuture result; private final DeviceKey deviceKey; @Inject - public HubKeyLoadingStrategy(@KeyLoading Stage window, @FxmlScene(FxmlFile.HUB_AUTH_FLOW) Lazy authFlowScene, CompletableFuture result, DeviceKey deviceKey, @Named("windowTitle") String windowTitle) { + public HubKeyLoadingStrategy(@KeyLoading Stage window, @FxmlScene(FxmlFile.HUB_AUTH_FLOW) Lazy authFlowScene, @FxmlScene(FxmlFile.HUB_NO_KEYCHAIN) Lazy noKeychainScene, CompletableFuture result, DeviceKey deviceKey, KeychainManager keychainManager, @Named("windowTitle") String windowTitle) { this.window = window; + this.keychainManager = keychainManager; window.setTitle(windowTitle); this.authFlowScene = authFlowScene; + this.noKeychainScene = noKeychainScene; this.result = result; this.deviceKey = deviceKey; } @@ -48,10 +54,16 @@ public class HubKeyLoadingStrategy implements KeyLoadingStrategy { public Masterkey loadKey(URI keyId) throws MasterkeyLoadingFailedException { Preconditions.checkArgument(keyId.getScheme().startsWith(SCHEME_PREFIX)); try { + if (!keychainManager.isSupported()) { + throw new NoKeychainAccessProviderException(); + } var keypair = deviceKey.get(); - startAuthFlow(); + showWindow(authFlowScene); var jwe = result.get(); return JWEHelper.decrypt(jwe, keypair.getPrivate()); + } catch (NoKeychainAccessProviderException e) { + showWindow(noKeychainScene); + throw new UnlockCancelledException("Unlock canceled due to missing prerequisites", e); } catch (DeviceKey.DeviceKeyRetrievalException e) { throw new MasterkeyLoadingFailedException("Failed to load keypair", e); } catch (CancellationException e) { @@ -64,9 +76,9 @@ public class HubKeyLoadingStrategy implements KeyLoadingStrategy { } } - private void startAuthFlow() { + private void showWindow(Lazy scene) { Platform.runLater(() -> { - window.setScene(authFlowScene.get()); + window.setScene(scene.get()); window.show(); Window owner = window.getOwner(); if (owner != null) { diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/NoKeychainController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/NoKeychainController.java new file mode 100644 index 000000000..048200815 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/NoKeychainController.java @@ -0,0 +1,23 @@ +package org.cryptomator.ui.keyloading.hub; + +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.keyloading.KeyLoading; + +import javax.inject.Inject; +import javafx.stage.Stage; + +public class NoKeychainController implements FxController { + + private final Stage window; + + @Inject + public NoKeychainController(@KeyLoading Stage window) { + this.window = window; + } + + + public void cancel() { + window.close(); + } + +} diff --git a/src/main/resources/fxml/hub_no_keychain.fxml b/src/main/resources/fxml/hub_no_keychain.fxml new file mode 100644 index 000000000..c3775af9f --- /dev/null +++ b/src/main/resources/fxml/hub_no_keychain.fxml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +