From 26a6a7d8836307146abc560b177b2f3c02acd240 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Sat, 18 Aug 2018 00:31:54 +0800 Subject: [PATCH] Add doublequotes when special characters exist in launch script. Closes #420 --- .../jackhuang/hmcl/util/CommandBuilder.java | 44 +++++++++---------- .../org/jackhuang/hmcl/util/StringUtils.java | 7 +++ 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CommandBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CommandBuilder.java index 93cba34ce..7851a70aa 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CommandBuilder.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CommandBuilder.java @@ -41,6 +41,12 @@ public final class CommandBuilder { } } + /** + * Parsing will ignore your manual escaping + * + * @param args commands + * @return this + */ public CommandBuilder add(String... args) { for (String s : args) raw.add(new Item(s, true)); @@ -89,35 +95,27 @@ public final class CommandBuilder { } private static String parseWindows(String s) { - if (s.indexOf(' ') >= 0 || s.indexOf('\t') >= 0) - if (s.charAt(0) != '"') { - // The argument has not been quoted, add quotes. - return '"' + s.replace("\\", "\\\\").replace("\"", "\"\"") + '"'; - } else if (s.endsWith("\"")) { - // The argument has already been quoted. - return s; - } else { - // Unmatched quote for the argument. - throw new IllegalArgumentException(); - } + String escape = " \t^&<>|"; + if (StringUtils.containsOne(s, escape.toCharArray())) + // The argument has not been quoted, add quotes. + return '"' + s + .replace("\\", "\\\\") + .replace("\"", "\"\"") + + '"'; else { return s; } } private static String parseBash(String s) { - if (s.indexOf(' ') >= 0 || s.indexOf('\t') >= 0) - if (s.charAt(0) != '"') { - // The argument has not been quoted, add quotes. - return '"' + s.replace("\"", "\\\"") + '"'; - } else if (s.endsWith("\"")) { - // The argument has already been quoted. - return s; - } else { - // Unmatched quote for the argument. - throw new IllegalArgumentException(); - } - else + String escaping = " \t\"!#$&'()*,;<=>?[\\]^`{|}~"; + String escaped = "\"$&`"; + if (s.indexOf(' ') >= 0 || s.indexOf('\t') >= 0 || StringUtils.containsOne(s, escaping.toCharArray())) { + // The argument has not been quoted, add quotes. + for (char ch : escaped.toCharArray()) + s = s.replace("" + ch, "\\" + ch); + return '"' + s + '"'; + } else return s; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/StringUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/StringUtils.java index f2c69b36b..bcb61076b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/StringUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/StringUtils.java @@ -176,6 +176,13 @@ public final class StringUtils { return false; } + public static boolean containsOne(String pattern, char... targets) { + for (char target : targets) + if (pattern.toLowerCase().indexOf(Character.toLowerCase(target)) >= 0) + return true; + return false; + } + public static List tokenize(String str) { if (str == null) return new LinkedList<>();