Validate packets

This commit is contained in:
somehussar committed 2026-09-12 07:17:26 +02:00
1 parent 3448957d04
commit 7e06be509d
5 files changed
+66 -4

No files matched your search

@@ -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. <br>
* <br>
* <b>Any tile entity that uses this packet should implement {@link ITilePermission}</b> <br>
* 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);
}
}
@@ -0,0 +1,8 @@
package noppes.npcs.blocks.tiles;
import noppes.npcs.CustomNpcsPermissions;
public interface ITilePermission {
CustomNpcsPermissions.Permission getPermission();
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}