From 45f6caa7bda3589eb572df43a4f1451a56905728 Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Sat, 18 Jul 2020 19:05:18 +0200 Subject: [PATCH] Added basic support for FUSE-Mounting on Windows --- .../cryptomator/common/vaults/FuseVolume.java | 2 +- .../common/vaults/VaultModule.java | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java b/main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java index 4b6918be9..c3afe2624 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java @@ -171,7 +171,7 @@ public class FuseVolume implements Volume { } public static boolean isSupportedStatic() { - return (SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX) && FuseMountFactory.isFuseSupported(); + return (SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_LINUX || SystemUtils.IS_OS_WINDOWS) && FuseMountFactory.isFuseSupported(); } } diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java index 1afd9d88b..3631230ff 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultModule.java @@ -86,6 +86,8 @@ public class VaultModule { return getMacFuseDefaultMountFlags(mountName, readOnly); } else if (v == VolumeImpl.FUSE && SystemUtils.IS_OS_LINUX) { return getLinuxFuseDefaultMountFlags(readOnly); + } else if (v == VolumeImpl.FUSE && SystemUtils.IS_OS_WINDOWS) { + return getWindowsFuseDefaultMountFlags(mountName, readOnly); } else if (v == VolumeImpl.DOKANY && SystemUtils.IS_OS_WINDOWS) { return getDokanyDefaultMountFlags(readOnly); } else { @@ -144,6 +146,25 @@ public class VaultModule { return flags.toString().strip(); } + // see https://github.com/billziss-gh/winfsp/blob/5d0b10d0b643652c00ebb4704dc2bb28e7244973/src/dll/fuse/fuse_main.c#L53-L62 for syntax guide + // see https://github.com/billziss-gh/winfsp/blob/5d0b10d0b643652c00ebb4704dc2bb28e7244973/src/dll/fuse/fuse.c#L295-L319 for options (-o <...>) + // see https://github.com/billziss-gh/winfsp/wiki/Frequently-Asked-Questions/5ba00e4be4f5e938eaae6ef1500b331de12dee77 (FUSE 4.) on why the given defaults were choosen + private String getWindowsFuseDefaultMountFlags(ReadOnlyStringProperty mountName, ReadOnlyBooleanProperty readOnly) { + assert SystemUtils.IS_OS_WINDOWS; + StringBuilder flags = new StringBuilder(); + + //WinFSP has no explicit "readonly"-option, nut not setting the group/user-id has the same effect, tho. + //So for the time being not setting them is the way to go... + if (!readOnly.get()) { + flags.append(" -ouid=-1"); + flags.append(" -ogid=-1"); + } + flags.append(" -ovolname=").append(mountName.get()); + flags.append(" -oThreadCount=").append(5); + + return flags.toString().strip(); + } + // see https://github.com/cryptomator/dokany-nio-adapter/blob/develop/src/main/java/org/cryptomator/frontend/dokany/MountUtil.java#L30-L34 private String getDokanyDefaultMountFlags(ReadOnlyBooleanProperty readOnly) { assert SystemUtils.IS_OS_WINDOWS;