diff --git a/main/commons/src/main/java/org/cryptomator/common/mountpoint/IrregularUnmountCleaner.java b/main/commons/src/main/java/org/cryptomator/common/mountpoint/IrregularUnmountCleaner.java index 8be740fc3..a01e385d6 100644 --- a/main/commons/src/main/java/org/cryptomator/common/mountpoint/IrregularUnmountCleaner.java +++ b/main/commons/src/main/java/org/cryptomator/common/mountpoint/IrregularUnmountCleaner.java @@ -10,7 +10,7 @@ import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; -public class IrregularUnmountCleaner { +class IrregularUnmountCleaner { public static Logger LOG = LoggerFactory.getLogger(IrregularUnmountCleaner.class); @@ -48,7 +48,6 @@ public class IrregularUnmountCleaner { private static void deleteEmptyDir(Path dir) throws IOException { assert Files.isDirectory(dir, LinkOption.NOFOLLOW_LINKS); try { - checkEmpty(dir); Files.delete(dir); // attempt to delete dir non-recursively (will fail, if there are contents) } catch (DirectoryNotEmptyException e) { LOG.info("Found non-empty directory in mountpoint dir: {}", dir); @@ -62,10 +61,4 @@ public class IrregularUnmountCleaner { } } - private static void checkEmpty(Path dir) throws IOException { - if(Files.newDirectoryStream(dir).iterator().hasNext()) { - throw new DirectoryNotEmptyException(dir.toString()); - } - } - } diff --git a/main/commons/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java b/main/commons/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java index 9b2d502d9..0db2e7892 100644 --- a/main/commons/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java +++ b/main/commons/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java @@ -11,9 +11,11 @@ import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; class TemporaryMountPointChooser implements MountPointChooser { @@ -22,6 +24,7 @@ class TemporaryMountPointChooser implements MountPointChooser { private final VaultSettings vaultSettings; private final Environment environment; + private volatile boolean clearedDebris; @Inject public TemporaryMountPointChooser(VaultSettings vaultSettings, Environment environment) { @@ -40,9 +43,24 @@ class TemporaryMountPointChooser implements MountPointChooser { @Override public Optional chooseMountPoint(Volume caller) { + clearDebrisIfNeeded(); return this.environment.getMountPointsDir().map(this::choose); } + //clean leftovers of not-regularly unmounted vaults + //see https://github.com/cryptomator/cryptomator/issues/1013 and https://github.com/cryptomator/cryptomator/issues/1061 + private synchronized void clearDebrisIfNeeded() { + assert environment.getMountPointsDir().isPresent(); + if (clearedDebris) { + return; // already cleared + } + Path mountPointDir = environment.getMountPointsDir().get(); + if (Files.exists(mountPointDir, LinkOption.NOFOLLOW_LINKS)) { + IrregularUnmountCleaner.removeIrregularUnmountDebris(mountPointDir); + } + clearedDebris = true; + } + private Path choose(Path parent) { String basename = this.vaultSettings.mountName().get(); //regular @@ -51,13 +69,13 @@ class TemporaryMountPointChooser implements MountPointChooser { return mountPoint; } //with id - mountPoint = parent.resolve(basename + " (" +vaultSettings.getId() + ")"); + mountPoint = parent.resolve(basename + " (" + vaultSettings.getId() + ")"); if (Files.notExists(mountPoint)) { return mountPoint; } //with id and count for (int i = 1; i < MAX_TMPMOUNTPOINT_CREATION_RETRIES; i++) { - mountPoint = parent.resolve(basename + "_(" +vaultSettings.getId() + ")_"+i); + mountPoint = parent.resolve(basename + "_(" + vaultSettings.getId() + ")_" + i); if (Files.notExists(mountPoint)) { return mountPoint; } diff --git a/main/ui/src/main/java/org/cryptomator/ui/launcher/UiLauncher.java b/main/ui/src/main/java/org/cryptomator/ui/launcher/UiLauncher.java index 350a0a1ca..7b3f1d68d 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/launcher/UiLauncher.java +++ b/main/ui/src/main/java/org/cryptomator/ui/launcher/UiLauncher.java @@ -1,7 +1,6 @@ package org.cryptomator.ui.launcher; import org.cryptomator.common.Environment; -import org.cryptomator.common.mountpoint.IrregularUnmountCleaner; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.vaults.Vault; import org.cryptomator.integrations.tray.TrayIntegrationProvider; @@ -16,8 +15,6 @@ import javafx.collections.ObservableList; import java.awt.Desktop; import java.awt.SystemTray; import java.awt.desktop.AppReopenedListener; -import java.nio.file.Files; -import java.nio.file.LinkOption; import java.util.Collection; import java.util.Optional; @@ -65,10 +62,6 @@ public class UiLauncher { // register app reopen listener Desktop.getDesktop().addAppEventListener((AppReopenedListener) e -> showMainWindowAsync(hasTrayIcon)); - //clean leftovers of not-regularly unmounted vaults - //see https://github.com/cryptomator/cryptomator/issues/1013 and https://github.com/cryptomator/cryptomator/issues/1061 - env.getMountPointsDir().filter(path -> Files.exists(path, LinkOption.NOFOLLOW_LINKS)).ifPresent(IrregularUnmountCleaner::removeIrregularUnmountDebris); - // auto unlock Collection vaultsToAutoUnlock = vaults.filtered(this::shouldAttemptAutoUnlock); if (!vaultsToAutoUnlock.isEmpty()) {