diff --git a/main/pom.xml b/main/pom.xml
index a31f000ba..a0542dde3 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -28,7 +28,7 @@
1.5.0-SNAPSHOT
1.0.4
2.0.0
- 0.1.1
+ 0.1.2
2.5
3.6
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/FuseVolume.java b/main/ui/src/main/java/org/cryptomator/ui/model/FuseVolume.java
index 3acc5bb5c..360d46f3a 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/FuseVolume.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/FuseVolume.java
@@ -6,17 +6,25 @@ import org.cryptomator.cryptofs.CryptoFileSystem;
import org.cryptomator.frontend.fuse.mount.EnvironmentVariables;
import org.cryptomator.frontend.fuse.mount.FuseMount;
-import org.cryptomator.frontend.fuse.mount.MountFactory;
+import org.cryptomator.frontend.fuse.mount.FuseMountFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
+import java.io.IOException;
+import java.nio.file.DirectoryNotEmptyException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.nio.file.Paths;
@VaultModule.PerVault
public class FuseVolume implements Volume {
private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class);
+
+ /**
+ * TODO: dont use fixed Strings and rather set them in some system environment variables in the cryptomator installer and load those!
+ */
private static final String DEFAULT_MOUNTROOTPATH_MAC = System.getProperty("user.home") + "/Library/Application Support/Cryptomator";
private static final String DEFAULT_MOUNTROOTPATH_LINUX = System.getProperty("user.home") + "/.Cryptomator";
@@ -25,19 +33,49 @@ public class FuseVolume implements Volume {
private final WindowsDriveLetters windowsDriveLetters;
private CryptoFileSystem cfs;
+ private Path mountPath;
+ private boolean extraDirCreated;
@Inject
public FuseVolume(VaultSettings vaultSettings, WindowsDriveLetters windowsDriveLetters) {
this.vaultSettings = vaultSettings;
this.windowsDriveLetters = windowsDriveLetters;
- this.fuseMnt = MountFactory.createMountObject();
+ this.fuseMnt = FuseMountFactory.createMountObject();
+ this.extraDirCreated = false;
}
@Override
- public void prepare(CryptoFileSystem fs) {
+ public void prepare(CryptoFileSystem fs) throws IOException {
this.cfs = fs;
- if (!(vaultSettings.individualMountPath().isNotNull().get() || SystemUtils.IS_OS_WINDOWS)) {
- fuseMnt.useExtraMountDir();
+ String mountPath;
+ if (SystemUtils.IS_OS_WINDOWS) {
+ //windows case
+ if (vaultSettings.winDriveLetter().get() != null) {
+ // specific drive letter selected
+ mountPath = vaultSettings.winDriveLetter().get() + ":\\";
+ } else {
+ // auto assign drive letter
+ mountPath = windowsDriveLetters.getAvailableDriveLetters().iterator().next() + ":\\";
+ }
+ } else if (vaultSettings.individualMountPath().get() != null) {
+ //specific path given
+ mountPath = vaultSettings.individualMountPath().get();
+ } else {
+ //choose default path & create extra directory
+ mountPath = createDirIfNotExist(SystemUtils.IS_OS_MAC ? DEFAULT_MOUNTROOTPATH_MAC : DEFAULT_MOUNTROOTPATH_LINUX,
+ vaultSettings.mountName().get());
+ extraDirCreated = true;
+ }
+ this.mountPath = Paths.get(mountPath).toAbsolutePath();
+ }
+
+ private String createDirIfNotExist(String prefix, String dirName) throws IOException {
+ Path p = Paths.get(prefix, dirName + vaultSettings.getId());
+ if (Files.isDirectory(p) && !Files.newDirectoryStream(p).iterator().hasNext()) {
+ throw new DirectoryNotEmptyException("Mount point is not empty.");
+ } else {
+ Files.createDirectory(p);
+ return p.toString();
}
}
@@ -45,8 +83,8 @@ public class FuseVolume implements Volume {
public void mount() throws CommandFailedException {
try {
EnvironmentVariables envVars = EnvironmentVariables.create()
- .withMountName(vaultSettings.mountName().getValue() + "_ID-" + vaultSettings.getId())
- .withMountPath(chooseMountRootPath())
+ .withMountName(vaultSettings.mountName().getValue())
+ .withMountPath(mountPath.toString())
.build();
fuseMnt.mount(cfs.getPath("/"), envVars);
} catch (Exception e) {
@@ -54,25 +92,6 @@ public class FuseVolume implements Volume {
}
}
- private String chooseMountRootPath() {
- if (SystemUtils.IS_OS_WINDOWS) {
- //windows case
- if (vaultSettings.winDriveLetter().get() != null) {
- // specific drive letter selected
- return vaultSettings.winDriveLetter().getValue() + ":\\";
- } else {
- // auto assign drive letter selected
- return windowsDriveLetters.getAvailableDriveLetters().iterator().next() + ":\\";
- }
- } else if (vaultSettings.individualMountPath().isNotNull().get()) {
- //specific path given
- return vaultSettings.individualMountPath().getValue();
- } else {
- //choose default path
- return SystemUtils.IS_OS_MAC ? DEFAULT_MOUNTROOTPATH_MAC : DEFAULT_MOUNTROOTPATH_LINUX;
- }
- }
-
@Override
public void reveal() throws CommandFailedException {
try {
@@ -107,10 +126,12 @@ public class FuseVolume implements Volume {
@Override
public void stop() {
- try {
- fuseMnt.cleanUp();
- } catch (org.cryptomator.frontend.fuse.mount.CommandFailedException e) {
- LOG.warn(e.getMessage());
+ if (extraDirCreated) {
+ try {
+ Files.delete(mountPath);
+ } catch (IOException e) {
+ LOG.warn("Could not delete mounting directory:" + e.getMessage());
+ }
}
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/Volume.java b/main/ui/src/main/java/org/cryptomator/ui/model/Volume.java
index 24954a47c..e1bdbb6fc 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/model/Volume.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/model/Volume.java
@@ -2,12 +2,14 @@ package org.cryptomator.ui.model;
import org.cryptomator.cryptofs.CryptoFileSystem;
+import java.io.IOException;
+
/**
* Takes a Volume and usess it to mount an unlocked vault
*/
public interface Volume {
- void prepare(CryptoFileSystem fs);
+ void prepare(CryptoFileSystem fs) throws IOException;
void mount() throws CommandFailedException;