diff --git a/main/pom.xml b/main/pom.xml index a3961971a..e5738b56c 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -28,7 +28,7 @@ 1.4.5 1.0.3 1.0.2 - 0.1.0-SNAPSHOT + 0.1.1-SNAPSHOT 2.5 3.6 diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/FuseEnvironment.java b/main/ui/src/main/java/org/cryptomator/ui/model/FuseEnvironment.java deleted file mode 100644 index 48c3f0c45..000000000 --- a/main/ui/src/main/java/org/cryptomator/ui/model/FuseEnvironment.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.cryptomator.ui.model; - -import java.nio.file.Path; - -public interface FuseEnvironment { - - void prepare() throws CommandFailedException; - - String[] getMountParameters() throws CommandFailedException; - - Path getFsRootPath(); - - /** - * TODO: implement it in subclasses! - * @throws CommandFailedException - */ - default void revealFsRootInFilesystemManager() throws CommandFailedException { - throw new CommandFailedException("Not implemented."); - } - - void cleanUp(); - - default boolean supportsFuse(){ - return false; - } - - -} diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/FuseNioAdapter.java b/main/ui/src/main/java/org/cryptomator/ui/model/FuseNioAdapter.java index 0a4c7d198..4a47d9e8b 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/FuseNioAdapter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/FuseNioAdapter.java @@ -1,46 +1,70 @@ package org.cryptomator.ui.model; +import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.cryptofs.CryptoFileSystem; -import org.cryptomator.frontend.fuse.AdapterFactory; +import org.cryptomator.frontend.fuse.mount.EnvironmentVariables; +import org.cryptomator.frontend.fuse.mount.FuseMount; +import org.cryptomator.frontend.fuse.mount.MountFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; +import java.nio.file.Paths; @VaultModule.PerVault public class FuseNioAdapter implements NioAdapter { private static final Logger LOG = LoggerFactory.getLogger(FuseNioAdapter.class); - private final FuseEnvironment fuseEnv; - private org.cryptomator.frontend.fuse.FuseNioAdapter ffs; + private final FuseMount fuseMnt; + private final VaultSettings vaultSettings; + private final WindowsDriveLetters windowsDriveLetters; + private CryptoFileSystem cfs; @Inject - public FuseNioAdapter(FuseEnvironment fuseEnv) { - this.fuseEnv = fuseEnv; + public FuseNioAdapter(VaultSettings vaultSettings, WindowsDriveLetters windowsDriveLetters) { + this.vaultSettings = vaultSettings; + this.windowsDriveLetters = windowsDriveLetters; + this.fuseMnt = MountFactory.createMountObject(); } @Override public void prepare(CryptoFileSystem fs) { this.cfs = fs; - ffs = AdapterFactory.createReadWriteAdapter(fs.getPath("/")); + if (!(vaultSettings.mountPath().isNotNull().get() || SystemUtils.IS_OS_WINDOWS)) { + fuseMnt.useExtraMountDir(); + } } @Override public void mount() throws CommandFailedException { try { - fuseEnv.prepare(); - ffs.mount(fuseEnv.getFsRootPath(), false, false, fuseEnv.getMountParameters()); + EnvironmentVariables envVars = EnvironmentVariables.create() + .withMountName(vaultSettings.mountName().getValue() + vaultSettings.getId()) + .withMountPath( + SystemUtils.IS_OS_WINDOWS? computeWinDriveLetter() : vaultSettings.mountPath().getValue()) + .build(); + fuseMnt.mount(cfs.getPath("/"), envVars); } catch (Exception e) { throw new CommandFailedException("Unable to mount Filesystem", e); } } + private String computeWinDriveLetter(){ + if(vaultSettings.winDriveLetter().get() != null){ + return vaultSettings.winDriveLetter().getValue()+":\\"; + } + else{ + return windowsDriveLetters.getAvailableDriveLetters().iterator().next()+":\\"; + } + } + @Override public void reveal() throws CommandFailedException { - fuseEnv.revealFsRootInFilesystemManager(); + //fuseMnt.reveal(); } @Override @@ -57,23 +81,36 @@ public class FuseNioAdapter implements NioAdapter { this.unmountRaw(); } - private synchronized void unmountRaw() { - ffs.umount(); + private synchronized void unmountRaw() throws CommandFailedException { + try { + fuseMnt.unmount(); + } catch (org.cryptomator.frontend.fuse.mount.CommandFailedException e) { + throw new CommandFailedException(e); + } } @Override public void stop() { - fuseEnv.cleanUp(); + try { + fuseMnt.cleanUp(); + } catch (org.cryptomator.frontend.fuse.mount.CommandFailedException e) { + LOG.warn(e.getMessage()); + } } @Override - public String getMountUrl() { - return fuseEnv.getFsRootPath().toUri().toString(); + public String getMountUri() { + return Paths.get(fuseMnt.getMountPath()).toUri().toString(); } + /** + * TODO: chang this to a real implementation + * + * @return + */ @Override public boolean isSupported() { - return fuseEnv.supportsFuse(); + return true; } @Override diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/LinuxFuseEnvironment.java b/main/ui/src/main/java/org/cryptomator/ui/model/LinuxFuseEnvironment.java deleted file mode 100644 index b72f378c4..000000000 --- a/main/ui/src/main/java/org/cryptomator/ui/model/LinuxFuseEnvironment.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.cryptomator.ui.model; - -import org.cryptomator.common.settings.VaultSettings; - -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; -import java.util.ArrayList; -import java.util.Scanner; -import java.util.concurrent.TimeUnit; - -public class LinuxFuseEnvironment implements FuseEnvironment{ - - private final VaultSettings vaultSettings; - private Path root; - - @Inject - public LinuxFuseEnvironment(VaultSettings vaultSettings){ - this.vaultSettings = vaultSettings; - } - - @Override - public void prepare() throws CommandFailedException { - this.root = Paths.get(vaultSettings.mountPath().get() + vaultSettings.mountName().get()).toAbsolutePath(); - try { - createVaultDirIfNotExist(root); - } catch (IOException e) { - e.printStackTrace(); - throw new CommandFailedException(e); - } - } - - private void createVaultDirIfNotExist(Path p) throws IOException { - try { - if (Files.exists(p)) { - if (Files.isDirectory(p)) { - if (Files.newDirectoryStream(p).iterator().hasNext()) { - return; - } else { - throw new DirectoryNotEmptyException("Directory not empty."); - } - } - } else { - Files.createDirectory(p); - } - } catch (IOException e) { - throw e; - } - } - - @Override - public String[] getMountParameters() throws CommandFailedException { - ArrayList mountOptions = new ArrayList<>(8); - mountOptions.add(("-oatomic_o_trunc")); - try { - mountOptions.add("-ouid=" + getUIdOrGID("uid")); - mountOptions.add("-ogid=" + getUIdOrGID("gid")); - } catch (IOException e) { - e.printStackTrace(); - throw new CommandFailedException(e); - } - mountOptions.add("-oauto_unmount"); - mountOptions.add("-ofsname=CryptoFs"); - return mountOptions.toArray(new String [mountOptions.size()]); - } - - private String getUIdOrGID(String idtype) throws IOException { - String id; - String parameter; - switch (idtype) { - case "uid": - parameter = "-u"; - break; - case "gid": - parameter = "-g"; - break; - default: - throw new IllegalArgumentException("Unkown ID type"); - } - Process getId = new ProcessBuilder("sh", "-c", "id " + parameter).start(); - Scanner s = new Scanner(getId.getInputStream()).useDelimiter("\\A"); - try { - getId.waitFor(1000, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); - } - id = s.nextLine(); - return id; - } - - @Override - public Path getFsRootPath() { - return this.root; - } - - @Override - public void revealFsRootInFilesystemManager() throws CommandFailedException { - throw new CommandFailedException("Not implemented."); - } - - @Override - public void cleanUp() { - try { - Files.deleteIfExists(Paths.get(vaultSettings.mountPath().get() + vaultSettings.mountName().get())); - } catch (IOException e) { - //LOG.warn("Could not delete mount directory of vault " + vaultSettings.mountName().get()); - e.printStackTrace(); - } - } - - @Override - public boolean supportsFuse() { - return true; - } -} diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/MacFuseEnvironment.java b/main/ui/src/main/java/org/cryptomator/ui/model/MacFuseEnvironment.java deleted file mode 100644 index 210e31f9d..000000000 --- a/main/ui/src/main/java/org/cryptomator/ui/model/MacFuseEnvironment.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.cryptomator.ui.model; - -import org.cryptomator.common.settings.VaultSettings; - -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; -import java.util.ArrayList; -import java.util.Scanner; -import java.util.concurrent.TimeUnit; - -public class MacFuseEnvironment implements FuseEnvironment { - - private final VaultSettings vaultSettings; - private Path root; - - @Inject - public MacFuseEnvironment(VaultSettings vaultSettings){ - this.vaultSettings = vaultSettings; - } - - @Override - public void prepare() throws CommandFailedException { - this.root = Paths.get(vaultSettings.mountPath().get() + vaultSettings.mountName().get()).toAbsolutePath(); - try { - createVaultDirIfNotExist(root); - } catch (IOException e) { - throw new CommandFailedException(e); - } - } - - private void createVaultDirIfNotExist(Path p) throws IOException { - try { - if (Files.exists(p)) { - if (Files.isDirectory(p)) { - if (Files.newDirectoryStream(p).iterator().hasNext()) { - return; - } else { - throw new DirectoryNotEmptyException("Directory not empty."); - } - } - } else { - Files.createDirectory(p); - } - } catch (IOException e) { - throw e; - } - } - - @Override - public String[] getMountParameters() throws CommandFailedException { - ArrayList mountOptions = new ArrayList<>(8); - mountOptions.add(("-oatomic_o_trunc")); - try { - mountOptions.add("-ouid=" + getUIdOrGID("uid")); - mountOptions.add("-ogid=" + getUIdOrGID("gid")); - } catch (IOException e) { - e.printStackTrace(); - throw new CommandFailedException(e); - } - mountOptions.add("-ovolname=" + vaultSettings.mountName().get()); - mountOptions.add("-oauto_xattr"); - return mountOptions.toArray(new String [mountOptions.size()]); - } - - private String getUIdOrGID(String idtype) throws IOException { - String id; - String parameter; - switch (idtype) { - case "uid": - parameter = "-u"; - break; - case "gid": - parameter = "-g"; - break; - default: - throw new IllegalArgumentException("Unkown ID type"); - } - Process getId = new ProcessBuilder("sh", "-c", "id " + parameter).start(); - Scanner s = new Scanner(getId.getInputStream()).useDelimiter("\\A"); - try { - getId.waitFor(1000, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); - } - id = s.nextLine(); - return id; - } - - @Override - public Path getFsRootPath() { - return root; - } - - @Override - public void revealFsRootInFilesystemManager() throws CommandFailedException { - throw new CommandFailedException("Not implemented."); - } - - - @Override - public void cleanUp() { - try { - Files.deleteIfExists(Paths.get(vaultSettings.mountPath().get() + vaultSettings.mountName().get())); - } catch (IOException e) { - //LOG.warn("Could not delete mount directory of vault " + vaultSettings.mountName().get()); - e.printStackTrace(); - } - } - - @Override - public boolean supportsFuse() { - return false; - } -} diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/NioAdapter.java b/main/ui/src/main/java/org/cryptomator/ui/model/NioAdapter.java index 1643011e4..2a6ba33f2 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/NioAdapter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/NioAdapter.java @@ -20,7 +20,7 @@ public interface NioAdapter { void stop(); - String getMountUrl(); + String getMountUri(); default boolean isSupported() { return false; diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java index 96570f5a6..d0cc37bff 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java @@ -290,7 +290,7 @@ public class Vault { } public String getFilesystemRootUrl() { - return nioAdapter.getMountUrl(); + return nioAdapter.getMountUri(); } public String getId() { diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/VaultModule.java b/main/ui/src/main/java/org/cryptomator/ui/model/VaultModule.java index 76783b5cb..594dfa9d7 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/VaultModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/VaultModule.java @@ -18,7 +18,6 @@ import org.cryptomator.common.settings.VaultSettings; import dagger.Module; import dagger.Provides; -import sun.reflect.generics.reflectiveObjects.NotImplementedException; @Module public class VaultModule { @@ -57,40 +56,4 @@ public class VaultModule { } } - //TODO: ask sebi if this should be here - - private final OS os = OS.getCurrentOS(); - - private enum OS { - WINDOWS, - LINUX, - MAC; - - public static OS getCurrentOS() { - if (SystemUtils.IS_OS_WINDOWS) { - return WINDOWS; - } else if (SystemUtils.IS_OS_MAC) { - return MAC; - } else { - return LINUX; - } - } - - } - - @Provides - @VaultModule.PerVault - FuseEnvironment providesFuseEnvironment(WindowsFuseEnvironment windowsFuseEnvironment, LinuxFuseEnvironment linuxFuseEnvironment, MacFuseEnvironment macFuseEnvironment){ - switch (os){ - case LINUX: - return linuxFuseEnvironment; - case WINDOWS: - return windowsFuseEnvironment; - case MAC: - return macFuseEnvironment; - default: - //TODO: should be better something else returned? - return null; - } - } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/WebDavNioAdapter.java b/main/ui/src/main/java/org/cryptomator/ui/model/WebDavNioAdapter.java index 8be972dc6..0b05317a0 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/WebDavNioAdapter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/WebDavNioAdapter.java @@ -104,12 +104,13 @@ public class WebDavNioAdapter implements NioAdapter { } - public synchronized String getMountUrl() { + public synchronized String getMountUri() { return servlet.getServletRootUri().toString(); } /** * TODO: what to check wether it is implemented? + * * @return */ @Override diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/WindowsFuseEnvironment.java b/main/ui/src/main/java/org/cryptomator/ui/model/WindowsFuseEnvironment.java deleted file mode 100644 index 1111ead90..000000000 --- a/main/ui/src/main/java/org/cryptomator/ui/model/WindowsFuseEnvironment.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.cryptomator.ui.model; - -import org.cryptomator.common.settings.VaultSettings; - -import javax.inject.Inject; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; - -@VaultModule.PerVault -public class WindowsFuseEnvironment implements FuseEnvironment{ - - private static final String AUTOASSIGN_DRRIVE_LETTER = "*"; - - private final VaultSettings vaultSettings; - private final WindowsDriveLetters windowsDriveLetters; - - private Path root; - - @Inject - public WindowsFuseEnvironment(VaultSettings vaultSettings, WindowsDriveLetters windowsDriveLetters){ - this.vaultSettings = vaultSettings; - this.windowsDriveLetters = windowsDriveLetters; - } - - @Override - public void prepare() throws CommandFailedException { - if (vaultSettings.winDriveLetter().get().equals(AUTOASSIGN_DRRIVE_LETTER)) { - if (!windowsDriveLetters.getAvailableDriveLetters().isEmpty()) { - root= Paths.get(windowsDriveLetters.getAvailableDriveLetters().iterator().next() + ":\\").toAbsolutePath(); - } else { - throw new CommandFailedException("No free drive letter to mount."); - } - } else { - root = Paths.get(vaultSettings.winDriveLetter().get() + ":\\").toAbsolutePath(); - } - } - - @Override - public String[] getMountParameters() throws CommandFailedException { - ArrayList mountOptions = new ArrayList<>(8); - mountOptions.add(("-oatomic_o_trunc")); - mountOptions.add("-ouid=-1"); - mountOptions.add("-ogid=-1"); - mountOptions.add("-ovolname=" + vaultSettings.mountName().get()); - mountOptions.add("-oFileInfoTimeout=-1"); - return mountOptions.toArray(new String [mountOptions.size()]); - } - - @Override - public Path getFsRootPath() { - return root; - } - - @Override - public void revealFsRootInFilesystemManager() throws CommandFailedException { - throw new CommandFailedException("Not Implemented"); - } - - @Override - public void cleanUp() { - - } - - @Override - public boolean supportsFuse() { - return false; - } -}