Sebastian Stenzel 5 年之前
父節點
當前提交
362b225d66

+ 1 - 0
main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java

@@ -22,6 +22,7 @@ public enum FxmlFile {
 	REMOVE_VAULT("/fxml/remove_vault.fxml"), //
 	UNLOCK("/fxml/unlock.fxml"),
 	UNLOCK_GENERIC_ERROR("/fxml/unlock_generic_error.fxml"), //
+	UNLOCK_INVALID_MOUNT_POINT("/fxml/unlock_invalid_mount_point.fxml"), //
 	UNLOCK_SUCCESS("/fxml/unlock_success.fxml"), //
 	VAULT_OPTIONS("/fxml/vault_options.fxml"), //
 	WRONGFILEALERT("/fxml/wrongfilealert.fxml");

+ 5 - 5
main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockController.java

@@ -51,6 +51,7 @@ public class UnlockController implements FxController {
 	private final ObjectBinding<ContentDisplay> unlockButtonState;
 	private final Optional<KeychainAccess> keychainAccess;
 	private final Lazy<Scene> successScene;
+	private final Lazy<Scene> invalidMountPointScene;
 	private final Lazy<Scene> genericErrorScene;
 	private final ObjectProperty<Exception> genericErrorCause;
 	private final ForgetPasswordComponent.Builder forgetPassword;
@@ -59,13 +60,14 @@ public class UnlockController implements FxController {
 	public CheckBox savePassword;
 
 	@Inject
-	public UnlockController(@UnlockWindow Stage window, @UnlockWindow Vault vault, ExecutorService executor, Optional<KeychainAccess> keychainAccess, @FxmlScene(FxmlFile.UNLOCK_SUCCESS) Lazy<Scene> successScene, @FxmlScene(FxmlFile.UNLOCK_GENERIC_ERROR) Lazy<Scene> genericErrorScene, @Named("genericErrorCause") ObjectProperty<Exception> genericErrorCause, ForgetPasswordComponent.Builder forgetPassword) {
+	public UnlockController(@UnlockWindow Stage window, @UnlockWindow Vault vault, ExecutorService executor, Optional<KeychainAccess> keychainAccess, @FxmlScene(FxmlFile.UNLOCK_SUCCESS) Lazy<Scene> successScene, @FxmlScene(FxmlFile.UNLOCK_INVALID_MOUNT_POINT) Lazy<Scene> invalidMountPointScene, @FxmlScene(FxmlFile.UNLOCK_GENERIC_ERROR) Lazy<Scene> genericErrorScene, @Named("genericErrorCause") ObjectProperty<Exception> genericErrorCause, ForgetPasswordComponent.Builder forgetPassword) {
 		this.window = window;
 		this.vault = vault;
 		this.executor = executor;
 		this.unlockButtonState = Bindings.createObjectBinding(this::getUnlockButtonState, vault.stateProperty());
 		this.keychainAccess = keychainAccess;
 		this.successScene = successScene;
+		this.invalidMountPointScene = invalidMountPointScene;
 		this.genericErrorScene = genericErrorScene;
 		this.genericErrorCause = genericErrorCause;
 		this.forgetPassword = forgetPassword;
@@ -106,14 +108,12 @@ public class UnlockController implements FxController {
 			shakeWindow();
 			passwordField.selectAll();
 			passwordField.requestFocus();
-		}).onError(UnsupportedVaultFormatException.class, e -> {
-			// TODO
 		}).onError(NotDirectoryException.class, e -> {
 			LOG.error("Unlock failed. Mount point not a directory: {}", e.getMessage());
-			// TODO
+			window.setScene(invalidMountPointScene.get());
 		}).onError(DirectoryNotEmptyException.class, e -> {
 			LOG.error("Unlock failed. Mount point not empty: {}", e.getMessage());
-			// TODO
+			window.setScene(invalidMountPointScene.get());
 		}).onError(Exception.class, e -> { // including RuntimeExceptions
 			LOG.error("Unlock failed for technical reasons.", e);
 			genericErrorCause.set(e);

+ 39 - 0
main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java

@@ -0,0 +1,39 @@
+package org.cryptomator.ui.unlock;
+
+import dagger.Lazy;
+import javafx.fxml.FXML;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+import org.cryptomator.common.vaults.Vault;
+import org.cryptomator.ui.common.FxController;
+import org.cryptomator.ui.common.FxmlFile;
+import org.cryptomator.ui.common.FxmlScene;
+
+import javax.inject.Inject;
+
+@UnlockScoped
+public class UnlockInvalidMountPointController implements FxController {
+
+	private final Stage window;
+	private final Lazy<Scene> unlockScene;
+	private final Vault vault;
+
+	@Inject
+	UnlockInvalidMountPointController(@UnlockWindow Stage window, @FxmlScene(FxmlFile.UNLOCK) Lazy<Scene> unlockScene, @UnlockWindow Vault vault) {
+		this.window = window;
+		this.unlockScene = unlockScene;
+		this.vault = vault;
+	}
+
+	@FXML
+	public void back() {
+		window.setScene(unlockScene.get());
+	}
+
+	/* Getter/Setter */
+
+	public String getMountPoint() {
+		return vault.getVaultSettings().getIndividualMountPath().orElse("AUTO");
+	}
+
+}

+ 13 - 0
main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java

@@ -68,6 +68,14 @@ abstract class UnlockModule {
 		return fxmlLoaders.createScene("/fxml/unlock_success.fxml");
 	}
 
+	@Provides
+	@FxmlScene(FxmlFile.UNLOCK_INVALID_MOUNT_POINT)
+	@UnlockScoped
+	static Scene provideInvalidMountPointScene(@UnlockWindow FXMLLoaderFactory fxmlLoaders) {
+		return fxmlLoaders.createScene("/fxml/unlock_invalid_mount_point.fxml");
+	}
+
+
 	@Provides
 	@FxmlScene(FxmlFile.UNLOCK_GENERIC_ERROR)
 	@UnlockScoped
@@ -88,6 +96,11 @@ abstract class UnlockModule {
 	@FxControllerKey(UnlockSuccessController.class)
 	abstract FxController bindUnlockSuccessController(UnlockSuccessController controller);
 
+	@Binds
+	@IntoMap
+	@FxControllerKey(UnlockInvalidMountPointController.class)
+	abstract FxController bindUnlockInvalidMountPointController(UnlockInvalidMountPointController controller);
+
 	@Binds
 	@IntoMap
 	@FxControllerKey(UnlockGenericErrorController.class)

+ 45 - 0
main/ui/src/main/resources/fxml/unlock_invalid_mount_point.fxml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.ButtonBar?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.Region?>
+<?import javafx.scene.layout.StackPane?>
+<?import javafx.scene.layout.VBox?>
+<?import javafx.scene.shape.Circle?>
+<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
+<?import org.cryptomator.ui.controls.FormattedLabel?>
+<VBox xmlns="http://javafx.com/javafx"
+	  xmlns:fx="http://javafx.com/fxml"
+	  fx:controller="org.cryptomator.ui.unlock.UnlockInvalidMountPointController"
+	  minWidth="400"
+	  maxWidth="400"
+	  minHeight="145"
+	  spacing="12">
+	<padding>
+		<Insets topRightBottomLeft="12"/>
+	</padding>
+	<children>
+		<HBox spacing="12" VBox.vgrow="ALWAYS">
+			<StackPane alignment="CENTER" HBox.hgrow="NEVER">
+				<Circle styleClass="glyph-icon-primary" radius="24"/>
+				<FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/>
+			</StackPane>
+			<VBox spacing="6" HBox.hgrow="ALWAYS">
+				<FormattedLabel format="%unlock.error.invalidMountPoint" arg1="${controller.mountPoint}" wrapText="true"/>
+			</VBox>
+		</HBox>
+
+		<Region VBox.vgrow="ALWAYS"/>
+
+		<VBox alignment="BOTTOM_CENTER" VBox.vgrow="ALWAYS">
+			<ButtonBar buttonMinWidth="120" buttonOrder="B+U">
+				<buttons>
+					<Button text="%generic.button.back" ButtonBar.buttonData="BACK_PREVIOUS" cancelButton="true" onAction="#back"/>
+					<Region ButtonBar.buttonData="OTHER"/>
+				</buttons>
+			</ButtonBar>
+		</VBox>
+	</children>
+</VBox>

+ 2 - 0
main/ui/src/main/resources/i18n/strings.properties

@@ -97,6 +97,8 @@ unlock.unlockBtn=Unlock
 ## Success
 unlock.success.message=Unlocked "%s" successfully! Your vault is now accessible.
 unlock.success.revealBtn=Reveal Vault
+## Invalid Mount Point
+unlock.error.invalidMountPoint=Mount point is not an empty directory: %s
 
 # Migration
 migration.title=Upgrade Vault