78 lines
		
	
	
	
		
			4.1 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			4.1 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java
 | 
						|
+++ b/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java
 | 
						|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/commands/Commands.java
 | 
						|
+++ b/src/main/java/net/minecraft/commands/Commands.java
 | 
						|
@@ -0,0 +0,0 @@ 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: {}", this.b.getPath(commandnode1), this.b.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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
 | 
						|
+++ b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
 | 
						|
@@ -0,0 +0,0 @@ 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) {
 |