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 4dddee38f..348a0f150 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 @@ -43,6 +43,10 @@ final class LinuxGvfsWebDavMounter implements WebDavMounterStrategy { "gvfs-mount \"dav:$DAV_SSP\"", "xdg-open \"dav:$DAV_SSP\"") .addEnv("DAV_SSP", uri.getRawSchemeSpecificPart()); + final Script testMountStillExistsScript = Script.fromLines( + "set -x", + "test `gvfs-mount --list | grep \"$DAV_SSP\" | wc -l` -eq 1") + .addEnv("DAV_SSP", uri.getRawSchemeSpecificPart()); final Script unmountScript = Script.fromLines( "set -x", "gvfs-mount -u \"dav:$DAV_SSP\"") @@ -51,7 +55,17 @@ final class LinuxGvfsWebDavMounter implements WebDavMounterStrategy { return new AbstractWebDavMount() { @Override public void unmount() throws CommandFailedException { - unmountScript.execute(); + boolean mountStillExists; + try { + testMountStillExistsScript.execute(); + mountStillExists = true; + } catch(CommandFailedException e) { + mountStillExists = false; + } + // only attempt unmount if user didn't unmount manually: + if (mountStillExists) { + unmountScript.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 65f0cfa13..95a59d961 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,8 @@ package org.cryptomator.ui.util.mount; import java.net.URI; +import java.nio.file.FileSystems; +import java.nio.file.Files; import java.util.UUID; import org.apache.commons.lang3.SystemUtils; @@ -46,7 +48,10 @@ final class MacOsXWebDavMounter implements WebDavMounterStrategy { return new AbstractWebDavMount() { @Override public void unmount() throws CommandFailedException { - unmountScript.execute(); + // only attempt unmount if user didn't unmount manually: + if (Files.exists(FileSystems.getDefault().getPath(path))) { + unmountScript.execute(); + } } }; } 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 f983c784a..b8bc246c0 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 @@ -12,6 +12,8 @@ package org.cryptomator.ui.util.mount; import static org.cryptomator.ui.util.command.Script.fromLines; import java.net.URI; +import java.nio.file.FileSystems; +import java.nio.file.Files; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -65,8 +67,8 @@ final class WindowsWebDavMounter implements WebDavMounterStrategy { throw ex; } else { try { - // retry after 500ms - Thread.sleep(500); + // retry after 2s + Thread.sleep(2000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } @@ -76,10 +78,14 @@ final class WindowsWebDavMounter implements WebDavMounterStrategy { final Script openExplorerScript = fromLines("start explorer.exe " + driveLetter); openExplorerScript.execute(); final Script unmountScript = fromLines("net use " + driveLetter + " /delete").addEnv("DRIVE_LETTER", driveLetter); + final String finalDriveLetter = driveLetter; return new AbstractWebDavMount() { @Override public void unmount() throws CommandFailedException { - unmountScript.execute(); + // only attempt unmount if user didn't unmount manually: + if (Files.exists(FileSystems.getDefault().getPath(finalDriveLetter))) { + unmountScript.execute(); + } } }; }