From 7e06be509d9875f7a1e1bdefa40f8a57cb71b405 Mon Sep 17 00:00:00 2001
From: somehussar <148253652+somehussar@users.noreply.github.com>
Date: Sat, 12 Sep 2026 07:17:26 +0200
Subject: [PATCH] Validate packets
---
.../packets/request/TileEntitySavePacket.java | 38 ++++++++++++++++++-
.../npcs/blocks/tiles/ITilePermission.java | 8 ++++
.../noppes/npcs/blocks/tiles/TileBorder.java | 8 +++-
.../npcs/blocks/tiles/TileRedstoneBlock.java | 8 +++-
.../npcs/blocks/tiles/TileWaypoint.java | 8 +++-
5 files changed, 66 insertions(+), 4 deletions(-)
create mode 100644 src/main/java/noppes/npcs/blocks/tiles/ITilePermission.java
diff --git a/src/main/java/kamkeel/npcs/network/packets/request/TileEntitySavePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/TileEntitySavePacket.java
index c1fc4e5e3..8a00004bc 100644
--- a/src/main/java/kamkeel/npcs/network/packets/request/TileEntitySavePacket.java
+++ b/src/main/java/kamkeel/npcs/network/packets/request/TileEntitySavePacket.java
@@ -13,10 +13,20 @@ import kamkeel.npcs.util.ByteBufUtils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import noppes.npcs.CustomNpcsPermissions;
+import noppes.npcs.LogWriter;
import noppes.npcs.NoppesUtilServer;
+import noppes.npcs.blocks.tiles.ITilePermission;
import java.io.IOException;
+/**
+ * Convenience packet for saving extra data about Tile Entities.
+ *
+ * Any tile entity that uses this packet should implement {@link ITilePermission}
+ * Not implementing results in the packet treated as malformed and rejected.
+ */
public final class TileEntitySavePacket extends AbstractPacket {
public static final String packetName = "Request|TileEntitySave";
@@ -50,9 +60,35 @@ public final class TileEntitySavePacket extends AbstractPacket {
if (!(player instanceof EntityPlayerMP))
return;
+ NBTTagCompound incomingCompound = ByteBufUtils.readNBT(in);
+
+ if (isCorrectPermission(incomingCompound, player))
+ return;
+
if (!PacketUtil.verifyItemPacket(packetName, player, EnumItemPacketType.WAND, EnumItemPacketType.BLOCK))
return;
- NoppesUtilServer.saveTileEntity((EntityPlayerMP) player, ByteBufUtils.readNBT(in));
+ NoppesUtilServer.saveTileEntity((EntityPlayerMP) player, incomingCompound);
+ }
+
+ private static boolean isCorrectPermission(NBTTagCompound incomingCompound, EntityPlayer player) {
+ int x = incomingCompound.getInteger("x");
+ int y = incomingCompound.getInteger("y");
+ int z = incomingCompound.getInteger("z");
+ TileEntity tile = player.worldObj.getTileEntity(x, y, z);
+
+ if (tile == null)
+ return true;
+
+ boolean validatesPacket = tile instanceof ITilePermission;
+ if (!validatesPacket) {
+ LogWriter.error(String.format("%s tried to use TileEntitySavePacket on %s -- should this class implement ITileValidityChecker??", player.getCommandSenderName(), tile));
+ return true; // Assume packet is not meant for this entity from the get-go as there is no checking process.
+ }
+
+ ITilePermission validityChecker = (ITilePermission) tile;
+ CustomNpcsPermissions.Permission perm = validityChecker.getPermission();
+
+ return !CustomNpcsPermissions.hasPermission(player, perm);
}
}
diff --git a/src/main/java/noppes/npcs/blocks/tiles/ITilePermission.java b/src/main/java/noppes/npcs/blocks/tiles/ITilePermission.java
new file mode 100644
index 000000000..769658168
--- /dev/null
+++ b/src/main/java/noppes/npcs/blocks/tiles/ITilePermission.java
@@ -0,0 +1,8 @@
+package noppes.npcs.blocks.tiles;
+
+import noppes.npcs.CustomNpcsPermissions;
+
+public interface ITilePermission {
+
+ CustomNpcsPermissions.Permission getPermission();
+}
diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileBorder.java b/src/main/java/noppes/npcs/blocks/tiles/TileBorder.java
index 2e3cafbea..3f18fd742 100644
--- a/src/main/java/noppes/npcs/blocks/tiles/TileBorder.java
+++ b/src/main/java/noppes/npcs/blocks/tiles/TileBorder.java
@@ -12,11 +12,12 @@ import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChatComponentTranslation;
+import noppes.npcs.CustomNpcsPermissions;
import noppes.npcs.controllers.data.Availability;
import java.util.List;
-public class TileBorder extends TileEntity implements IEntitySelector {
+public class TileBorder extends TileEntity implements IEntitySelector, ITilePermission {
public Availability availability = new Availability();
public AxisAlignedBB boundingbox;
public int rotation = 0;
@@ -109,4 +110,9 @@ public class TileBorder extends TileEntity implements IEntitySelector {
public boolean isEntityApplicable(Entity var1) {
return var1 instanceof EntityPlayerMP || var1 instanceof EntityEnderPearl;
}
+
+ @Override
+ public CustomNpcsPermissions.Permission getPermission() {
+ return CustomNpcsPermissions.EDIT_BLOCKS;
+ }
}
diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileRedstoneBlock.java b/src/main/java/noppes/npcs/blocks/tiles/TileRedstoneBlock.java
index 630e30143..1bf4161be 100644
--- a/src/main/java/noppes/npcs/blocks/tiles/TileRedstoneBlock.java
+++ b/src/main/java/noppes/npcs/blocks/tiles/TileRedstoneBlock.java
@@ -6,12 +6,13 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import noppes.npcs.CustomNpcs;
+import noppes.npcs.CustomNpcsPermissions;
import noppes.npcs.blocks.BlockNpcRedstone;
import noppes.npcs.controllers.data.Availability;
import java.util.List;
-public class TileRedstoneBlock extends TileEntity {
+public class TileRedstoneBlock extends TileEntity implements ITilePermission {
public int onRange = 6;
public int offRange = 10;
@@ -138,4 +139,9 @@ public class TileRedstoneBlock extends TileEntity {
public boolean canUpdate() {
return true;
}
+
+ @Override
+ public CustomNpcsPermissions.Permission getPermission() {
+ return CustomNpcsPermissions.EDIT_REDSTONE;
+ }
}
diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java b/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java
index b4f635d02..13413b9e3 100644
--- a/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java
+++ b/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java
@@ -6,6 +6,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.StatCollector;
+import noppes.npcs.CustomNpcsPermissions;
import noppes.npcs.constants.EnumQuestType;
import noppes.npcs.controllers.PartyController;
import noppes.npcs.controllers.data.Party;
@@ -18,7 +19,7 @@ import noppes.npcs.quests.QuestLocation;
import java.util.ArrayList;
import java.util.List;
-public class TileWaypoint extends TileEntity {
+public class TileWaypoint extends TileEntity implements ITilePermission {
public String name = "";
@@ -102,4 +103,9 @@ public class TileWaypoint extends TileEntity {
compound.setString("LocationName", name);
compound.setInteger("LocationRange", range);
}
+
+ @Override
+ public CustomNpcsPermissions.Permission getPermission() {
+ return CustomNpcsPermissions.EDIT_WAYPOINT;
+ }
}