diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/ReplacementScanner.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/ReplacementScanner.java index fdd2a7ed..26c8fd8a 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/ReplacementScanner.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/ReplacementScanner.java @@ -50,70 +50,96 @@ public class ReplacementScanner { } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { throw new IllegalStateException("Cannot access zipsearch()", e); } + if (files.size() <= 0 || whitelist.length <= 0) + return; + + boolean csfs = false; + { + long stamp = Math.round(Math.random() * 100000); + File test1 = new File(dir, '.' + stamp + ".ss_fsc"); + File test2 = new File(dir, '.' + stamp + ".SS_FSC"); + + test1.createNewFile(); + if (test2.createNewFile()) { + csfs = true; + test2.delete(); + } + test1.delete(); + } LinkedHashMap rules = new LinkedHashMap(); for (String entry : whitelist) { boolean mode = !entry.startsWith("!"); if (!mode) entry = entry.substring(1); - if (entry.startsWith(".")) entry = entry.substring(1); - StringBuilder rule = new StringBuilder(); - if (entry.startsWith("**")) { - entry = entry.substring(2); - rule.append("^.*"); - } else if (entry.startsWith("/")) { - rule.append("^"); - } + String pattern; + if (!entry.startsWith("%")) { + if (entry.startsWith("./")) + entry = entry.substring(1); - boolean greedyEnding = false; - if (entry.endsWith("**")) { - entry = entry.substring(0, entry.length() - 2); - greedyEnding = true; - } else if (entry.endsWith("/")) { - greedyEnding = true; - } - - StringBuilder literal = new StringBuilder(); - for (PrimitiveIterator.OfInt i = entry.codePoints().iterator(); i.hasNext(); ) { - int c = i.next(); - if ((c == '*' || c == '?' || c == '[') && literal.length() > 0) { - rule.append(Pattern.quote(literal.toString())); - literal = new StringBuilder(); + StringBuilder rule = new StringBuilder(); + if (entry.startsWith("**")) { + entry = entry.substring(2); + rule.append("^.*"); + } else if (entry.startsWith("/")) { + rule.append("^"); } - switch (c) { - case '\\': - if (i.hasNext()) c = i.next(); - literal.appendCodePoint(c); - case '[': - for (boolean escaped = false; i.hasNext() && (c != ']' || escaped); c = i.next()) { - if (c == '\\') escaped = !escaped; - else escaped = false; - literal.appendCodePoint(c); - } - if (c == ']' && literal.length() > 1) { - literal.appendCodePoint(c); - rule.append(literal.toString()); - } + + boolean greedyEnding = false; + if (entry.endsWith("**")) { + entry = entry.substring(0, entry.length() - 2); + greedyEnding = true; + } else if (entry.endsWith("/")) { + greedyEnding = true; + } + + StringBuilder literal = new StringBuilder(); + for (PrimitiveIterator.OfInt i = entry.codePoints().iterator(); i.hasNext(); ) { + int c = i.next(); + if ((c == '*' || c == '?' || c == '[') && literal.length() > 0) { + rule.append(Pattern.quote(literal.toString())); literal = new StringBuilder(); - break; - case '*': - rule.append("[^/]+"); - break; - case '?': - rule.append("[^/]"); - break; - default: - literal.appendCodePoint(c); - break; + } + switch (c) { + case '\\': + if (i.hasNext()) c = i.next(); + literal.appendCodePoint(c); + case '[': + for (boolean escaped = false; i.hasNext() && (c != ']' || escaped); c = i.next()) { + if (c == '\\') escaped = !escaped; + else escaped = false; + literal.appendCodePoint(c); + } + if (c == ']' && literal.length() > 1) { + literal.appendCodePoint(c); + rule.append(literal.toString()); + } + literal = new StringBuilder(); + break; + case '*': + rule.append("[^/]+"); + break; + case '?': + rule.append("[^/]"); + break; + default: + literal.appendCodePoint(c); + break; + } } - } - if (literal.length() > 0) - rule.append(Pattern.quote(literal.toString())); + if (literal.length() > 0) + rule.append(Pattern.quote(literal.toString())); - if (greedyEnding) - rule.append(".*"); - rule.append("$"); - rules.put(Pattern.compile(rule.toString()), mode); + if (greedyEnding) + rule.append(".*"); + rule.append("$"); + pattern = rule.toString(); + } else { + pattern = entry.substring(1); + } + + if (csfs) rules.put(Pattern.compile(pattern), mode); + else rules.put(Pattern.compile(pattern, Pattern.CASE_INSENSITIVE), mode); } for (String file : files) { diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/ReplacementScanner.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/ReplacementScanner.java index a4b07605..2256350a 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/ReplacementScanner.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/ReplacementScanner.java @@ -50,70 +50,96 @@ public class ReplacementScanner { } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { throw new IllegalStateException("Cannot access zipsearch()", e); } + if (files.size() <= 0 || whitelist.length <= 0) + return; + + boolean csfs = false; + { + long stamp = Math.round(Math.random() * 100000); + File test1 = new File(dir, '.' + stamp + ".ss_fsc"); + File test2 = new File(dir, '.' + stamp + ".SS_FSC"); + + test1.createNewFile(); + if (test2.createNewFile()) { + csfs = true; + test2.delete(); + } + test1.delete(); + } LinkedHashMap rules = new LinkedHashMap(); for (String entry : whitelist) { boolean mode = !entry.startsWith("!"); if (!mode) entry = entry.substring(1); - if (entry.startsWith(".")) entry = entry.substring(1); - StringBuilder rule = new StringBuilder(); - if (entry.startsWith("**")) { - entry = entry.substring(2); - rule.append("^.*"); - } else if (entry.startsWith("/")) { - rule.append("^"); - } + String pattern; + if (!entry.startsWith("%")) { + if (entry.startsWith("./")) + entry = entry.substring(1); - boolean greedyEnding = false; - if (entry.endsWith("**")) { - entry = entry.substring(0, entry.length() - 2); - greedyEnding = true; - } else if (entry.endsWith("/")) { - greedyEnding = true; - } - - StringBuilder literal = new StringBuilder(); - for (PrimitiveIterator.OfInt i = entry.codePoints().iterator(); i.hasNext(); ) { - int c = i.next(); - if ((c == '*' || c == '?' || c == '[') && literal.length() > 0) { - rule.append(Pattern.quote(literal.toString())); - literal = new StringBuilder(); + StringBuilder rule = new StringBuilder(); + if (entry.startsWith("**")) { + entry = entry.substring(2); + rule.append("^.*"); + } else if (entry.startsWith("/")) { + rule.append("^"); } - switch (c) { - case '\\': - if (i.hasNext()) c = i.next(); - literal.appendCodePoint(c); - case '[': - for (boolean escaped = false; i.hasNext() && (c != ']' || escaped); c = i.next()) { - if (c == '\\') escaped = !escaped; - else escaped = false; - literal.appendCodePoint(c); - } - if (c == ']' && literal.length() > 1) { - literal.appendCodePoint(c); - rule.append(literal.toString()); - } + + boolean greedyEnding = false; + if (entry.endsWith("**")) { + entry = entry.substring(0, entry.length() - 2); + greedyEnding = true; + } else if (entry.endsWith("/")) { + greedyEnding = true; + } + + StringBuilder literal = new StringBuilder(); + for (PrimitiveIterator.OfInt i = entry.codePoints().iterator(); i.hasNext(); ) { + int c = i.next(); + if ((c == '*' || c == '?' || c == '[') && literal.length() > 0) { + rule.append(Pattern.quote(literal.toString())); literal = new StringBuilder(); - break; - case '*': - rule.append("[^/]+"); - break; - case '?': - rule.append("[^/]"); - break; - default: - literal.appendCodePoint(c); - break; + } + switch (c) { + case '\\': + if (i.hasNext()) c = i.next(); + literal.appendCodePoint(c); + case '[': + for (boolean escaped = false; i.hasNext() && (c != ']' || escaped); c = i.next()) { + if (c == '\\') escaped = !escaped; + else escaped = false; + literal.appendCodePoint(c); + } + if (c == ']' && literal.length() > 1) { + literal.appendCodePoint(c); + rule.append(literal.toString()); + } + literal = new StringBuilder(); + break; + case '*': + rule.append("[^/]+"); + break; + case '?': + rule.append("[^/]"); + break; + default: + literal.appendCodePoint(c); + break; + } } - } - if (literal.length() > 0) - rule.append(Pattern.quote(literal.toString())); + if (literal.length() > 0) + rule.append(Pattern.quote(literal.toString())); - if (greedyEnding) - rule.append(".*"); - rule.append("$"); - rules.put(Pattern.compile(rule.toString()), mode); + if (greedyEnding) + rule.append(".*"); + rule.append("$"); + pattern = rule.toString(); + } else { + pattern = entry.substring(1); + } + + if (csfs) rules.put(Pattern.compile(pattern), mode); + else rules.put(Pattern.compile(pattern, Pattern.CASE_INSENSITIVE), mode); } for (String file : files) {