diff --git a/bukkit/src/main/resources/config.yml b/bukkit/src/main/resources/config.yml index a4dd153e7..a31dc3060 100644 --- a/bukkit/src/main/resources/config.yml +++ b/bukkit/src/main/resources/config.yml @@ -551,6 +551,13 @@ apply-bukkit-attachment-permissions: true # | Extra settings | # # +----------------------------------------------------------------------------------------------+ # +# A list of context calculators which will be skipped when calculating contexts. +# +# - You can disable context calculators by either: +# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator) +# => specifying a sub-section of the Java package used by the calculator (e.g. com.example) +disabled-context-calculators: [] + # Allows you to set "aliases" for the worlds sent forward for context calculation. # # - These aliases are provided in addition to the real world name. Applied recursively. diff --git a/bungee/src/main/resources/config.yml b/bungee/src/main/resources/config.yml index a3b5a19f7..53a2bd837 100644 --- a/bungee/src/main/resources/config.yml +++ b/bungee/src/main/resources/config.yml @@ -531,6 +531,13 @@ apply-bungee-config-permissions: false # | Extra settings | # # +----------------------------------------------------------------------------------------------+ # +# A list of context calculators which will be skipped when calculating contexts. +# +# - You can disable context calculators by either: +# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator) +# => specifying a sub-section of the Java package used by the calculator (e.g. com.example) +disabled-context-calculators: [] + # Allows you to set "aliases" for the worlds sent forward for context calculation. # # - These aliases are provided in addition to the real world name. Applied recursively. diff --git a/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/CompletionSupplier.java b/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/CompletionSupplier.java index b4f5f3a9a..f755e74c2 100644 --- a/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/CompletionSupplier.java +++ b/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/CompletionSupplier.java @@ -25,6 +25,8 @@ package me.lucko.luckperms.common.command.tabcomplete; +import me.lucko.luckperms.common.util.Predicates; + import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -46,7 +48,7 @@ public interface CompletionSupplier { } static CompletionSupplier startsWith(Supplier> stringsSupplier) { - return partial -> stringsSupplier.get().filter(TabCompleter.startsWithIgnoreCase(partial)).collect(Collectors.toList()); + return partial -> stringsSupplier.get().filter(Predicates.startsWithIgnoreCase(partial)).collect(Collectors.toList()); } static CompletionSupplier contains(String... strings) { @@ -58,7 +60,7 @@ public interface CompletionSupplier { } static CompletionSupplier contains(Supplier> stringsSupplier) { - return partial -> stringsSupplier.get().filter(TabCompleter.containsIgnoreCase(partial)).collect(Collectors.toList()); + return partial -> stringsSupplier.get().filter(Predicates.containsIgnoreCase(partial)).collect(Collectors.toList()); } List supplyCompletions(String partial); diff --git a/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/TabCompleter.java b/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/TabCompleter.java index da985c438..4506023d6 100644 --- a/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/TabCompleter.java +++ b/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/TabCompleter.java @@ -29,9 +29,7 @@ import com.google.common.base.Preconditions; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; -import java.util.function.Predicate; /** * Utility for computing tab completion results @@ -99,22 +97,4 @@ public class TabCompleter { return this.suppliers.getOrDefault(position, CompletionSupplier.EMPTY).supplyCompletions(partial); } - static Predicate startsWithIgnoreCase(String prefix) { - return string -> { - if (string.length() < prefix.length()) { - return false; - } - return string.regionMatches(true, 0, prefix, 0, prefix.length()); - }; - } - - static Predicate containsIgnoreCase(String substring) { - return string -> { - if (string.length() < substring.length()) { - return false; - } - return string.toLowerCase(Locale.ROOT).contains(substring.toLowerCase(Locale.ROOT)); - }; - } - } diff --git a/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/TabCompletions.java b/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/TabCompletions.java index e87c7fc13..53dc22693 100644 --- a/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/TabCompletions.java +++ b/common/src/main/java/me/lucko/luckperms/common/command/tabcomplete/TabCompletions.java @@ -30,6 +30,7 @@ import com.google.common.base.Splitter; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.treeview.PermissionRegistry; import me.lucko.luckperms.common.treeview.TreeNode; +import me.lucko.luckperms.common.util.Predicates; import net.luckperms.api.context.ImmutableContextSet; @@ -90,7 +91,7 @@ public final class TabCompletions { } return root.getChildren().get().keySet().stream() - .filter(TabCompleter.startsWithIgnoreCase(incomplete)) + .filter(Predicates.startsWithIgnoreCase(incomplete)) .map(s -> String.join(".", parts) + "." + s) .collect(Collectors.toList()); }; @@ -112,7 +113,7 @@ public final class TabCompletions { String value = partial.substring(index + 1).trim(); Set potentialValues = potentialContexts.getValues(key); return potentialValues.stream() - .filter(TabCompleter.startsWithIgnoreCase(value)) + .filter(Predicates.startsWithIgnoreCase(value)) .map(s -> key + "=" + s) .collect(Collectors.toList()); }; diff --git a/common/src/main/java/me/lucko/luckperms/common/config/ConfigKeys.java b/common/src/main/java/me/lucko/luckperms/common/config/ConfigKeys.java index 7bd64e662..11eee3e89 100644 --- a/common/src/main/java/me/lucko/luckperms/common/config/ConfigKeys.java +++ b/common/src/main/java/me/lucko/luckperms/common/config/ConfigKeys.java @@ -44,6 +44,7 @@ import me.lucko.luckperms.common.storage.StorageType; import me.lucko.luckperms.common.storage.implementation.split.SplitStorageType; import me.lucko.luckperms.common.storage.misc.StorageCredentials; import me.lucko.luckperms.common.util.ImmutableCollectors; +import me.lucko.luckperms.common.util.Predicates; import net.luckperms.api.context.ContextSatisfyMode; import net.luckperms.api.metastacking.DuplicateRemovalFunction; @@ -64,6 +65,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.function.Function; +import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -515,6 +517,16 @@ public final class ConfigKeys { */ public static final ConfigKey FABRIC_INTEGRATED_SERVER_OWNER_BYPASSES_CHECKS = booleanKey("integrated-server-owner-bypasses-checks", true); + /** + * Disabled context calculators + */ + public static final ConfigKey>> DISABLED_CONTEXT_CALCULATORS = key(c -> { + return c.getStringList("disabled-context-calculators", ImmutableList.of()) + .stream() + .map(Predicates::startsWithIgnoreCase) + .collect(ImmutableCollectors.toSet()); + }); + /** * The world rewrites map */ diff --git a/common/src/main/java/me/lucko/luckperms/common/context/manager/ContextManager.java b/common/src/main/java/me/lucko/luckperms/common/context/manager/ContextManager.java index d5eeffe1f..4c82dcdd8 100644 --- a/common/src/main/java/me/lucko/luckperms/common/context/manager/ContextManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/context/manager/ContextManager.java @@ -42,8 +42,10 @@ import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; /** * Base implementation of {@link ContextManager} which caches content lookups. @@ -116,6 +118,16 @@ public abstract class ContextManager { protected abstract void invalidateCache(S subject); public void registerCalculator(ContextCalculator calculator) { + String calculatorClass = calculator.getClass().getName(); + + Set> disabledCalculators = this.plugin.getConfiguration().get(ConfigKeys.DISABLED_CONTEXT_CALCULATORS); + for (Predicate disabledPattern : disabledCalculators) { + if (disabledPattern.test(calculatorClass)) { + this.plugin.getLogger().info("Ignoring registration of disabled context calculator: " + calculatorClass); + return; + } + } + this.calculators.add(calculator); } diff --git a/common/src/main/java/me/lucko/luckperms/common/util/Predicates.java b/common/src/main/java/me/lucko/luckperms/common/util/Predicates.java index 76fdb0137..1fd028861 100644 --- a/common/src/main/java/me/lucko/luckperms/common/util/Predicates.java +++ b/common/src/main/java/me/lucko/luckperms/common/util/Predicates.java @@ -29,6 +29,7 @@ import com.google.common.collect.Range; import org.checkerframework.checker.nullness.qual.NonNull; +import java.util.Locale; import java.util.function.Predicate; /** @@ -86,4 +87,22 @@ public final class Predicates { return t::equals; } + public static Predicate startsWithIgnoreCase(String prefix) { + return string -> { + if (string.length() < prefix.length()) { + return false; + } + return string.regionMatches(true, 0, prefix, 0, prefix.length()); + }; + } + + public static Predicate containsIgnoreCase(String substring) { + return string -> { + if (string.length() < substring.length()) { + return false; + } + return string.toLowerCase(Locale.ROOT).contains(substring.toLowerCase(Locale.ROOT)); + }; + } + } diff --git a/common/src/test/java/me/lucko/luckperms/common/context/ContextSetTest.java b/common/src/test/java/me/lucko/luckperms/common/context/ContextSetTest.java index 94079867c..d23dfd21b 100644 --- a/common/src/test/java/me/lucko/luckperms/common/context/ContextSetTest.java +++ b/common/src/test/java/me/lucko/luckperms/common/context/ContextSetTest.java @@ -114,18 +114,18 @@ public class ContextSetTest { @Test public void testImmutableContainsAll() { ImmutableContextSetImpl set = (ImmutableContextSetImpl) new ImmutableContextSetImpl.BuilderImpl() - .add("test", "a") - .add("test", "b") - .add("test", "c") - .add("other", "a") - .add("other", "b") + .add("aaa", "a") + .add("aaa", "b") + .add("aaa", "c") + .add("bbb", "a") + .add("bbb", "b") .build(); List> trueTests = ImmutableList.of( - builder -> builder.add("test", "a").add("other", "a"), - builder -> builder.add("test", "b").add("other", "a"), - builder -> builder.add("test", "c").add("other", "a"), - builder -> builder.add("test", "c").add("other", "b") + builder -> builder.add("aaa", "a").add("bbb", "a"), + builder -> builder.add("aaa", "b").add("bbb", "a"), + builder -> builder.add("aaa", "c").add("bbb", "a"), + builder -> builder.add("aaa", "c").add("bbb", "b") ); for (Consumer test : trueTests) { @@ -138,10 +138,10 @@ public class ContextSetTest { } List> falseTests = ImmutableList.of( - builder -> builder.add("test", "a").add("other", "z"), - builder -> builder.add("test", "b").add("other", "z"), - builder -> builder.add("test", "b"), - builder -> builder.add("test", "c"), + builder -> builder.add("aaa", "a").add("bbb", "z"), + builder -> builder.add("aaa", "b").add("bbb", "z"), + builder -> builder.add("aaa", "b"), + builder -> builder.add("aaa", "c"), builder -> {} ); diff --git a/fabric/src/main/resources/luckperms.conf b/fabric/src/main/resources/luckperms.conf index 8d3686dc8..f875e3e5a 100644 --- a/fabric/src/main/resources/luckperms.conf +++ b/fabric/src/main/resources/luckperms.conf @@ -537,6 +537,13 @@ integrated-server-owner-bypasses-checks = true # | Extra settings | # # +----------------------------------------------------------------------------------------------+ # +# A list of context calculators which will be skipped when calculating contexts. +# +# - You can disable context calculators by either: +# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator) +# => specifying a sub-section of the Java package used by the calculator (e.g. com.example) +disabled-context-calculators = [] + # Allows you to set "aliases" for the worlds sent forward for context calculation. # # - These aliases are provided in addition to the real world name. Applied recursively. diff --git a/nukkit/src/main/resources/config.yml b/nukkit/src/main/resources/config.yml index e6cb4d832..6d9e2d068 100644 --- a/nukkit/src/main/resources/config.yml +++ b/nukkit/src/main/resources/config.yml @@ -546,6 +546,13 @@ apply-nukkit-attachment-permissions: true # | Extra settings | # # +----------------------------------------------------------------------------------------------+ # +# A list of context calculators which will be skipped when calculating contexts. +# +# - You can disable context calculators by either: +# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator) +# => specifying a sub-section of the Java package used by the calculator (e.g. com.example) +disabled-context-calculators: [] + # Allows you to set "aliases" for the worlds sent forward for context calculation. # # - These aliases are provided in addition to the real world name. Applied recursively. diff --git a/sponge/src/main/resources/luckperms.conf b/sponge/src/main/resources/luckperms.conf index ae22acfd5..0f58a2775 100644 --- a/sponge/src/main/resources/luckperms.conf +++ b/sponge/src/main/resources/luckperms.conf @@ -547,6 +547,13 @@ apply-sponge-default-subjects=true # | Extra settings | # # +----------------------------------------------------------------------------------------------+ # +# A list of context calculators which will be skipped when calculating contexts. +# +# - You can disable context calculators by either: +# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator) +# => specifying a sub-section of the Java package used by the calculator (e.g. com.example) +disabled-context-calculators = [] + # Allows you to set "aliases" for the worlds sent forward for context calculation. # # - These aliases are provided in addition to the real world name. Applied recursively. diff --git a/velocity/src/main/resources/config.yml b/velocity/src/main/resources/config.yml index 7f82c0e09..7321eabf5 100644 --- a/velocity/src/main/resources/config.yml +++ b/velocity/src/main/resources/config.yml @@ -517,6 +517,13 @@ apply-shorthand: true # | Extra settings | # # +----------------------------------------------------------------------------------------------+ # +# A list of context calculators which will be skipped when calculating contexts. +# +# - You can disable context calculators by either: +# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator) +# => specifying a sub-section of the Java package used by the calculator (e.g. com.example) +disabled-context-calculators: [] + # Allows you to set "aliases" for the worlds sent forward for context calculation. # # - These aliases are provided in addition to the real world name. Applied recursively.