diff --git a/src/main/java/org/cryptomator/common/mount/MountModule.java b/src/main/java/org/cryptomator/common/mount/MountModule.java index cbcb23e82..5e448a680 100644 --- a/src/main/java/org/cryptomator/common/mount/MountModule.java +++ b/src/main/java/org/cryptomator/common/mount/MountModule.java @@ -2,23 +2,16 @@ package org.cryptomator.common.mount; import dagger.Module; import dagger.Provides; -import org.cryptomator.common.ObservableUtil; -import org.cryptomator.common.settings.Settings; -import org.cryptomator.integrations.mount.Mount; import org.cryptomator.integrations.mount.MountService; import javax.inject.Named; import javax.inject.Singleton; -import javafx.beans.value.ObservableValue; import java.util.List; import java.util.concurrent.atomic.AtomicReference; @Module public class MountModule { - private static final AtomicReference formerSelectedMountService = new AtomicReference<>(null); - private static final List problematicFuseMountServices = List.of("org.cryptomator.frontend.fuse.mount.MacFuseMountProvider", "org.cryptomator.frontend.fuse.mount.FuseTMountProvider"); - @Provides @Singleton static List provideSupportedMountServices() { @@ -31,42 +24,4 @@ public class MountModule { static AtomicReference provideFirstUsedProblematicFuseMountService() { return new AtomicReference<>(null); } - - @Provides - @Singleton - static ObservableValue provideMountService(Settings settings, List serviceImpls, @Named("FUPFMS") AtomicReference fupfms) { - var fallbackProvider = serviceImpls.stream().findFirst().orElse(null); - - var observableMountService = ObservableUtil.mapWithDefault(settings.mountService, // - desiredServiceImpl -> { // - var serviceFromSettings = serviceImpls.stream().filter(serviceImpl -> serviceImpl.getClass().getName().equals(desiredServiceImpl)).findAny(); // - var targetedService = serviceFromSettings.orElse(fallbackProvider); - return applyWorkaroundForProblematicFuse(targetedService, serviceFromSettings.isPresent(), fupfms); - }, // - () -> { // - return applyWorkaroundForProblematicFuse(fallbackProvider, true, fupfms); - }); - return observableMountService; - } - - //see https://github.com/cryptomator/cryptomator/issues/2786 - private synchronized static ActualMountService applyWorkaroundForProblematicFuse(MountService targetedService, boolean isDesired, AtomicReference firstUsedProblematicFuseMountService) { - //set the first used problematic fuse service if applicable - var targetIsProblematicFuse = isProblematicFuseService(targetedService); - if (targetIsProblematicFuse && firstUsedProblematicFuseMountService.get() == null) { - firstUsedProblematicFuseMountService.set(targetedService); - } - - //do not use the targeted mount service and fallback to former one, if the service is problematic _and_ not the first problematic one used. - if (targetIsProblematicFuse && !firstUsedProblematicFuseMountService.get().equals(targetedService)) { - return new ActualMountService(formerSelectedMountService.get(), false); - } else { - formerSelectedMountService.set(targetedService); - return new ActualMountService(targetedService, isDesired); - } - } - - public static boolean isProblematicFuseService(MountService service) { - return problematicFuseMountServices.contains(service.getClass().getName()); - } } diff --git a/src/main/java/org/cryptomator/common/mount/Mounter.java b/src/main/java/org/cryptomator/common/mount/Mounter.java index 7273b62c0..0cd838b9e 100644 --- a/src/main/java/org/cryptomator/common/mount/Mounter.java +++ b/src/main/java/org/cryptomator/common/mount/Mounter.java @@ -1,7 +1,6 @@ package org.cryptomator.common.mount; import org.cryptomator.common.Environment; -import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.integrations.mount.Mount; import org.cryptomator.integrations.mount.MountBuilder; @@ -24,13 +23,11 @@ import static org.cryptomator.integrations.mount.MountCapability.UNMOUNT_FORCED; @Singleton public class Mounter { - private final Settings settings; private final Environment env; private final WindowsDriveLetters driveLetters; @Inject - public Mounter(Settings settings, Environment env, WindowsDriveLetters driveLetters) { - this.settings = settings; + public Mounter(Environment env, WindowsDriveLetters driveLetters) { this.env = env; this.driveLetters = driveLetters; } diff --git a/src/main/java/org/cryptomator/common/vaults/VaultModule.java b/src/main/java/org/cryptomator/common/vaults/VaultModule.java index 7115a40e5..7e08e5e8a 100644 --- a/src/main/java/org/cryptomator/common/vaults/VaultModule.java +++ b/src/main/java/org/cryptomator/common/vaults/VaultModule.java @@ -26,6 +26,8 @@ import java.util.concurrent.atomic.AtomicReference; @Module public class VaultModule { + private static final AtomicReference formerSelectedMountService = new AtomicReference<>(null); + private static final List problematicFuseMountServices = List.of("org.cryptomator.frontend.fuse.mount.MacFuseMountProvider", "org.cryptomator.frontend.fuse.mount.FuseTMountProvider"); private static final Logger LOG = LoggerFactory.getLogger(VaultModule.class); @Provides @@ -39,14 +41,37 @@ public class VaultModule { @PerVault static ObservableValue provideMountService(VaultSettings vaultSettings, List serviceImpls, @Named("FUPFMS") AtomicReference fupfms) { var fallbackProvider = serviceImpls.stream().findFirst().orElse(null); - return ObservableUtil.mapWithDefault(vaultSettings.mountService, // + var observableMountService = ObservableUtil.mapWithDefault(vaultSettings.mountService, // desiredServiceImpl -> { // var serviceFromSettings = serviceImpls.stream().filter(serviceImpl -> serviceImpl.getClass().getName().equals(desiredServiceImpl)).findAny(); // var targetedService = serviceFromSettings.orElse(fallbackProvider); - return new ActualMountService(targetedService,false); + return applyWorkaroundForProblematicFuse(targetedService, serviceFromSettings.isPresent(), fupfms); }, // - () -> new ActualMountService(fallbackProvider,false) - ); + () -> { // + return applyWorkaroundForProblematicFuse(fallbackProvider, true, fupfms); + }); + return observableMountService; + } + + //see https://github.com/cryptomator/cryptomator/issues/2786 + private synchronized static ActualMountService applyWorkaroundForProblematicFuse(MountService targetedService, boolean isDesired, AtomicReference firstUsedProblematicFuseMountService) { + //set the first used problematic fuse service if applicable + var targetIsProblematicFuse = isProblematicFuseService(targetedService); + if (targetIsProblematicFuse && firstUsedProblematicFuseMountService.get() == null) { + firstUsedProblematicFuseMountService.set(targetedService); + } + + //do not use the targeted mount service and fallback to former one, if the service is problematic _and_ not the first problematic one used. + if (targetIsProblematicFuse && !firstUsedProblematicFuseMountService.get().equals(targetedService)) { + return new ActualMountService(formerSelectedMountService.get(), false); + } else { + formerSelectedMountService.set(targetedService); + return new ActualMountService(targetedService, isDesired); + } + } + + public static boolean isProblematicFuseService(MountService service) { + return problematicFuseMountServices.contains(service.getClass().getName()); } @Provides diff --git a/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java b/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java index 653c4c6e6..f684c46c6 100644 --- a/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java +++ b/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java @@ -2,8 +2,8 @@ package org.cryptomator.ui.preferences; import dagger.Lazy; import org.cryptomator.common.ObservableUtil; -import org.cryptomator.common.mount.MountModule; import org.cryptomator.common.settings.Settings; +import org.cryptomator.common.vaults.VaultModule; import org.cryptomator.integrations.mount.MountCapability; import org.cryptomator.integrations.mount.MountService; import org.cryptomator.ui.common.FxController; @@ -61,7 +61,7 @@ public class VolumePreferencesController implements FxController { this.readonlySupported = selectedMountService.map(s -> s.hasCapability(MountCapability.READ_ONLY)); this.fuseRestartRequired = selectedMountService.map(s -> {// return firstUsedProblematicFuseMountService.get() != null // - && MountModule.isProblematicFuseService(s) // + && VaultModule.isProblematicFuseService(s) // && !firstUsedProblematicFuseMountService.get().equals(s); }); @@ -151,7 +151,7 @@ public class VolumePreferencesController implements FxController { /* Helpers */ - private class MountServiceConverter extends StringConverter { + public class MountServiceConverter extends StringConverter { @Override public String toString(MountService provider) { diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/MountOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/MountOptionsController.java index df9777140..0cfd022df 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/MountOptionsController.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/MountOptionsController.java @@ -3,12 +3,10 @@ package org.cryptomator.ui.vaultoptions; import com.google.common.base.Strings; import dagger.Lazy; import org.cryptomator.common.ObservableUtil; -import org.cryptomator.common.mount.ActualMountService; -import org.cryptomator.common.mount.MountModule; import org.cryptomator.common.mount.WindowsDriveLetters; -import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.vaults.Vault; +import org.cryptomator.common.vaults.VaultModule; import org.cryptomator.integrations.mount.MountCapability; import org.cryptomator.integrations.mount.MountService; import org.cryptomator.ui.common.FxController; @@ -85,8 +83,7 @@ public class MountOptionsController implements FxController { @VaultOptionsWindow Vault vault, // WindowsDriveLetters windowsDriveLetters, // ResourceBundle resourceBundle, // - Lazy application, - List mountProviders, // + Lazy application, List mountProviders, // @Named("FUPFMS") AtomicReference firstUsedProblematicFuseMountService) { this.window = window; this.vaultSettings = vault.getVaultSettings(); @@ -97,7 +94,7 @@ public class MountOptionsController implements FxController { this.mountProviders = mountProviders; var fallbackProvider = mountProviders.stream().findFirst().orElse(null); this.selectedMountService = ObservableUtil.mapWithDefault(vaultSettings.mountService, serviceName -> mountProviders.stream().filter(s -> s.getClass().getName().equals(serviceName)).findFirst().orElse(fallbackProvider), fallbackProvider); - this.fuseRestartRequired = selectedMountService.map(s -> firstUsedProblematicFuseMountService.get() != null && MountModule.isProblematicFuseService(s) && !firstUsedProblematicFuseMountService.get().equals(s)); + this.fuseRestartRequired = selectedMountService.map(s -> firstUsedProblematicFuseMountService.get() != null && VaultModule.isProblematicFuseService(s) && !firstUsedProblematicFuseMountService.get().equals(s)); this.loopbackPortSupported = BooleanExpression.booleanExpression(selectedMountService.map(s -> s.hasCapability(MountCapability.LOOPBACK_PORT))); this.defaultMountFlags = selectedMountService.map(s -> {