浏览代码

Added support for quote escaped values for mount arguments

JaniruTEC 4 年之前
父节点
当前提交
6eca8f2e0c
共有 1 个文件被更改,包括 31 次插入2 次删除
  1. 31 2
      main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java

+ 31 - 2
main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java

@@ -1,6 +1,5 @@
 package org.cryptomator.common.vaults;
 
-import com.google.common.base.Splitter;
 import org.apache.commons.lang3.SystemUtils;
 import org.cryptomator.common.mountpoint.InvalidMountPointException;
 import org.cryptomator.common.mountpoint.MountPointChooser;
@@ -18,12 +17,19 @@ 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.MatchResult;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 public class FuseVolume extends AbstractVolume {
 
 	private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class);
 
+	private static final Pattern pattern = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'"); //Thanks to https://stackoverflow.com/a/366532
+
 	private Mount mount;
 
 	@Inject
@@ -51,7 +57,30 @@ public class FuseVolume extends AbstractVolume {
 	}
 
 	private String[] splitFlags(String str) {
-		return Splitter.on(' ').splitToList(str).toArray(String[]::new);
+		List<String> strings = new ArrayList<>();
+		List<MatchResult> results = pattern.matcher(str).results().collect(Collectors.toList());
+		for (int i = 0; i < results.size(); i++) {
+			MatchResult current = results.get(i);
+			MatchResult next = i + 1 < results.size() ? results.get(i + 1) : null;
+			if (getSpecialString(next) != null) {
+				//"next" is a quoted argument
+				//--> "next" must be joined with "current" and is skipped in the regular iteration
+				strings.add(current.group() + getSpecialString(next));
+				i++;
+			} else {
+				//"next" is a normal unquoted string
+				//--> Add "current" and advance
+				strings.add(current.group());
+			}
+		}
+		return strings.toArray(new String[0]);
+	}
+
+	private String getSpecialString(MatchResult result) {
+		if (result == null) {
+			return null;
+		}
+		return result.group(1) != null ? result.group(1) : result.group(2);
 	}
 
 	@Override