Skip to content

Commit 6b035fd

Browse files
Update default vanilla command perms (#7386)
1 parent f7382f5 commit 6b035fd

File tree

1 file changed

+141
-6
lines changed

1 file changed

+141
-6
lines changed

patches/server/0536-Added-missing-default-perms-for-commands.patch

Lines changed: 141 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,25 @@ Subject: [PATCH] Added missing default perms for commands
55

66

77
diff --git a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
8-
index ca30f9c590f792caa8f1b76d7219e9121d932673..6cc517b394bafefce50d877761e5b2eee8e14c78 100644
8+
index ca30f9c590f792caa8f1b76d7219e9121d932673..045ebc5533de7486d1975efe9d51ab368969178a 100644
99
--- a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
1010
+++ b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
11-
@@ -31,6 +31,59 @@ public final class CommandPermissions {
11+
@@ -25,12 +25,68 @@ public final class CommandPermissions {
12+
DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "list", "Allows the user to list all online players", PermissionDefault.OP, commands);
13+
DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "gamemode", "Allows the user to change the gamemode of another player", PermissionDefault.OP, commands);
14+
DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "xp", "Allows the user to give themselves or others arbitrary values of experience", PermissionDefault.OP, commands);
15+
- DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "toggledownfall", "Allows the user to toggle rain on/off for a given world", PermissionDefault.OP, commands);
16+
DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "defaultgamemode", "Allows the user to change the default gamemode of the server", PermissionDefault.OP, commands);
17+
DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "seed", "Allows the user to view the seed of the world", PermissionDefault.OP, commands);
1218
DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "effect", "Allows the user to add/remove effects on players", PermissionDefault.OP, commands);
1319
DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "selector", "Allows the use of selectors", PermissionDefault.OP, commands);
1420
DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "trigger", "Allows the use of the trigger command", PermissionDefault.TRUE, commands);
1521
+ // Paper start
1622
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "attribute", "Allows the user to query, add, remove or set an entity attribute", PermissionDefault.OP, commands);
1723
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "advancement", "Allows the user to give, remove, or check player advancements", PermissionDefault.OP, commands);
18-
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "ban", "Allows the user to add players to banlist", PermissionDefault.OP, commands);
19-
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "ban-ip", "Allows the user to add ip address to banlist", PermissionDefault.OP, commands);
20-
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "banlist", "Allows the user to display banlist", PermissionDefault.OP, commands);
24+
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "ban", "Allows the user to add players to the ban list", PermissionDefault.OP, commands);
25+
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "ban-ip", "Allows the user to add ip address to the ban list", PermissionDefault.OP, commands);
26+
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "banlist", "Allows the user to display the ban list", PermissionDefault.OP, commands);
2127
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "bossbar", "Allows the user to create and modify bossbars", PermissionDefault.OP, commands);
2228
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "clear", "Allows the user to clear items from player inventory", PermissionDefault.OP, commands);
2329
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "clone", "Allows the user to copy blocks from one place to another", PermissionDefault.OP, commands);
@@ -32,12 +38,16 @@ index ca30f9c590f792caa8f1b76d7219e9121d932673..6cc517b394bafefce50d877761e5b2ee
3238
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "forceload", "Allows the user to force chunks to be constantly loaded or not", PermissionDefault.OP, commands);
3339
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "function", "Allows the user to run a function", PermissionDefault.OP, commands);
3440
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "gamerule", "Allows a user to set or query a game rule value", PermissionDefault.OP, commands);
41+
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "jfr", "Allows a user to use the vanilla Java FlightRecorder profiling system", PermissionDefault.OP, commands);
3542
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "locate", "Allows the user to locate the closest structure", PermissionDefault.OP, commands);
3643
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "locatebiome", "Allows the user to locate the closest biome", PermissionDefault.OP, commands);
3744
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "loot", "Allows the user to drop items from an inventory slot onto the ground", PermissionDefault.OP, commands);
3845
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "op", "Allows the user to grant operator status to a player", PermissionDefault.OP, commands);
39-
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "pardon", "Allows the user to remove entries from the banlist", PermissionDefault.OP, commands);
46+
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "pardon", "Allows the user to remove entries from the player ban list", PermissionDefault.OP, commands);
47+
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "pardon-ip", "Allows the user to remove entries from the ip address ban list", PermissionDefault.OP, commands);
4048
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "particle", "Allows the user to create particles", PermissionDefault.OP, commands);
49+
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "perf", "Allows the user to start/stop the vanilla performance metrics capture", PermissionDefault.OP, commands);
50+
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "placefeature", "Allows the user to place features with the command", PermissionDefault.OP, commands);
4151
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "playsound", "Allows the user to play a sound", PermissionDefault.OP, commands);
4252
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "recipe", "Allows the user to give or take recipes", PermissionDefault.OP, commands);
4353
+ DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "reload", "Allows the user to reload loot tables, advancements, and functions from disk", PermissionDefault.OP, commands);
@@ -68,3 +78,128 @@ index ca30f9c590f792caa8f1b76d7219e9121d932673..6cc517b394bafefce50d877761e5b2ee
6878

6979
DefaultPermissions.registerPermission("minecraft.admin.command_feedback", "Receive command broadcasts when sendCommandFeedback is true", PermissionDefault.OP, commands);
7080

