2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								From: Jake Potrebic <jake.m.potrebic@gmail.com>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								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
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-24 18:36:49 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								index f3c83bb20a73b489f1fb6bacb69388902b1b6fe7..3c0d2332207ba638faaaa4280bce18c334a01271 100644
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								--- 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;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 12:38:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+    // Paper start - Fix permission levels for command blocks
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								+    private boolean forceRespectPermissionLevel() {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        return this.source == CommandSource.NULL || (this.source instanceof final net.minecraft.world.level.BaseCommandBlock commandBlock && commandBlock.getLevel().paperConfig().commandBlocks.forceFollowPermLevel);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+    }
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 12:38:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+    // Paper end - Fix permission levels for command blocks
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								+
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     // 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);
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 12:38:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+        // Paper start - Fix permission levels for command blocks
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								+        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();
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 12:38:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+        // Paper end - Fix permission levels for command blocks
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								     }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     // CraftBukkit end
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-26 23:17:58 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								index 3d6e19c2078a87983a849e6d627cba0609a556cc..e1aa1e1f23512fc7d2267ff8e75358b67cb419a3 100644
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								--- a/src/main/java/net/minecraft/commands/Commands.java
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+++ b/src/main/java/net/minecraft/commands/Commands.java
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-26 23:17:58 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								@@ -297,16 +297,7 @@ public class Commands {
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								         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;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-        }
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-15 12:38:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+        // Paper - Fix permission levels for command blocks
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								         // 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
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-24 18:36:49 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								index c671b26d7dc70bac1f4bf9a68a264b25865cf7da..83ef2c3e7b06152b9e68f90002c35e77f148347d 100644
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								--- 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
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-24 18:36:49 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								index 4c7d142dc653f3aca82e0563b6ba2e020721eb9b..6c484f3f8f37a19992ebbfe30aba399cac21acfe 100644
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								--- a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+++ b/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-24 18:36:49 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								@@ -58,7 +58,7 @@ public class CommandBlockEntity extends BlockEntity {
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-04 12:37:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								         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