aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJake Potrebic <[email protected]>2024-01-04 12:37:59 -0800
committerGitHub <[email protected]>2024-01-04 12:37:59 -0800
commit8379027ee06ad0da88daba873f1ff1ca4b33188b (patch)
treee48ec231e1286cf1c798242aa9f3170435f2fab5
parent19a620213f0a11e9f749530f0d03c5b5584664e9 (diff)
downloadPaper-8379027ee06ad0da88daba873f1ff1ca4b33188b.tar.gz
Paper-8379027ee06ad0da88daba873f1ff1ca4b33188b.zip
Fix cmd permission levels for command blocks (#7404)
-rw-r--r--patches/server/0005-Paper-config-files.patch9
-rw-r--r--patches/server/0946-Fix-cmd-permission-levels-for-command-blocks.patch90
-rw-r--r--patches/server/0946-Improve-command-function-perm-level-checks.patch27
3 files changed, 98 insertions, 28 deletions
diff --git a/patches/server/0005-Paper-config-files.patch b/patches/server/0005-Paper-config-files.patch
index 845a260a25..750014e360 100644
--- a/patches/server/0005-Paper-config-files.patch
+++ b/patches/server/0005-Paper-config-files.patch
@@ -1393,7 +1393,7 @@ new file mode 100644
index 0000000000000000000000000000000000000000..071d3877e386a0c7c4d2f2e8ddd06e0765c49d0d
--- /dev/null
+++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
-@@ -0,0 +1,541 @@
+@@ -0,0 +1,548 @@
+package io.papermc.paper.configuration;
+
+import com.google.common.collect.HashBasedTable;
@@ -1917,6 +1917,13 @@ index 0000000000000000000000000000000000000000..071d3877e386a0c7c4d2f2e8ddd06e07
+ }
+ }
+
++ public CommandBlocks commandBlocks;
++
++ public class CommandBlocks extends ConfigurationPart {
++ public int permissionsLevel = 2;
++ public boolean forceFollowPermLevel = true;
++ }
++
+ public Misc misc;
+
+ public class Misc extends ConfigurationPart {
diff --git a/patches/server/0946-Fix-cmd-permission-levels-for-command-blocks.patch b/patches/server/0946-Fix-cmd-permission-levels-for-command-blocks.patch
new file mode 100644
index 0000000000..ac6fec8981
--- /dev/null
+++ b/patches/server/0946-Fix-cmd-permission-levels-for-command-blocks.patch
@@ -0,0 +1,90 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Mon, 24 Jan 2022 15:32:02 -0800
+Subject: [PATCH] Fix cmd permission levels for command blocks
+
+
+diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java
+index 20b2cbbc73f6420b6ace9746016527b90d9f01b9..37ba8fd69a0099f80bdf7c28b593241f1f5d681f 100644
+--- a/src/main/java/net/minecraft/commands/CommandSourceStack.java
++++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java
+@@ -204,10 +204,29 @@ public class CommandSourceStack implements ExecutionCommandSource<CommandSourceS
+ return this.permissionLevel >= level;
+ }
+
++ // Paper start
++ private boolean forceRespectPermissionLevel() {
++ return this.source == CommandSource.NULL || (this.source instanceof final net.minecraft.world.level.BaseCommandBlock commandBlock && commandBlock.getLevel().paperConfig().commandBlocks.forceFollowPermLevel);
++ }
++ // Paper end
++
+ // CraftBukkit start
+ public boolean hasPermission(int i, String bukkitPermission) {
+- // World is null when loading functions
+- return ((this.getLevel() == null || !this.getLevel().getCraftServer().ignoreVanillaPermissions) && this.permissionLevel >= i) || this.getBukkitSender().hasPermission(bukkitPermission);
++ // Paper start
++ final java.util.function.BooleanSupplier hasBukkitPerm = () -> this.source == CommandSource.NULL /*treat NULL as having all bukkit perms*/ || this.getBukkitSender().hasPermission(bukkitPermission); // lazily check bukkit perms to the benefit of custom permission setups
++ // if the server is null, we must check the vanilla perm level system
++ // if ignoreVanillaPermissions is true, we can skip vanilla perms and just run the bukkit perm check
++ //noinspection ConstantValue
++ if (this.getServer() == null || !this.getServer().server.ignoreVanillaPermissions) { // server & level are null for command function loading
++ final boolean hasPermLevel = this.permissionLevel >= i;
++ if (this.forceRespectPermissionLevel()) { // NULL CommandSource and command blocks (if setting is enabled) should always pass the vanilla perm check
++ return hasPermLevel && hasBukkitPerm.getAsBoolean();
++ } else { // otherwise check vanilla perm first then bukkit perm, matching upstream behavior
++ return hasPermLevel || hasBukkitPerm.getAsBoolean();
++ }
++ }
++ return hasBukkitPerm.getAsBoolean();
++ // Paper end
+ }
+ // CraftBukkit end
+
+diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
+index 55f3f5396dac2b0bb0cc37b537547e9245042100..8fe48c6bf65db6b11fcd0674aad01d5bb8d17a5f 100644
+--- a/src/main/java/net/minecraft/commands/Commands.java
++++ b/src/main/java/net/minecraft/commands/Commands.java
+@@ -296,16 +296,7 @@ public class Commands {
+ String[] args = command.split(" ");
+ if (args.length == 0) return; // Paper - empty commands shall not be dispatched
+
+- String cmd = args[0];
+- if (cmd.startsWith("minecraft:")) cmd = cmd.substring("minecraft:".length());
+- if (cmd.startsWith("bukkit:")) cmd = cmd.substring("bukkit:".length());
+-
+- // Block disallowed commands
+- if (cmd.equalsIgnoreCase("stop") || cmd.equalsIgnoreCase("kick") || cmd.equalsIgnoreCase("op")
+- || cmd.equalsIgnoreCase("deop") || cmd.equalsIgnoreCase("ban") || cmd.equalsIgnoreCase("ban-ip")
+- || cmd.equalsIgnoreCase("pardon") || cmd.equalsIgnoreCase("pardon-ip") || cmd.equalsIgnoreCase("reload")) {
+- return;
+- }
++ // Paper - use proper permission levels to block these commands
+
+ // Handle vanilla commands;
+ if (sender.getLevel().getCraftServer().getCommandBlockOverride(args[0])) {
+diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java
+index 48b4fe75a7f881e7713885d79d4ef5ec7b574a2d..88b00556322f078b8a9d28fb7c759bb8c84bfcf0 100644
+--- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java
++++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java
+@@ -136,7 +136,7 @@ public class MinecartCommandBlock extends AbstractMinecart {
+
+ @Override
+ public CommandSourceStack createCommandSourceStack() {
+- return new CommandSourceStack(this, MinecartCommandBlock.this.position(), MinecartCommandBlock.this.getRotationVector(), this.getLevel(), 2, this.getName().getString(), MinecartCommandBlock.this.getDisplayName(), this.getLevel().getServer(), MinecartCommandBlock.this);
++ return new CommandSourceStack(this, MinecartCommandBlock.this.position(), MinecartCommandBlock.this.getRotationVector(), this.getLevel(), this.getLevel().paperConfig().commandBlocks.permissionsLevel, this.getName().getString(), MinecartCommandBlock.this.getDisplayName(), this.getLevel().getServer(), MinecartCommandBlock.this); // Paper - configurable command block perm level
+ }
+
+ @Override
+diff --git a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java
+index 167f334eec90417eba05fcecec21435415771df7..f08c77e20462bada221b5ed395ceb2f7d39ee7c0 100644
+--- a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java
+@@ -54,7 +54,7 @@ public class CommandBlockEntity extends BlockEntity {
+ public CommandSourceStack createCommandSourceStack() {
+ Direction enumdirection = (Direction) CommandBlockEntity.this.getBlockState().getValue(CommandBlock.FACING);
+
+- return new CommandSourceStack(this, Vec3.atCenterOf(CommandBlockEntity.this.worldPosition), new Vec2(0.0F, enumdirection.toYRot()), this.getLevel(), 2, this.getName().getString(), this.getName(), this.getLevel().getServer(), (Entity) null);
++ return new CommandSourceStack(this, Vec3.atCenterOf(CommandBlockEntity.this.worldPosition), new Vec2(0.0F, enumdirection.toYRot()), this.getLevel(), this.getLevel().paperConfig().commandBlocks.permissionsLevel, this.getName().getString(), this.getName(), this.getLevel().getServer(), (Entity) null); // Paper - configurable command block perm level
+ }
+
+ @Override
diff --git a/patches/server/0946-Improve-command-function-perm-level-checks.patch b/patches/server/0946-Improve-command-function-perm-level-checks.patch
deleted file mode 100644
index 3413470663..0000000000
--- a/patches/server/0946-Improve-command-function-perm-level-checks.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <[email protected]>
-Date: Tue, 27 Jun 2023 16:32:39 -0700
-Subject: [PATCH] Improve command function perm level checks
-
-
-diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java
-index 20b2cbbc73f6420b6ace9746016527b90d9f01b9..14f4c0a93372a58cf36dc95265b5e210ea1605e5 100644
---- a/src/main/java/net/minecraft/commands/CommandSourceStack.java
-+++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java
-@@ -206,8 +206,14 @@ public class CommandSourceStack implements ExecutionCommandSource<CommandSourceS
-
- // CraftBukkit start
- public boolean hasPermission(int i, String bukkitPermission) {
-- // World is null when loading functions
-- return ((this.getLevel() == null || !this.getLevel().getCraftServer().ignoreVanillaPermissions) && this.permissionLevel >= i) || this.getBukkitSender().hasPermission(bukkitPermission);
-+ // Paper start
-+ boolean hasPermissionLevel = this.permissionLevel >= i;
-+ if (this.source == CommandSource.NULL) {
-+ return hasPermissionLevel;
-+ } else {
-+ return (!this.getLevel().getCraftServer().ignoreVanillaPermissions && hasPermissionLevel) || this.getBukkitSender().hasPermission(bukkitPermission);
-+ }
-+ // Paper end
- }
- // CraftBukkit end
-