mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-21 16:37:44 +01:00
79 lines
4.2 KiB
Diff
79 lines
4.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
|
Date: Wed, 25 Aug 2021 13:19:53 -0700
|
|
Subject: [PATCH] Vanilla command permission fixes
|
|
|
|
Fixes permission checks for vanilla commands which don't have a
|
|
requirement, as well as for namespaced vanilla commands.
|
|
|
|
diff --git a/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java b/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java
|
|
index 899008b2980d13f1be6280cd8cb959c53a29bebf..f875507241ac6769545e91cd3285232b75b892f0 100644
|
|
--- a/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java
|
|
+++ b/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java
|
|
@@ -14,9 +14,17 @@ import java.util.Collections;
|
|
import java.util.function.Predicate;
|
|
|
|
public abstract class ArgumentBuilder<S, T extends ArgumentBuilder<S, T>> {
|
|
+ // Paper start
|
|
+ private static final Predicate<Object> DEFAULT_REQUIREMENT = s -> true;
|
|
+
|
|
+ @SuppressWarnings("unchecked")
|
|
+ public static <S> Predicate<S> defaultRequirement() {
|
|
+ return (Predicate<S>) DEFAULT_REQUIREMENT;
|
|
+ }
|
|
+ // Paper end
|
|
private final RootCommandNode<S> arguments = new RootCommandNode<>();
|
|
private Command<S> command;
|
|
- private Predicate<S> requirement = s -> true;
|
|
+ private Predicate<S> requirement = defaultRequirement(); // Paper
|
|
private CommandNode<S> target;
|
|
private RedirectModifier<S> modifier = null;
|
|
private boolean forks;
|
|
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
|
|
index 8f51b814c5b1c2c14378565363119df45af25726..13a0f78abbb00b489b63d88ce14f60cb04402085 100644
|
|
--- a/src/main/java/net/minecraft/commands/Commands.java
|
|
+++ b/src/main/java/net/minecraft/commands/Commands.java
|
|
@@ -213,6 +213,13 @@ public class Commands {
|
|
PublishCommand.register(this.dispatcher);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ for (final CommandNode<CommandSourceStack> node : this.dispatcher.getRoot().getChildren()) {
|
|
+ if (node.getRequirement() == com.mojang.brigadier.builder.ArgumentBuilder.<CommandSourceStack>defaultRequirement()) {
|
|
+ node.requirement = stack -> stack.source == CommandSource.NULL || stack.getBukkitSender().hasPermission(org.bukkit.craftbukkit.command.VanillaCommandWrapper.getPermission(node));
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
this.dispatcher.findAmbiguities((commandnode, commandnode1, commandnode2, collection) -> {
|
|
// CommandDispatcher.LOGGER.warn("Ambiguity between arguments {} and {} with inputs: {}", new Object[]{this.dispatcher.getPath(commandnode1), this.dispatcher.getPath(commandnode2), collection}); // CraftBukkit
|
|
});
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
|
|
index 0377c706c9aec6f367e83f859f9a3432ad5bba4a..e9d1fb479855194da5a05e86861848158736cbb4 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
|
|
@@ -87,7 +87,23 @@ public final class VanillaCommandWrapper extends BukkitCommand {
|
|
}
|
|
|
|
public static String getPermission(CommandNode<CommandSourceStack> vanillaCommand) {
|
|
- return "minecraft.command." + ((vanillaCommand.getRedirect() == null) ? vanillaCommand.getName() : vanillaCommand.getRedirect().getName());
|
|
+ // Paper start
|
|
+ final String commandName;
|
|
+ if (vanillaCommand.getRedirect() == null) {
|
|
+ commandName = vanillaCommand.getName();
|
|
+ } else {
|
|
+ commandName = vanillaCommand.getRedirect().getName();
|
|
+ }
|
|
+ return "minecraft.command." + stripDefaultNamespace(commandName);
|
|
+ }
|
|
+
|
|
+ private static String stripDefaultNamespace(final String maybeNamespaced) {
|
|
+ final String prefix = "minecraft:";
|
|
+ if (maybeNamespaced.startsWith(prefix)) {
|
|
+ return maybeNamespaced.substring(prefix.length());
|
|
+ }
|
|
+ return maybeNamespaced;
|
|
+ // Paper end
|
|
}
|
|
|
|
private String toDispatcher(String[] args, String name) {
|