From 6eca8f2e0c84c574d1055856c2ef00cd4d04422e Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Tue, 17 Nov 2020 21:56:43 +0100 Subject: [PATCH 1/5] Added support for quote escaped values for mount arguments --- .../cryptomator/common/vaults/FuseVolume.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) 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..2c84b901e 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,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 strings = new ArrayList<>(); + List 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 From 947e0e2369c696771c9975ee982fde362982c408 Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Tue, 17 Nov 2020 22:00:41 +0100 Subject: [PATCH 2/5] Fixed #1408 --- .../main/java/org/cryptomator/common/vaults/VaultModule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); From c19c3754c67075073f0ea4e3c196305041e15ee1 Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Tue, 17 Nov 2020 22:27:41 +0100 Subject: [PATCH 3/5] Fixed high-spirited concatenation --- .../main/java/org/cryptomator/common/vaults/FuseVolume.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 2c84b901e..4d99bf494 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 @@ -62,13 +62,13 @@ public class FuseVolume extends AbstractVolume { 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 + if (getSpecialString(next) != null && current.group().endsWith("=")) { + //"next" is a quoted elements and "current" is missing it's 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 + //"next" is a normal unquoted string/is not missing from "current" //--> Add "current" and advance strings.add(current.group()); } From d9c5d7641738f6573fb2e40a67b09d3689f1ddde Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Tue, 17 Nov 2020 22:41:41 +0100 Subject: [PATCH 4/5] Fixed irregular quoting --- .../cryptomator/common/vaults/FuseVolume.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) 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 4d99bf494..82095d9be 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 @@ -60,27 +60,34 @@ public class FuseVolume extends AbstractVolume { List strings = new ArrayList<>(); List results = pattern.matcher(str).results().collect(Collectors.toList()); for (int i = 0; i < results.size(); i++) { - MatchResult current = results.get(i); + String current = group(results.get(i), false); MatchResult next = i + 1 < results.size() ? results.get(i + 1) : null; - if (getSpecialString(next) != null && current.group().endsWith("=")) { + + if (group(next, true) != null && current.endsWith("=")) { //"next" is a quoted elements and "current" is missing it's argument //--> "next" must be joined with "current" and is skipped in the regular iteration - strings.add(current.group() + getSpecialString(next)); + strings.add(current + group(next, true)); i++; } else { //"next" is a normal unquoted string/is not missing from "current" //--> Add "current" and advance - strings.add(current.group()); + strings.add(current); } } return strings.toArray(new String[0]); } - private String getSpecialString(MatchResult result) { + private String group(MatchResult result, boolean onlyMatchQuoted) { if (result == null) { return null; } - return result.group(1) != null ? result.group(1) : result.group(2); + if (result.group(1) != null) { + return result.group(1); + } + if (result.group(2) != null || onlyMatchQuoted) { + return result.group(2); + } + return result.group(); } @Override From 86dec80726604ea01304d0bd2053adb71c07d8a0 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 18 Nov 2020 10:33:04 +0100 Subject: [PATCH 5/5] avoid weird iteration counter manipulation --- .../cryptomator/common/vaults/FuseVolume.java | 48 ++++++------------- 1 file changed, 15 insertions(+), 33 deletions(-) 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 82095d9be..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,5 +1,6 @@ package org.cryptomator.common.vaults; +import com.google.common.collect.Iterators; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.mountpoint.InvalidMountPointException; import org.cryptomator.common.mountpoint.MountPointChooser; @@ -20,15 +21,12 @@ 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 static final Pattern NON_WHITESPACE_OR_QUOTED = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'"); // Thanks to https://stackoverflow.com/a/366532 private Mount mount; @@ -57,37 +55,21 @@ public class FuseVolume extends AbstractVolume { } private String[] splitFlags(String str) { - List strings = new ArrayList<>(); - List results = pattern.matcher(str).results().collect(Collectors.toList()); - for (int i = 0; i < results.size(); i++) { - String current = group(results.get(i), false); - MatchResult next = i + 1 < results.size() ? results.get(i + 1) : null; - - if (group(next, true) != null && current.endsWith("=")) { - //"next" is a quoted elements and "current" is missing it's argument - //--> "next" must be joined with "current" and is skipped in the regular iteration - strings.add(current + group(next, true)); - i++; - } else { - //"next" is a normal unquoted string/is not missing from "current" - //--> Add "current" and advance - strings.add(current); + 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 strings.toArray(new String[0]); - } - - private String group(MatchResult result, boolean onlyMatchQuoted) { - if (result == null) { - return null; - } - if (result.group(1) != null) { - return result.group(1); - } - if (result.group(2) != null || onlyMatchQuoted) { - return result.group(2); - } - return result.group(); + return flags.toArray(String[]::new); } @Override