Forráskód Böngészése

Merge branch 'fix/1408' into hotfix/1.5.10

fixes #1408

# Conflicts:
#	main/buildkit/pom.xml
#	main/commons/pom.xml
#	main/launcher/pom.xml
#	main/pom.xml
#	main/ui/pom.xml
Sebastian Stenzel 4 éve
szülő
commit
b2992aa6ae

+ 20 - 2
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<String> 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

+ 2 - 2
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);