diff --git a/patches/server/0005-Paper-config-files.patch b/patches/server/0005-Paper-config-files.patch index 845a260a2..750014e36 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 000000000..ac6fec898 --- /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 +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= 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 341347066..000000000 --- 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 -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= 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 -