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 76a83983b..f8defc62e 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 @@ -1,6 +1,6 @@ package org.cryptomator.common.vaults; -import com.google.common.base.Splitter; +import com.google.common.collect.Iterators; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.mountpoint.InvalidMountPointException; import org.cryptomator.common.mountpoint.MountPointChooser; @@ -18,11 +18,15 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Named; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import java.util.SortedSet; +import java.util.regex.Pattern; public class FuseVolume extends AbstractVolume { private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class); + private static final Pattern NON_WHITESPACE_OR_QUOTED = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'"); // Thanks to https://stackoverflow.com/a/366532 private Mount mount; @@ -51,7 +55,21 @@ public class FuseVolume extends AbstractVolume { } private String[] splitFlags(String str) { - return Splitter.on(' ').splitToList(str).toArray(String[]::new); + List flags = new ArrayList<>(); + var matches = Iterators.peekingIterator(NON_WHITESPACE_OR_QUOTED.matcher(str).results().iterator()); + while (matches.hasNext()) { + String flag = matches.next().group(); + // check if flag is missing its argument: + if (flag.endsWith("=") && matches.hasNext() && matches.peek().group(1) != null) { // next is "double quoted" + // next is "double quoted" and flag is missing its argument + flag += matches.next().group(1); + } else if (flag.endsWith("=") && matches.hasNext() && matches.peek().group(2) != null) { + // next is 'single quoted' and flag is missing its argument + flag += matches.next().group(2); + } + flags.add(flag); + } + return flags.toArray(String[]::new); } @Override 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 4844143a3..e9fe26957 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 @@ -101,7 +101,7 @@ public class VaultModule { if (readOnly.get()) { flags.append(" -ordonly"); } - flags.append(" -ovolname=").append(mountName.get()); + flags.append(" -ovolname=").append('"').append(mountName.get()).append('"'); flags.append(" -oatomic_o_trunc"); flags.append(" -oauto_xattr"); flags.append(" -oauto_cache"); @@ -158,7 +158,7 @@ public class VaultModule { flags.append(" -ouid=-1"); flags.append(" -ogid=-1"); } - flags.append(" -ovolname=").append(mountName.get()); + flags.append(" -ovolname=").append('"').append(mountName.get()).append('"'); //Dokany requires this option to be set, WinFSP doesn't seem to share this peculiarity, //but the option exists. Let's keep this here in case we need it. // flags.append(" -oThreadCount=").append(5);