diff --git a/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/WebDavServlet.java b/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/WebDavServlet.java
index c4c549c9b..48752c20c 100644
--- a/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/WebDavServlet.java
+++ b/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/WebDavServlet.java
@@ -55,15 +55,16 @@ public class WebDavServlet extends AbstractWebdavServlet {
public void destroy() {
backgroundTaskExecutor.shutdown();
try {
- final boolean tasksFinished = backgroundTaskExecutor.awaitTermination(10, TimeUnit.SECONDS);
+ final boolean tasksFinished = backgroundTaskExecutor.awaitTermination(2, TimeUnit.SECONDS);
if (!tasksFinished) {
backgroundTaskExecutor.shutdownNow();
}
} catch (InterruptedException e) {
backgroundTaskExecutor.shutdownNow();
Thread.currentThread().interrupt();
+ } finally {
+ super.destroy();
}
- super.destroy();
}
@Override
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 05057d0ea..1a708e30f 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
@@ -144,9 +144,7 @@ public class UnlockController implements Initializable {
progressIndicator.setVisible(false);
setControlsDisabled(false);
if (vault.isUnlocked() && !mountSuccess) {
- vault.getCryptor().swipeSensitiveData();
vault.stopServer();
- vault.setUnlocked(false);
}
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 2f625317b..38a12aa0b 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
@@ -27,8 +27,7 @@ import javafx.util.Duration;
import org.cryptomator.crypto.CryptorIOSampling;
import org.cryptomator.ui.model.Vault;
-
-import com.google.inject.Inject;
+import org.cryptomator.ui.util.mount.CommandFailedException;
public class UnlockedController implements Initializable {
@@ -47,18 +46,21 @@ public class UnlockedController implements Initializable {
@FXML
private NumberAxis xAxis;
- @Inject
- public UnlockedController() {
- super();
- }
+ private ResourceBundle rb;
@Override
public void initialize(URL url, ResourceBundle rb) {
+ this.rb = rb;
}
@FXML
private void didClickCloseVault(ActionEvent event) {
- vault.unmount();
+ try {
+ vault.unmount();
+ } catch (CommandFailedException e) {
+ messageLabel.setText(rb.getString("unlocked.label.unmountFailed"));
+ return;
+ }
vault.stopServer();
vault.setUnlocked(false);
if (listener != null) {
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 db11db34c..9b20e48cc 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
@@ -88,9 +88,14 @@ public class Vault implements Serializable {
}
public void stopServer() {
- unmount();
+ try {
+ unmount();
+ } catch (CommandFailedException e) {
+ LOG.warn("Unmounting failed. Locking anyway...", e);
+ }
webDavServlet.close();
cryptor.swipeSensitiveData();
+ setUnlocked(false);
namesOfResourcesWithInvalidMac.clear();
}
@@ -108,8 +113,12 @@ public class Vault implements Serializable {
}
}
- public void unmount() {
- webDavMount.close();
+ public void unmount() throws CommandFailedException {
+ final WebDavMount mnt = webDavMount.get().orElse(null);
+ if (mnt != null) {
+ mnt.unmount();
+ }
+ webDavMount = DeferredClosable.empty();
}
/* Getter/Setter */
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 1dd66d403..65f0cfa13 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
@@ -10,6 +10,7 @@
package org.cryptomator.ui.util.mount;
import java.net.URI;
+import java.util.UUID;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.ui.util.command.Script;
@@ -28,7 +29,8 @@ final class MacOsXWebDavMounter implements WebDavMounterStrategy {
@Override
public WebDavMount mount(URI uri, String name) throws CommandFailedException {
- final String path = "/Volumes/Cryptomator" + uri.getRawPath().replace('/', '_');
+ // we don't use the uri to derive a path, as it *could* be longer than 255 chars.
+ 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\"",
diff --git a/main/ui/src/main/resources/fxml/unlocked.fxml b/main/ui/src/main/resources/fxml/unlocked.fxml
index f4923f94f..9a1e98bb5 100644
--- a/main/ui/src/main/resources/fxml/unlocked.fxml
+++ b/main/ui/src/main/resources/fxml/unlocked.fxml
@@ -35,7 +35,8 @@
-
+
+
diff --git a/main/ui/src/main/resources/localization.properties b/main/ui/src/main/resources/localization.properties
index efec4f037..11b6c5abd 100644
--- a/main/ui/src/main/resources/localization.properties
+++ b/main/ui/src/main/resources/localization.properties
@@ -46,6 +46,7 @@ changePassword.infoMessage.success=Password changed.
# unlocked.fxml
unlocked.button.lock=Lock vault
+unlocked.label.unmountFailed=Ejecting drive failed.
unlocked.ioGraph.yAxis.label=Throughput (MiB/s)
# mac_warnings.fxml