From aa22f656e8c78e67c5726dc218a38657bc939cab Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 2 Nov 2020 17:34:34 +0100 Subject: [PATCH] Moving the code for unregular unmount leftovers from mountpoint chooser to an own class and execute it at each application start. --- .../mountpoint/UnregularUnmountCleaner.java | 60 +++++++++++++++++++ .../cryptomator/ui/launcher/UiLauncher.java | 10 +++- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 main/commons/src/main/java/org/cryptomator/common/mountpoint/UnregularUnmountCleaner.java diff --git a/main/commons/src/main/java/org/cryptomator/common/mountpoint/UnregularUnmountCleaner.java b/main/commons/src/main/java/org/cryptomator/common/mountpoint/UnregularUnmountCleaner.java new file mode 100644 index 000000000..3229f909c --- /dev/null +++ b/main/commons/src/main/java/org/cryptomator/common/mountpoint/UnregularUnmountCleaner.java @@ -0,0 +1,60 @@ +package org.cryptomator.common.mountpoint; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.Collection; + +public class UnregularUnmountCleaner { + + public static Logger LOG = LoggerFactory.getLogger(UnregularUnmountCleaner.class); + + public static void removeUnregularUnmountDebris(Path dirOfMountPoints) { + Collection exceptionCatcher = new ArrayList<>(); + try { + LOG.debug("Performing cleanup of mountpoint dir {}.", dirOfMountPoints); + Files.list(dirOfMountPoints).filter(p -> { + if (Files.isDirectory(p, LinkOption.NOFOLLOW_LINKS)) { + return true; + } else { + LOG.debug("Found non-directory element in mountpoint dir: {}", p); + return false; + } + }).forEach(dir -> { + try { + try { + Files.readAttributes(dir, BasicFileAttributes.class); //we follow the link and see if it exists + } catch (NoSuchFileException e) { + Files.delete(dir); //broken link file, we delete it + LOG.debug("Removed broken entry {} from mountpoint dir."); + return; + } + //check if dir is empty + if (Files.list(dir).findFirst().isEmpty()) { + Files.delete(dir); + LOG.debug("Removed empty dir {} from mountpoint dir."); + } else { + LOG.debug("Found non-empty directory in mountpoint dir: {}", dir); + } + } catch (IOException e) { + exceptionCatcher.add(e); + } + }); + + exceptionCatcher.forEach(exception -> { + LOG.debug("Unable to clean element from mountpoint dir due to", exception); + }); + } catch (IOException e) { + LOG.debug("Unable to perform cleanup of mountpoint dir {}.", dirOfMountPoints, e); + } + + } + +} 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 ad98fe226..9b9e7ee05 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,5 +1,7 @@ package org.cryptomator.ui.launcher; +import org.cryptomator.common.Environment; +import org.cryptomator.common.mountpoint.UnregularUnmountCleaner; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.vaults.Vault; import org.cryptomator.jni.JniException; @@ -30,15 +32,17 @@ public class UiLauncher { private final FxApplicationStarter fxApplicationStarter; private final AppLaunchEventHandler launchEventHandler; private final Optional macFunctions; + private final Environment env; @Inject - public UiLauncher(Settings settings, ObservableList vaults, TrayMenuComponent.Builder trayComponent, FxApplicationStarter fxApplicationStarter, AppLaunchEventHandler launchEventHandler, Optional macFunctions) { + public UiLauncher(Settings settings, ObservableList vaults, TrayMenuComponent.Builder trayComponent, FxApplicationStarter fxApplicationStarter, AppLaunchEventHandler launchEventHandler, Optional macFunctions, Environment env) { this.settings = settings; this.vaults = vaults; this.trayComponent = trayComponent; this.fxApplicationStarter = fxApplicationStarter; this.launchEventHandler = launchEventHandler; this.macFunctions = macFunctions; + this.env = env; } public void launch() { @@ -61,6 +65,10 @@ 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().ifPresent(UnregularUnmountCleaner::removeUnregularUnmountDebris); + // auto unlock Collection vaultsToAutoUnlock = vaults.filtered(this::shouldAttemptAutoUnlock); if (!vaultsToAutoUnlock.isEmpty()) {