81+
diff --git a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java
82+
new file mode 100644
83+
index 0000000000000000000000000000000000000000..e80f8a32c82f89a2f898db1d869daadee735176f
84+
--- /dev/null
85+
+++ b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java
86+
@@ -0,0 +1,84 @@
87+
+package io.papermc.paper.permissions;
88+
+
89+
+import com.mojang.brigadier.tree.CommandNode;
90+
+import com.mojang.brigadier.tree.RootCommandNode;
91+
+import net.minecraft.commands.CommandSourceStack;
92+
+import net.minecraft.commands.Commands;
93+
+import net.minecraft.server.Bootstrap;
94+
+import org.bukkit.Bukkit;
95+
+import org.bukkit.craftbukkit.command.VanillaCommandWrapper;
96+
+import org.bukkit.craftbukkit.util.permissions.CraftDefaultPermissions;
97+
+import org.bukkit.permissions.Permission;
98+
+import org.bukkit.support.AbstractTestingBase;
99+
+import org.junit.AfterClass;
100+
+import org.junit.BeforeClass;
101+
+import org.junit.Test;
102+
+
103+
+import java.io.PrintStream;
104+
+import java.util.HashSet;
105+
+import java.util.LinkedHashSet;
106+
+import java.util.List;
107+
+import java.util.Set;
108+
+import java.util.TreeSet;
109+
+
110+
+import static org.junit.Assert.assertTrue;
111+
+
112+
+public class MinecraftCommandPermissionsTest extends AbstractTestingBase {
113+
+
114+
+ private static PrintStream old;
115+
+ @BeforeClass
116+
+ public static void before() {
117+
+ old = System.out;
118+
+ System.setOut(Bootstrap.STDOUT);
119+
+ }
120+
+
121+
+ @Test
122+
+ public void test() {
123+
+ CraftDefaultPermissions.registerCorePermissions();
124+
+ Set<String> perms = collectMinecraftCommandPerms();
125+
+
126+
+ Commands commands = new Commands(Commands.CommandSelection.DEDICATED);
127+
+ RootCommandNode<CommandSourceStack> root = commands.getDispatcher().getRoot();
128+
+ Set<String> missing = new LinkedHashSet<>();
129+
+ Set<String> foundPerms = new HashSet<>();
130+
+ for (CommandNode<CommandSourceStack> child : root.getChildren()) {
131+
+ final String vanillaPerm = VanillaCommandWrapper.getPermission(child);
132+
+ if (!perms.contains(vanillaPerm)) {
133+
+ missing.add("Missing permission for " + child.getName() + " (" + vanillaPerm + ") command");
134+
+ } else {
135+
+ foundPerms.add(vanillaPerm);
136+
+ }
137+
+ }
138+
+ assertTrue("Commands missing permissions: \n" + String.join("\n", missing), missing.isEmpty());
139+
+ perms.removeAll(foundPerms);
140+
+ assertTrue("Extra permissions not associated with a command: \n" + String.join("\n", perms), perms.isEmpty());
141+
+ }
142+
+
143+
+ private static final List<String> TO_SKIP = List.of(
144+
+ "minecraft.command.selector"
145+
+ );
146+
+
147+
+ private static Set<String> collectMinecraftCommandPerms() {
148+
+ Set<String> perms = new TreeSet<>();
149+
+ for (Permission perm : Bukkit.getPluginManager().getPermissions()) {
150+
+ if (perm.getName().startsWith("minecraft.command.")) {
151+
+ if (TO_SKIP.contains(perm.getName())) {
152+
+ continue;
153+
+ }
154+
+ if (perm.getName().endsWith(".xp")) {
155+
+ perms.add("minecraft.command.experience"); // for the "experience" command, craftbukkit perm is "minecraft.command.xp"
156+
+ continue;
157+
+ }
158+
+ perms.add(perm.getName());
159+
+ }
160+
+ }
161+
+ return perms;
162+
+ }
163+
+
164+
+ @AfterClass
165+
+ public static void after() {
166+
+ if (old != null) {
167+
+ System.setOut(old);
168+
+ }
169+
+ }
170+
+}
171+
diff --git a/src/test/java/org/bukkit/support/DummyServer.java b/src/test/java/org/bukkit/support/DummyServer.java
172+
index 2d95215657fffe77165a2fa5f6c8d31ba44a958d..1f3705543353adc6e6d4c4a9dd06032255bf5089 100644
173+
--- a/src/test/java/org/bukkit/support/DummyServer.java
174+
+++ b/src/test/java/org/bukkit/support/DummyServer.java
175+
@@ -97,7 +97,21 @@ public final class DummyServer implements InvocationHandler {
176+
}
177+
}
178+
);
179+
- Bukkit.setServer(Proxy.getProxyClass(Server.class.getClassLoader(), Server.class).asSubclass(Server.class).getConstructor(InvocationHandler.class).newInstance(new DummyServer()));
180+
+ // Paper start - modeled off of TestServer in the API tests module
181+
+ methods.put(
182+
+ Server.class.getMethod("getPluginManager"),
183+
+ new MethodHandler() {
184+
+ @Override
185+
+ public Object handle(DummyServer server, Object[] args) {
186+
+ return server.pluginManager;
187+
+ }
188+
+ }
189+
+ );
190+
+ DummyServer server = new DummyServer();
191+
+ Server instance = Proxy.getProxyClass(Server.class.getClassLoader(), Server.class).asSubclass(Server.class).getConstructor(InvocationHandler.class).newInstance(server);
192+
+ Bukkit.setServer(instance);
193+
+ server.pluginManager = new org.bukkit.plugin.SimplePluginManager(instance, new org.bukkit.command.SimpleCommandMap(instance));
194+
+ // Paper end
195+
} catch (Throwable t) {
196+
throw new Error(t);
197+
}
198+
@@ -107,6 +121,7 @@ public final class DummyServer implements InvocationHandler {
199+
200+
private DummyServer() {};
201+
202+
+ private org.bukkit.plugin.PluginManager pluginManager; // Paper
203+
@Override
204+
public Object invoke(Object proxy, Method method, Object[] args) {
205+
MethodHandler handler = DummyServer.methods.get(method);

0 commit comments

Comments
 (0)