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