From 104c3b64f6c3f072ecf67343784f38e4f00b0a97 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Sun, 4 Oct 2015 22:01:01 +0200 Subject: [PATCH] - fixes #75 - restored progress indicator, broken by previous commit --- .../ui/controllers/UnlockController.java | 21 ++++++++++++++++--- .../ui/controllers/UnlockedController.java | 10 +++++++++ .../java/org/cryptomator/ui/model/Vault.java | 17 ++++++++++----- .../ui/util/mount/FallbackWebDavMounter.java | 9 ++++++++ .../ui/util/mount/LinuxGvfsWebDavMounter.java | 14 ++++++++----- .../ui/util/mount/MacOsXWebDavMounter.java | 11 ++++++++-- .../ui/util/mount/WebDavMount.java | 7 +++++++ .../ui/util/mount/WindowsWebDavMounter.java | 6 +++++- main/ui/src/main/resources/fxml/unlocked.fxml | 7 ++++++- .../main/resources/localization.properties | 2 ++ 10 files changed, 87 insertions(+), 17 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java index d44d0f4eb..937e4688b 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java @@ -29,6 +29,7 @@ import org.cryptomator.crypto.exceptions.WrongPasswordException; import org.cryptomator.ui.controls.SecPasswordField; import org.cryptomator.ui.model.Vault; import org.cryptomator.ui.util.FXThreads; +import org.cryptomator.ui.util.mount.CommandFailedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -170,14 +171,23 @@ public class UnlockController extends AbstractFXMLViewController { final Future futureMount = exec.submit(() -> (boolean) vault.mount()); FXThreads.runOnMainThreadWhenFinished(exec, futureMount, this::unlockAndMountFinished); } catch (IOException ex) { + setControlsDisabled(false); + progressIndicator.setVisible(false); messageText.setText(resourceBundle.getString("unlock.errorMessage.decryptionFailed")); LOG.error("Decryption failed for technical reasons.", ex); } catch (WrongPasswordException e) { + setControlsDisabled(false); + progressIndicator.setVisible(false); messageText.setText(resourceBundle.getString("unlock.errorMessage.wrongPassword")); + Platform.runLater(passwordField::requestFocus); } catch (UnsupportedKeyLengthException ex) { + setControlsDisabled(false); + progressIndicator.setVisible(false); messageText.setText(resourceBundle.getString("unlock.errorMessage.unsupportedKeyLengthInstallJCE")); LOG.warn("Unsupported Key-Length. Please install Oracle Java Cryptography Extension (JCE).", ex); } catch (UnsupportedVaultException e) { + setControlsDisabled(false); + progressIndicator.setVisible(false); downloadsPageLink.setVisible(true); if (e.isVaultOlderThanSoftware()) { messageText.setText(resourceBundle.getString("unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware") + " "); @@ -185,12 +195,11 @@ public class UnlockController extends AbstractFXMLViewController { messageText.setText(resourceBundle.getString("unlock.errorMessage.unsupportedVersion.softwareOlderThanVault") + " "); } } catch (DestroyFailedException e) { - LOG.error("Destruction of cryptor threw an exception.", e); - } finally { setControlsDisabled(false); progressIndicator.setVisible(false); + LOG.error("Destruction of cryptor threw an exception.", e); + } finally { passwordField.swipe(); - Platform.runLater(passwordField::requestFocus); } } @@ -207,6 +216,12 @@ public class UnlockController extends AbstractFXMLViewController { if (vault.isUnlocked() && !mountSuccess) { vault.stopServer(); vault.setUnlocked(false); + } else if (vault.isUnlocked() && mountSuccess) { + try { + vault.reveal(); + } catch (CommandFailedException e) { + LOG.error("Failed to reveal mounted vault", e); + } } if (mountSuccess && listener != null) { listener.didUnlock(this); diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockedController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockedController.java index ba1896ef9..5ae6708cc 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockedController.java @@ -76,6 +76,16 @@ public class UnlockedController extends AbstractFXMLViewController { ActiveWindowStyleSupport.startObservingFocus(macWarningsWindow); } + @FXML + private void didClickRevealVault(ActionEvent event) { + try { + vault.reveal(); + } catch (CommandFailedException e) { + messageLabel.setText(resourceBundle.getString("unlocked.label.revealFailed")); + return; + } + } + @FXML private void didClickCloseVault(ActionEvent event) { try { diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java index 2e00b719b..63d8de49c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java @@ -10,11 +10,6 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; - import javax.security.auth.DestroyFailedException; import org.apache.commons.lang3.StringUtils; @@ -30,6 +25,11 @@ import org.cryptomator.webdav.WebDavServer.ServletLifeCycleAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + public class Vault implements Serializable { private static final long serialVersionUID = 3754487289683599469L; @@ -123,6 +123,13 @@ public class Vault implements Serializable { } } + public void reveal() throws CommandFailedException { + final WebDavMount mnt = webDavMount.get().orElse(null); + if (mnt != null) { + mnt.reveal(); + } + } + public void unmount() throws CommandFailedException { final WebDavMount mnt = webDavMount.get().orElse(null); if (mnt != null) { diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/FallbackWebDavMounter.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/FallbackWebDavMounter.java index 6b95390ac..9029f5dbe 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/FallbackWebDavMounter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/FallbackWebDavMounter.java @@ -35,6 +35,11 @@ final class FallbackWebDavMounter implements WebDavMounterStrategy { public void unmount() { displayUnmountInstructions(); } + + @Override + public void reveal() throws CommandFailedException { + displayRevealInstructions(); + } }; } @@ -47,4 +52,8 @@ final class FallbackWebDavMounter implements WebDavMounterStrategy { // TODO display message to user pointing to cryptomator.org/mounting#unmount which describes what to do } + private void displayRevealInstructions() { + // TODO display message to user pointing to cryptomator.org/mounting#reveal which describes what to do + } + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/LinuxGvfsWebDavMounter.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/LinuxGvfsWebDavMounter.java index 65e023377..fd82e164a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/LinuxGvfsWebDavMounter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/LinuxGvfsWebDavMounter.java @@ -52,11 +52,6 @@ final class LinuxGvfsWebDavMounter implements WebDavMounterStrategy { "gvfs-mount -u \"dav:$DAV_SSP\"") .addEnv("DAV_SSP", uri.getRawSchemeSpecificPart()); mountScript.execute(); - try{ - openMountWithWebdavUri("dav:"+uri.getRawSchemeSpecificPart()).execute(); - }catch(CommandFailedException exception){ - openMountWithWebdavUri("webdav:"+uri.getRawSchemeSpecificPart()).execute(); - } return new AbstractWebDavMount() { @Override public void unmount() throws CommandFailedException { @@ -72,6 +67,15 @@ final class LinuxGvfsWebDavMounter implements WebDavMounterStrategy { unmountScript.execute(); } } + + @Override + public void reveal() throws CommandFailedException { + try { + openMountWithWebdavUri("dav:"+uri.getRawSchemeSpecificPart()).execute(); + } catch (CommandFailedException exception) { + openMountWithWebdavUri("webdav:"+uri.getRawSchemeSpecificPart()).execute(); + } + } }; } diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/MacOsXWebDavMounter.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/MacOsXWebDavMounter.java index 95a59d961..2b4c3588a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/MacOsXWebDavMounter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/MacOsXWebDavMounter.java @@ -35,12 +35,14 @@ final class MacOsXWebDavMounter implements WebDavMounterStrategy { final String path = "/Volumes/Cryptomator_" + UUID.randomUUID().toString(); final Script mountScript = Script.fromLines( "mkdir \"$MOUNT_PATH\"", - "mount_webdav -S -v $MOUNT_NAME \"$DAV_AUTHORITY$DAV_PATH\" \"$MOUNT_PATH\"", - "open \"$MOUNT_PATH\"") + "mount_webdav -S -v $MOUNT_NAME \"$DAV_AUTHORITY$DAV_PATH\" \"$MOUNT_PATH\"") .addEnv("DAV_AUTHORITY", uri.getRawAuthority()) .addEnv("DAV_PATH", uri.getRawPath()) .addEnv("MOUNT_PATH", path) .addEnv("MOUNT_NAME", name); + final Script revealScript = Script.fromLines( + "open \"$MOUNT_PATH\"") + .addEnv("MOUNT_PATH", path); final Script unmountScript = Script.fromLines( "diskutil umount $MOUNT_PATH") .addEnv("MOUNT_PATH", path); @@ -53,6 +55,11 @@ final class MacOsXWebDavMounter implements WebDavMounterStrategy { unmountScript.execute(); } } + + @Override + public void reveal() throws CommandFailedException { + revealScript.execute(); + } }; } diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WebDavMount.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WebDavMount.java index 7df043421..46abfe83d 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WebDavMount.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WebDavMount.java @@ -22,4 +22,11 @@ public interface WebDavMount extends AutoCloseable { */ void unmount() throws CommandFailedException; + /** + * Reveals the mounted drive in the operating systems default file browser. + * + * @throws CommandFailedException if the reveal operation fails + */ + void reveal() throws CommandFailedException; + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsWebDavMounter.java b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsWebDavMounter.java index 66d200839..26cf5ff41 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsWebDavMounter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/util/mount/WindowsWebDavMounter.java @@ -61,7 +61,6 @@ final class WindowsWebDavMounter implements WebDavMounterStrategy { final String driveLetter = getDriveLetter(mountResult.getStdOut()); final Script openExplorerScript = fromLines("start explorer.exe " + driveLetter); - openExplorerScript.execute(); final Script unmountScript = fromLines("net use " + driveLetter + " /delete").addEnv("DRIVE_LETTER", driveLetter); return new AbstractWebDavMount() { @Override @@ -71,6 +70,11 @@ final class WindowsWebDavMounter implements WebDavMounterStrategy { unmountScript.execute(); } } + + @Override + public void reveal() throws CommandFailedException { + openExplorerScript.execute(); + } }; } diff --git a/main/ui/src/main/resources/fxml/unlocked.fxml b/main/ui/src/main/resources/fxml/unlocked.fxml index 77e8809e3..ef546a859 100644 --- a/main/ui/src/main/resources/fxml/unlocked.fxml +++ b/main/ui/src/main/resources/fxml/unlocked.fxml @@ -16,6 +16,7 @@ + @@ -36,7 +37,11 @@