diff --git a/.github/scripts/test-no-error-reports.sh b/.github/scripts/test-no-error-reports.sh deleted file mode 100644 index 84c1e5d650..0000000000 --- a/.github/scripts/test-no-error-reports.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -RUNDIR="run" -CRASH="crash-reports" -SERVERLOG="server.log" - -if [[ -d $RUNDIR/$CRASH ]]; then - echo "Crash reports detected:" - cat $RUNDIR/$CRASH/crash*.txt - exit 1 -fi - -if grep --quiet "Fatal errors were detected" $SERVERLOG; then - echo "Fatal errors detected:" - cat server.log - exit 1 -fi - -if grep --quiet "The state engine was in incorrect state ERRORED and forced into state SERVER_STOPPED" $SERVERLOG; then - echo "Server force stopped:" - cat server.log - exit 1 -fi - -if ! grep --quiet -Po '.+Done \(.+\)\! For help, type "help" or "\?"' $SERVERLOG; then - echo "Server didn't finish startup:" - cat server.log - exit 1 -fi - -echo "No crash reports detected" -exit 0 - diff --git a/build.gradle b/build.gradle index a8b7532dea..3930990407 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1684218858 +//version: 1685785062 /* DO NOT CHANGE THIS FILE! Also, you may replace this file at any time if there is an update available. @@ -1276,12 +1276,14 @@ tasks.register('faq') { description = 'Prints frequently asked questions about building a project' doLast { - print("If your build fails to fetch dependencies, they might have been deleted and replaced by newer " + - "versions.\nCheck if the versions you try to fetch are still on the distributing sites.\n" + - "The links can be found in repositories.gradle and build.gradle:repositories, " + - "not build.gradle:buildscript.repositories - this one is for gradle plugin metadata.\n\n" + + print("If your build fails to fetch dependencies, run './gradlew updateDependencies'. " + + "Or you can manually check if the versions are still on the distributing sites - " + + "the links can be found in repositories.gradle and build.gradle:repositories, " + + "but not build.gradle:buildscript.repositories - those ones are for gradle plugin metadata.\n\n" + "If your build fails to recognize the syntax of new Java versions, enable Jabel in your " + - "gradle.properties. See how it's done in GTNH ExampleMod/gradle.properties.") + "gradle.properties. See how it's done in GTNH ExampleMod/gradle.properties. " + + "However, keep in mind that Jabel enables only syntax features, but not APIs that were introduced in " + + "Java 9 or later.") } } diff --git a/src/main/java/crazypants/enderio/Log.java b/src/main/java/crazypants/enderio/Log.java index 5df7260c9c..23a12557a0 100644 --- a/src/main/java/crazypants/enderio/Log.java +++ b/src/main/java/crazypants/enderio/Log.java @@ -2,10 +2,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; public final class Log { public static final Logger LOGGER = LogManager.getLogger(EnderIO.MODID); + public static final Marker securityMarker = MarkerManager.getMarker("SuspiciousPackets"); public static void warn(String msg) { LOGGER.warn(msg); diff --git a/src/main/java/crazypants/enderio/conduit/gui/ExternalConnectionContainer.java b/src/main/java/crazypants/enderio/conduit/gui/ExternalConnectionContainer.java index 4263875506..1148f9d7fe 100644 --- a/src/main/java/crazypants/enderio/conduit/gui/ExternalConnectionContainer.java +++ b/src/main/java/crazypants/enderio/conduit/gui/ExternalConnectionContainer.java @@ -10,6 +10,7 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -24,12 +25,14 @@ import crazypants.enderio.conduit.item.IItemConduit; import crazypants.enderio.conduit.item.SpeedUpgrade; import crazypants.enderio.conduit.item.filter.IItemFilter; +import crazypants.enderio.machine.gui.IContainerWithTileEntity; import crazypants.enderio.network.PacketHandler; -public class ExternalConnectionContainer extends ContainerEnder { +public class ExternalConnectionContainer extends ContainerEnder implements IContainerWithTileEntity { private final IItemConduit itemConduit; private final ForgeDirection direction; + private final TileEntity te; private int speedUpgradeSlotLimit = 15; @@ -52,6 +55,7 @@ public ExternalConnectionContainer(InventoryPlayer playerInv, IConduitBundle bun super(playerInv, new InventoryUpgrades(bundle.getConduit(IItemConduit.class), dir)); this.direction = dir; this.itemConduit = bundle.getConduit(IItemConduit.class); + this.te = (TileEntity) bundle; slotLocations.addAll(playerSlotLocations.values()); int x; @@ -280,6 +284,11 @@ public ItemStack transferStackInSlot(EntityPlayer entityPlayer, int slotIndex) { return copystack; } + @Override + public TileEntity getTileEntity() { + return te; + } + private class FilterSlot extends Slot { public FilterSlot(IInventory par1iInventory, int par2, int par3, int par4) { diff --git a/src/main/java/crazypants/enderio/conduit/gui/PacketFluidChannel.java b/src/main/java/crazypants/enderio/conduit/gui/PacketFluidChannel.java index 2e2f7988c3..2a7983cb73 100644 --- a/src/main/java/crazypants/enderio/conduit/gui/PacketFluidChannel.java +++ b/src/main/java/crazypants/enderio/conduit/gui/PacketFluidChannel.java @@ -49,6 +49,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketFluidChannel message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; ILiquidConduit conduit = message.getTileCasted(ctx); if (!(conduit instanceof AbstractEnderLiquidConduit)) { return null; diff --git a/src/main/java/crazypants/enderio/conduit/gui/PacketFluidFilter.java b/src/main/java/crazypants/enderio/conduit/gui/PacketFluidFilter.java index 6618cbc74e..4a5a52439c 100644 --- a/src/main/java/crazypants/enderio/conduit/gui/PacketFluidFilter.java +++ b/src/main/java/crazypants/enderio/conduit/gui/PacketFluidFilter.java @@ -53,6 +53,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketFluidFilter message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; ILiquidConduit conduit = message.getTileCasted(ctx); if (!(conduit instanceof AbstractEnderLiquidConduit)) { return null; diff --git a/src/main/java/crazypants/enderio/conduit/gui/item/PacketExistingItemFilterSnapshot.java b/src/main/java/crazypants/enderio/conduit/gui/item/PacketExistingItemFilterSnapshot.java index 6a5c9d9bfc..f20507f4d1 100644 --- a/src/main/java/crazypants/enderio/conduit/gui/item/PacketExistingItemFilterSnapshot.java +++ b/src/main/java/crazypants/enderio/conduit/gui/item/PacketExistingItemFilterSnapshot.java @@ -58,6 +58,7 @@ public void toBytes(ByteBuf buf) { @Override public PacketExistingItemFilterSnapshot onMessage(PacketExistingItemFilterSnapshot message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; IItemConduit conduit = message.getTileCasted(ctx); if (conduit == null) { return null; diff --git a/src/main/java/crazypants/enderio/conduit/gui/item/PacketModItemFilter.java b/src/main/java/crazypants/enderio/conduit/gui/item/PacketModItemFilter.java index 4bfc8f4f20..353bebef3f 100644 --- a/src/main/java/crazypants/enderio/conduit/gui/item/PacketModItemFilter.java +++ b/src/main/java/crazypants/enderio/conduit/gui/item/PacketModItemFilter.java @@ -58,6 +58,7 @@ public void toBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketModItemFilter message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; IItemConduit conduit = message.getTileCasted(ctx); if (conduit == null) { return null; diff --git a/src/main/java/crazypants/enderio/conduit/packet/AbstractConduitPacket.java b/src/main/java/crazypants/enderio/conduit/packet/AbstractConduitPacket.java index 2975dc4b46..c44ad59874 100644 --- a/src/main/java/crazypants/enderio/conduit/packet/AbstractConduitPacket.java +++ b/src/main/java/crazypants/enderio/conduit/packet/AbstractConduitPacket.java @@ -6,6 +6,7 @@ import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.conduit.IConduit; import crazypants.enderio.conduit.IConduitBundle; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class AbstractConduitPacket extends AbstractConduitBundlePacket { @@ -50,4 +51,12 @@ protected T getTileCasted(MessageContext ctx) { IConduitBundle bundle = (IConduitBundle) te; return (T) bundle.getConduit(getConType()); } + + /** + * Validates if TileEntity received from client is actually the one player is interacting with. It prevents + * malicious user disturbing random machine settings etc. + */ + protected static boolean isInvalidPacketForGui(AbstractConduitPacket message, MessageContext ctx) { + return PacketUtil.isInvalidPacketForGui(ctx, message.getTileEntity(message.getWorld(ctx)), message.getClass()); + } } diff --git a/src/main/java/crazypants/enderio/conduit/packet/PacketConnectionMode.java b/src/main/java/crazypants/enderio/conduit/packet/PacketConnectionMode.java index 95166c7163..1a2e41231d 100644 --- a/src/main/java/crazypants/enderio/conduit/packet/PacketConnectionMode.java +++ b/src/main/java/crazypants/enderio/conduit/packet/PacketConnectionMode.java @@ -40,6 +40,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketConnectionMode message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; IConduit conduit = message.getTileCasted(ctx); if (conduit == null) { return null; diff --git a/src/main/java/crazypants/enderio/conduit/packet/PacketExtractMode.java b/src/main/java/crazypants/enderio/conduit/packet/PacketExtractMode.java index 5d4d9e4362..03c2e82b8f 100644 --- a/src/main/java/crazypants/enderio/conduit/packet/PacketExtractMode.java +++ b/src/main/java/crazypants/enderio/conduit/packet/PacketExtractMode.java @@ -45,6 +45,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketExtractMode message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; message.getTileCasted(ctx).setExtractionRedstoneMode(message.mode, message.dir); message.getTileCasted(ctx).setExtractionSignalColor(message.dir, message.color); message.getWorld(ctx).markBlockForUpdate(message.x, message.y, message.z); diff --git a/src/main/java/crazypants/enderio/conduit/packet/PacketItemConduitFilter.java b/src/main/java/crazypants/enderio/conduit/packet/PacketItemConduitFilter.java index e2de632108..5cca3f2bd4 100644 --- a/src/main/java/crazypants/enderio/conduit/packet/PacketItemConduitFilter.java +++ b/src/main/java/crazypants/enderio/conduit/packet/PacketItemConduitFilter.java @@ -68,6 +68,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketItemConduitFilter message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; IItemConduit conduit = message.getTileCasted(ctx); conduit.setSelfFeedEnabled(message.dir, message.loopMode); conduit.setRoundRobinEnabled(message.dir, message.roundRobin); diff --git a/src/main/java/crazypants/enderio/conduit/packet/PacketOCConduitSignalColor.java b/src/main/java/crazypants/enderio/conduit/packet/PacketOCConduitSignalColor.java index 80e7acb777..69cf54edfd 100644 --- a/src/main/java/crazypants/enderio/conduit/packet/PacketOCConduitSignalColor.java +++ b/src/main/java/crazypants/enderio/conduit/packet/PacketOCConduitSignalColor.java @@ -40,6 +40,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketOCConduitSignalColor message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; message.getTileCasted(ctx).setSignalColor(message.dir, message.col); message.getWorld(ctx).markBlockForUpdate(message.x, message.y, message.z); return null; diff --git a/src/main/java/crazypants/enderio/conduit/packet/PacketRedstoneConduitOutputStrength.java b/src/main/java/crazypants/enderio/conduit/packet/PacketRedstoneConduitOutputStrength.java index 5c6f77de4a..c39bb36bf0 100644 --- a/src/main/java/crazypants/enderio/conduit/packet/PacketRedstoneConduitOutputStrength.java +++ b/src/main/java/crazypants/enderio/conduit/packet/PacketRedstoneConduitOutputStrength.java @@ -38,6 +38,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketRedstoneConduitOutputStrength message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; IInsulatedRedstoneConduit tile = message.getTileCasted(ctx); if (tile != null) { tile.setOutputStrength(message.dir, message.isStrong); diff --git a/src/main/java/crazypants/enderio/conduit/packet/PacketRedstoneConduitSignalColor.java b/src/main/java/crazypants/enderio/conduit/packet/PacketRedstoneConduitSignalColor.java index 503753cda5..26bda96810 100644 --- a/src/main/java/crazypants/enderio/conduit/packet/PacketRedstoneConduitSignalColor.java +++ b/src/main/java/crazypants/enderio/conduit/packet/PacketRedstoneConduitSignalColor.java @@ -40,6 +40,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketRedstoneConduitSignalColor message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; message.getTileCasted(ctx).setSignalColor(message.dir, message.col); message.getWorld(ctx).markBlockForUpdate(message.x, message.y, message.z); return null; diff --git a/src/main/java/crazypants/enderio/conduit/packet/PacketRoundRobinMode.java b/src/main/java/crazypants/enderio/conduit/packet/PacketRoundRobinMode.java index 2268cb4883..1faea4feaa 100644 --- a/src/main/java/crazypants/enderio/conduit/packet/PacketRoundRobinMode.java +++ b/src/main/java/crazypants/enderio/conduit/packet/PacketRoundRobinMode.java @@ -39,6 +39,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketRoundRobinMode message, MessageContext ctx) { + if (isInvalidPacketForGui(message, ctx)) return null; final ILiquidConduit conduit = message.getTileCasted(ctx); if (conduit instanceof AbstractEnderLiquidConduit) { ((AbstractEnderLiquidConduit) conduit).setRoundRobin(message.dir, message.roundRobin); diff --git a/src/main/java/crazypants/enderio/machine/ContainerNoInv.java b/src/main/java/crazypants/enderio/machine/ContainerNoInv.java index 24f3409f27..0b4903bd87 100644 --- a/src/main/java/crazypants/enderio/machine/ContainerNoInv.java +++ b/src/main/java/crazypants/enderio/machine/ContainerNoInv.java @@ -2,19 +2,25 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; -public class ContainerNoInv extends Container { +import crazypants.enderio.machine.gui.IContainerWithTileEntity; - private IInventory inv; +public class ContainerNoInv extends Container implements IContainerWithTileEntity { - public ContainerNoInv(IInventory inv) { - super(); - this.inv = inv; + private final AbstractMachineEntity tile; + + public ContainerNoInv(AbstractMachineEntity tile) { + this.tile = tile; } @Override public boolean canInteractWith(EntityPlayer player) { - return inv.isUseableByPlayer(player); + return tile.isUseableByPlayer(player); + } + + @Override + public TileEntity getTileEntity() { + return tile; } } diff --git a/src/main/java/crazypants/enderio/machine/PacketIoMode.java b/src/main/java/crazypants/enderio/machine/PacketIoMode.java index a3a336cff1..f6875dd501 100644 --- a/src/main/java/crazypants/enderio/machine/PacketIoMode.java +++ b/src/main/java/crazypants/enderio/machine/PacketIoMode.java @@ -9,6 +9,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketIoMode implements IMessage, IMessageHandler { @@ -61,6 +62,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketIoMode message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof IIoConfigurable) { IIoConfigurable me = (IIoConfigurable) te; if (message.face == ForgeDirection.UNKNOWN) { diff --git a/src/main/java/crazypants/enderio/machine/PacketItemBuffer.java b/src/main/java/crazypants/enderio/machine/PacketItemBuffer.java index fd97f61054..1562f3f1f5 100644 --- a/src/main/java/crazypants/enderio/machine/PacketItemBuffer.java +++ b/src/main/java/crazypants/enderio/machine/PacketItemBuffer.java @@ -8,6 +8,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketItemBuffer implements IMessage, IMessageHandler { @@ -47,6 +48,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketItemBuffer message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof IItemBuffer) { ((IItemBuffer) te).setBufferStacks(message.bufferStacks); } diff --git a/src/main/java/crazypants/enderio/machine/PacketProgress.java b/src/main/java/crazypants/enderio/machine/PacketProgress.java deleted file mode 100644 index 4b3872b845..0000000000 --- a/src/main/java/crazypants/enderio/machine/PacketProgress.java +++ /dev/null @@ -1,45 +0,0 @@ -package crazypants.enderio.machine; - -import net.minecraft.tileentity.TileEntity; - -import com.enderio.core.api.common.util.IProgressTile; -import com.enderio.core.common.network.MessageTileEntity; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import crazypants.enderio.EnderIO; -import io.netty.buffer.ByteBuf; - -public class PacketProgress extends MessageTileEntity implements IMessageHandler { - - private float progress; - - public PacketProgress() {} - - public PacketProgress(IProgressTile tile) { - super(tile.getTileEntity()); - progress = tile.getProgress(); - } - - @Override - public void toBytes(ByteBuf buf) { - super.toBytes(buf); - buf.writeFloat(progress); - } - - @Override - public void fromBytes(ByteBuf buf) { - super.fromBytes(buf); - progress = buf.readFloat(); - } - - @Override - public IMessage onMessage(PacketProgress message, MessageContext ctx) { - TileEntity tile = message.getTileEntity(EnderIO.proxy.getClientWorld()); - if (tile instanceof IProgressTile) { - ((IProgressTile) tile).setProgress(message.progress); - } - return null; - } -} diff --git a/src/main/java/crazypants/enderio/machine/PacketRedstoneMode.java b/src/main/java/crazypants/enderio/machine/PacketRedstoneMode.java index f8cc79cc50..916507cd9f 100644 --- a/src/main/java/crazypants/enderio/machine/PacketRedstoneMode.java +++ b/src/main/java/crazypants/enderio/machine/PacketRedstoneMode.java @@ -6,6 +6,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketRedstoneMode implements IMessage, IMessageHandler { @@ -52,6 +53,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketRedstoneMode message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof IRedstoneModeControlable) { IRedstoneModeControlable me = (IRedstoneModeControlable) te; me.setRedstoneControlMode(message.mode); diff --git a/src/main/java/crazypants/enderio/machine/alloy/PacketClientState.java b/src/main/java/crazypants/enderio/machine/alloy/PacketClientState.java index d2d1e47876..ed5018e3c7 100644 --- a/src/main/java/crazypants/enderio/machine/alloy/PacketClientState.java +++ b/src/main/java/crazypants/enderio/machine/alloy/PacketClientState.java @@ -5,6 +5,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketClientState implements IMessage, IMessageHandler { @@ -43,6 +44,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketClientState message, MessageContext ctx) { TileEntity te = ctx.getServerHandler().playerEntity.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof TileAlloySmelter) { TileAlloySmelter me = (TileAlloySmelter) te; me.setMode(message.mode); diff --git a/src/main/java/crazypants/enderio/machine/capbank/ContainerCapBank.java b/src/main/java/crazypants/enderio/machine/capbank/ContainerCapBank.java index d8132a7f94..5f3dfef5e9 100644 --- a/src/main/java/crazypants/enderio/machine/capbank/ContainerCapBank.java +++ b/src/main/java/crazypants/enderio/machine/capbank/ContainerCapBank.java @@ -10,15 +10,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import com.enderio.core.common.ContainerEnder; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import crazypants.enderio.machine.capbank.network.InventoryImpl; +import crazypants.enderio.machine.gui.ContainerEnderTileEntity; import crazypants.util.BaublesUtil; import crazypants.util.ShadowInventory; -public class ContainerCapBank extends ContainerEnder { +public class ContainerCapBank extends ContainerEnderTileEntity { private InventoryImpl inv; diff --git a/src/main/java/crazypants/enderio/machine/crafter/PacketCrafter.java b/src/main/java/crazypants/enderio/machine/crafter/PacketCrafter.java index 278f8a9b88..0c2bd77706 100644 --- a/src/main/java/crazypants/enderio/machine/crafter/PacketCrafter.java +++ b/src/main/java/crazypants/enderio/machine/crafter/PacketCrafter.java @@ -8,6 +8,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketCrafter extends MessageTileEntity implements IMessageHandler { @@ -46,9 +47,8 @@ public void toBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketCrafter msg, MessageContext ctx) { TileCrafter te = msg.getTileEntity(ctx.getServerHandler().playerEntity.worldObj); - if (te != null) { - msg.execute(te); - } + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; + msg.execute(te); return null; } diff --git a/src/main/java/crazypants/enderio/machine/enchanter/ContainerEnchanter.java b/src/main/java/crazypants/enderio/machine/enchanter/ContainerEnchanter.java index 328c0a5e2c..7f8c5e213c 100644 --- a/src/main/java/crazypants/enderio/machine/enchanter/ContainerEnchanter.java +++ b/src/main/java/crazypants/enderio/machine/enchanter/ContainerEnchanter.java @@ -11,9 +11,10 @@ import com.enderio.core.client.gui.widget.GhostBackgroundItemSlot; import com.enderio.core.client.gui.widget.GhostSlot; -import com.enderio.core.common.ContainerEnder; -public class ContainerEnchanter extends ContainerEnder { +import crazypants.enderio.machine.gui.ContainerEnderTileEntity; + +public class ContainerEnchanter extends ContainerEnderTileEntity { public ContainerEnchanter(EntityPlayer player, InventoryPlayer playerInv, TileEnchanter te) { super(playerInv, te); diff --git a/src/main/java/crazypants/enderio/machine/farm/PacketFarmLockedSlot.java b/src/main/java/crazypants/enderio/machine/farm/PacketFarmLockedSlot.java index 670bc85797..0e62e8dcf4 100644 --- a/src/main/java/crazypants/enderio/machine/farm/PacketFarmLockedSlot.java +++ b/src/main/java/crazypants/enderio/machine/farm/PacketFarmLockedSlot.java @@ -5,6 +5,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketFarmLockedSlot extends MessageTileEntity @@ -34,9 +35,8 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketFarmLockedSlot message, MessageContext ctx) { TileFarmStation te = message.getTileEntity(message.getWorld(ctx)); - if (te != null) { - te.toggleLockedState(message.buttonID); - } + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; + te.toggleLockedState(message.buttonID); return null; } } diff --git a/src/main/java/crazypants/enderio/machine/gui/AbstractMachineContainer.java b/src/main/java/crazypants/enderio/machine/gui/AbstractMachineContainer.java index 612b9e37ab..35815a1a70 100644 --- a/src/main/java/crazypants/enderio/machine/gui/AbstractMachineContainer.java +++ b/src/main/java/crazypants/enderio/machine/gui/AbstractMachineContainer.java @@ -11,13 +11,12 @@ import net.minecraft.item.ItemStack; import com.enderio.core.api.common.util.IProgressTile; -import com.enderio.core.common.ContainerEnder; import com.enderio.core.common.util.Util; import crazypants.enderio.machine.AbstractMachineEntity; import crazypants.enderio.machine.SlotDefinition; -public abstract class AbstractMachineContainer extends ContainerEnder { +public abstract class AbstractMachineContainer extends ContainerEnderTileEntity { protected Slot upgradeSlot; diff --git a/src/main/java/crazypants/enderio/machine/gui/ContainerEnderTileEntity.java b/src/main/java/crazypants/enderio/machine/gui/ContainerEnderTileEntity.java new file mode 100644 index 0000000000..b578b5a836 --- /dev/null +++ b/src/main/java/crazypants/enderio/machine/gui/ContainerEnderTileEntity.java @@ -0,0 +1,20 @@ +package crazypants.enderio.machine.gui; + +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; + +import com.enderio.core.common.ContainerEnder; + +public class ContainerEnderTileEntity extends ContainerEnder + implements IContainerWithTileEntity { + + public ContainerEnderTileEntity(InventoryPlayer playerInv, T inv) { + super(playerInv, inv); + } + + @Override + public TileEntity getTileEntity() { + return getInv(); + } +} diff --git a/src/main/java/crazypants/enderio/machine/gui/IContainerWithTileEntity.java b/src/main/java/crazypants/enderio/machine/gui/IContainerWithTileEntity.java new file mode 100644 index 0000000000..3a51714a1c --- /dev/null +++ b/src/main/java/crazypants/enderio/machine/gui/IContainerWithTileEntity.java @@ -0,0 +1,13 @@ +package crazypants.enderio.machine.gui; + +import net.minecraft.tileentity.TileEntity; + +/** + * Container implementing this interface holds TileEntity player is interacting with. + * + * @see crazypants.enderio.network.PacketUtil#isInvalidPacketForGui + */ +public interface IContainerWithTileEntity { + + TileEntity getTileEntity(); +} diff --git a/src/main/java/crazypants/enderio/machine/hypercube/PacketClientState.java b/src/main/java/crazypants/enderio/machine/hypercube/PacketClientState.java index 2c4384da53..46d40b2143 100644 --- a/src/main/java/crazypants/enderio/machine/hypercube/PacketClientState.java +++ b/src/main/java/crazypants/enderio/machine/hypercube/PacketClientState.java @@ -14,6 +14,7 @@ import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.machine.hypercube.TileHyperCube.IoMode; import crazypants.enderio.machine.hypercube.TileHyperCube.SubChannel; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketClientState implements IMessage, IMessageHandler { @@ -88,6 +89,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketClientState message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof TileHyperCube) { TileHyperCube hc = (TileHyperCube) te; diff --git a/src/main/java/crazypants/enderio/machine/invpanel/PacketRequestMissingItems.java b/src/main/java/crazypants/enderio/machine/invpanel/PacketRequestMissingItems.java index d324098dcc..a7ad57ee7d 100644 --- a/src/main/java/crazypants/enderio/machine/invpanel/PacketRequestMissingItems.java +++ b/src/main/java/crazypants/enderio/machine/invpanel/PacketRequestMissingItems.java @@ -18,6 +18,7 @@ import crazypants.enderio.machine.invpanel.server.InventoryDatabaseServer; import crazypants.enderio.machine.invpanel.server.ItemEntry; import crazypants.enderio.network.PacketHandler; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketRequestMissingItems extends MessageTileEntity @@ -62,6 +63,7 @@ public void toBytes(ByteBuf buf) { public IMessage onMessage(PacketRequestMissingItems message, MessageContext ctx) { EntityPlayerMP player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof TileInventoryPanel) { TileInventoryPanel teInvPanel = (TileInventoryPanel) te; InventoryDatabaseServer db = teInvPanel.getDatabaseServer(); diff --git a/src/main/java/crazypants/enderio/machine/invpanel/PacketSetExtractionDisabled.java b/src/main/java/crazypants/enderio/machine/invpanel/PacketSetExtractionDisabled.java index 1eea812d07..ca15d7cb4f 100644 --- a/src/main/java/crazypants/enderio/machine/invpanel/PacketSetExtractionDisabled.java +++ b/src/main/java/crazypants/enderio/machine/invpanel/PacketSetExtractionDisabled.java @@ -8,6 +8,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketSetExtractionDisabled extends MessageTileEntity @@ -38,6 +39,7 @@ public void toBytes(ByteBuf buf) { public IMessage onMessage(PacketSetExtractionDisabled message, MessageContext ctx) { EntityPlayerMP player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof TileInventoryPanel) { TileInventoryPanel teInvPanel = (TileInventoryPanel) te; teInvPanel.setExtractionDisabled(message.extractionDisabled); diff --git a/src/main/java/crazypants/enderio/machine/monitor/PacketPowerMonitor.java b/src/main/java/crazypants/enderio/machine/monitor/PacketPowerMonitor.java index dd6741aee3..fac4c8349d 100644 --- a/src/main/java/crazypants/enderio/machine/monitor/PacketPowerMonitor.java +++ b/src/main/java/crazypants/enderio/machine/monitor/PacketPowerMonitor.java @@ -7,6 +7,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.Log; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketPowerMonitor implements IMessage, IMessageHandler { @@ -58,6 +59,7 @@ public IMessage onMessage(PacketPowerMonitor message, MessageContext ctx) { return null; } TilePowerMonitor pm = (TilePowerMonitor) te; + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; pm.engineControlEnabled = message.engineControlEnabled; pm.startLevel = message.startLevel; pm.stopLevel = message.stopLevel; diff --git a/src/main/java/crazypants/enderio/machine/obelisk/weather/PacketActivateWeather.java b/src/main/java/crazypants/enderio/machine/obelisk/weather/PacketActivateWeather.java index cacbe47e9f..0599d0ce49 100644 --- a/src/main/java/crazypants/enderio/machine/obelisk/weather/PacketActivateWeather.java +++ b/src/main/java/crazypants/enderio/machine/obelisk/weather/PacketActivateWeather.java @@ -6,6 +6,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.EnderIO; +import crazypants.enderio.network.PacketUtil; public class PacketActivateWeather extends MessageTileEntity implements IMessageHandler { @@ -22,6 +23,7 @@ public IMessage onMessage(PacketActivateWeather message, MessageContext ctx) { .getTileEntity(ctx.side.isServer() ? message.getWorld(ctx) : EnderIO.proxy.getClientWorld()); if (te != null) { if (ctx.side.isServer()) { + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; te.startTask(); } else { te.stopTask(); diff --git a/src/main/java/crazypants/enderio/machine/obelisk/xp/BlockExperienceObelisk.java b/src/main/java/crazypants/enderio/machine/obelisk/xp/BlockExperienceObelisk.java index 68b671ea31..77c278f632 100644 --- a/src/main/java/crazypants/enderio/machine/obelisk/xp/BlockExperienceObelisk.java +++ b/src/main/java/crazypants/enderio/machine/obelisk/xp/BlockExperienceObelisk.java @@ -3,7 +3,6 @@ import java.util.Random; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; @@ -49,7 +48,7 @@ public String getUnlocalizedNameForTooltip(ItemStack itemStack) { public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof TileExperienceObelisk) { - return new ContainerNoInv((IInventory) te); + return new ContainerNoInv((TileExperienceObelisk) te); } return null; } diff --git a/src/main/java/crazypants/enderio/machine/power/PacketClientState.java b/src/main/java/crazypants/enderio/machine/power/PacketClientState.java index e75a8dce38..4764eb81b5 100644 --- a/src/main/java/crazypants/enderio/machine/power/PacketClientState.java +++ b/src/main/java/crazypants/enderio/machine/power/PacketClientState.java @@ -7,6 +7,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.machine.RedstoneControlMode; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketClientState implements IMessage, IMessageHandler { @@ -62,6 +63,7 @@ public void fromBytes(ByteBuf data) { public IMessage onMessage(PacketClientState message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof TileCapacitorBank) { TileCapacitorBank cb = (TileCapacitorBank) te; cb.setInputControlMode(message.inputMode); diff --git a/src/main/java/crazypants/enderio/machine/spawner/PacketMode.java b/src/main/java/crazypants/enderio/machine/spawner/PacketMode.java index 16979595b0..c093420520 100644 --- a/src/main/java/crazypants/enderio/machine/spawner/PacketMode.java +++ b/src/main/java/crazypants/enderio/machine/spawner/PacketMode.java @@ -5,6 +5,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketMode implements IMessage, IMessageHandler { @@ -43,6 +44,7 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketMode message, MessageContext ctx) { TileEntity te = ctx.getServerHandler().playerEntity.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof TilePoweredSpawner) { TilePoweredSpawner me = (TilePoweredSpawner) te; me.setSpawnMode(message.isSpawnMode); diff --git a/src/main/java/crazypants/enderio/machine/tank/PacketTankVoidMode.java b/src/main/java/crazypants/enderio/machine/tank/PacketTankVoidMode.java index dc2388b751..1e81a2efb0 100644 --- a/src/main/java/crazypants/enderio/machine/tank/PacketTankVoidMode.java +++ b/src/main/java/crazypants/enderio/machine/tank/PacketTankVoidMode.java @@ -6,6 +6,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.machine.tank.GuiTank.VoidMode; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketTankVoidMode extends MessageTileEntity @@ -35,9 +36,8 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketTankVoidMode message, MessageContext ctx) { TileTank te = message.getTileEntity(ctx.getServerHandler().playerEntity.worldObj); - if (te != null) { - te.setVoidMode(message.mode); - } + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; + te.setVoidMode(message.mode); return null; } } diff --git a/src/main/java/crazypants/enderio/machine/transceiver/PacketItemFilter.java b/src/main/java/crazypants/enderio/machine/transceiver/PacketItemFilter.java index a3518b94ef..f9ac81b2ad 100644 --- a/src/main/java/crazypants/enderio/machine/transceiver/PacketItemFilter.java +++ b/src/main/java/crazypants/enderio/machine/transceiver/PacketItemFilter.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.conduit.item.filter.ItemFilter; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketItemFilter extends MessageTileEntity @@ -52,9 +53,10 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketItemFilter message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileTransceiver tile = message.getTileEntity(player.worldObj); + if (PacketUtil.isInvalidPacketForGui(ctx, tile, getClass())) return null; boolean isSend = message.isSend; ItemFilter filter = message.filter; - if (tile != null && filter != null) { + if (filter != null) { if (isSend) { tile.setSendItemFilter(filter); } else { diff --git a/src/main/java/crazypants/enderio/machine/transceiver/PacketSendRecieveChannel.java b/src/main/java/crazypants/enderio/machine/transceiver/PacketSendRecieveChannel.java index 0dbb688604..b27cbcaf2d 100644 --- a/src/main/java/crazypants/enderio/machine/transceiver/PacketSendRecieveChannel.java +++ b/src/main/java/crazypants/enderio/machine/transceiver/PacketSendRecieveChannel.java @@ -9,6 +9,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketSendRecieveChannel extends MessageTileEntity @@ -50,10 +51,11 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketSendRecieveChannel message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileTransceiver tile = message.getTileEntity(player.worldObj); + if (PacketUtil.isInvalidPacketForGui(ctx, tile, getClass())) return null; Channel channel = message.channel; boolean isSend = message.isSend; boolean isAdd = message.isAdd; - if (tile != null && channel != null) { + if (channel != null) { if (isSend) { if (isAdd) { tile.addSendChanel(channel); diff --git a/src/main/java/crazypants/enderio/machine/vacuum/ContainerVacuumChest.java b/src/main/java/crazypants/enderio/machine/vacuum/ContainerVacuumChest.java index b97f10bc31..f1c42d297a 100644 --- a/src/main/java/crazypants/enderio/machine/vacuum/ContainerVacuumChest.java +++ b/src/main/java/crazypants/enderio/machine/vacuum/ContainerVacuumChest.java @@ -10,11 +10,11 @@ import com.enderio.core.client.gui.widget.GhostBackgroundItemSlot; import com.enderio.core.client.gui.widget.GhostSlot; -import com.enderio.core.common.ContainerEnder; import crazypants.enderio.EnderIO; +import crazypants.enderio.machine.gui.ContainerEnderTileEntity; -public class ContainerVacuumChest extends ContainerEnder { +public class ContainerVacuumChest extends ContainerEnderTileEntity { private Slot filterSlot; private Runnable filterChangedCB; diff --git a/src/main/java/crazypants/enderio/machine/vacuum/PacketVaccumChest.java b/src/main/java/crazypants/enderio/machine/vacuum/PacketVaccumChest.java index e071bd2743..9e3f840f36 100644 --- a/src/main/java/crazypants/enderio/machine/vacuum/PacketVaccumChest.java +++ b/src/main/java/crazypants/enderio/machine/vacuum/PacketVaccumChest.java @@ -8,6 +8,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketVaccumChest extends MessageTileEntity @@ -77,21 +78,20 @@ public void toBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketVaccumChest msg, MessageContext ctx) { TileVacuumChest te = msg.getTileEntity(ctx.getServerHandler().playerEntity.worldObj); - if (te != null) { - switch (msg.cmd) { - case CMD_SET_RANGE: - te.setRange(msg.value); - break; - case CMD_SET_SLOT: - te.setItemFilterSlot(msg.value, msg.stack); - break; - case CMD_SET_BLACKLIST: - te.setFilterBlacklist(msg.value != 0); - break; - case CMD_SET_MATCHMETA: - te.setFilterMatchMeta(msg.value != 0); - break; - } + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; + switch (msg.cmd) { + case CMD_SET_RANGE: + te.setRange(msg.value); + break; + case CMD_SET_SLOT: + te.setItemFilterSlot(msg.value, msg.stack); + break; + case CMD_SET_BLACKLIST: + te.setFilterBlacklist(msg.value != 0); + break; + case CMD_SET_MATCHMETA: + te.setFilterMatchMeta(msg.value != 0); + break; } return null; } diff --git a/src/main/java/crazypants/enderio/machine/vat/PacketDumpTank.java b/src/main/java/crazypants/enderio/machine/vat/PacketDumpTank.java index 42723a7cfe..8e9dc28f44 100644 --- a/src/main/java/crazypants/enderio/machine/vat/PacketDumpTank.java +++ b/src/main/java/crazypants/enderio/machine/vat/PacketDumpTank.java @@ -7,6 +7,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketDumpTank extends MessageTileEntity implements IMessageHandler { @@ -47,9 +48,8 @@ private FluidTank getTank(TileVat te) { @Override public IMessage onMessage(PacketDumpTank message, MessageContext ctx) { TileVat te = message.getTileEntity(ctx.getServerHandler().playerEntity.worldObj); - if (te != null) { - message.getTank(te).setFluid(null); - } + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; + message.getTank(te).setFluid(null); return null; } } diff --git a/src/main/java/crazypants/enderio/network/PacketUtil.java b/src/main/java/crazypants/enderio/network/PacketUtil.java new file mode 100644 index 0000000000..f01e8f7b2d --- /dev/null +++ b/src/main/java/crazypants/enderio/network/PacketUtil.java @@ -0,0 +1,54 @@ +package crazypants.enderio.network; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.tileentity.TileEntity; + +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import crazypants.enderio.Log; +import crazypants.enderio.machine.gui.IContainerWithTileEntity; + +public class PacketUtil { + + /** + * Validates if TileEntity received from client is actually the one player is interacting with. It prevents + * malicious user disturbing random machine settings etc. + */ + public static boolean isInvalidPacketForGui(MessageContext ctx, TileEntity receivedTile, Class messageClass) { + if (receivedTile == null) { + // Invalid, but not harmful + return true; + } + if (ctx.side == Side.CLIENT) return false; + EntityPlayer player = ctx.getServerHandler().playerEntity; + Container container = player.openContainer; + if (!(container instanceof IContainerWithTileEntity)) { + Log.LOGGER.warn( + Log.securityMarker, + "Player {} tried to send {} while not opening correct GUI. Target TileEntity at {}, {}, {}", + player.getGameProfile(), + messageClass.getSimpleName(), + receivedTile.xCoord, + receivedTile.yCoord, + receivedTile.zCoord); + return true; + } + TileEntity expectedTile = ((IContainerWithTileEntity) container).getTileEntity(); + if (receivedTile != expectedTile) { + Log.LOGGER.warn( + Log.securityMarker, + "Player {} tried to send {} which attempts to modify setting of TileEntity at {}, {}, {}. Expected: {}, {}, {}", + player.getGameProfile(), + messageClass.getSimpleName(), + receivedTile.xCoord, + receivedTile.yCoord, + receivedTile.zCoord, + expectedTile.xCoord, + expectedTile.yCoord, + expectedTile.zCoord); + return true; + } + return false; + } +} diff --git a/src/main/java/crazypants/enderio/teleport/ContainerTravelAccessable.java b/src/main/java/crazypants/enderio/teleport/ContainerTravelAccessable.java index cf89a70d74..e3a457ea8a 100644 --- a/src/main/java/crazypants/enderio/teleport/ContainerTravelAccessable.java +++ b/src/main/java/crazypants/enderio/teleport/ContainerTravelAccessable.java @@ -15,10 +15,11 @@ import com.enderio.core.common.TileEntityEnder; import crazypants.enderio.api.teleport.ITravelAccessable; +import crazypants.enderio.machine.gui.IContainerWithTileEntity; import crazypants.enderio.network.PacketHandler; import crazypants.enderio.teleport.packet.PacketPassword; -public class ContainerTravelAccessable extends ContainerEnder { +public class ContainerTravelAccessable extends ContainerEnder implements IContainerWithTileEntity { ITravelAccessable ta; TileEntity te; @@ -97,4 +98,9 @@ public void putStack(ItemStack stack) { } } } + + @Override + public TileEntity getTileEntity() { + return te; + } } diff --git a/src/main/java/crazypants/enderio/teleport/ContainerTravelAuth.java b/src/main/java/crazypants/enderio/teleport/ContainerTravelAuth.java index 4bee47f0e2..217ab4d31d 100644 --- a/src/main/java/crazypants/enderio/teleport/ContainerTravelAuth.java +++ b/src/main/java/crazypants/enderio/teleport/ContainerTravelAuth.java @@ -6,14 +6,16 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import com.enderio.core.client.gui.widget.GhostSlot; import com.enderio.core.common.ContainerEnder; import com.enderio.core.common.util.ArrayInventory; +import crazypants.enderio.machine.gui.IContainerWithTileEntity; import crazypants.enderio.teleport.ContainerTravelAuth.AuthInventory; -public class ContainerTravelAuth extends ContainerEnder { +public class ContainerTravelAuth extends ContainerEnder implements IContainerWithTileEntity { static class AuthInventory extends ArrayInventory { @@ -87,10 +89,12 @@ public ItemStack[] getInventory() { } } + private final TileEntity te; boolean dirty = false; - public ContainerTravelAuth(InventoryPlayer playerInv) { + public ContainerTravelAuth(InventoryPlayer playerInv, TileEntity te) { super(playerInv, new AuthInventory(new ItemStack[5])); + this.te = te; getInv().setContainer(this); } @@ -118,6 +122,11 @@ public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) { return null; } + @Override + public TileEntity getTileEntity() { + return te; + } + private static class AuthGhostSlot extends GhostSlot { private AuthInventory inv; diff --git a/src/main/java/crazypants/enderio/teleport/GuiTravelAuth.java b/src/main/java/crazypants/enderio/teleport/GuiTravelAuth.java index 7c76766984..e1d12587f9 100644 --- a/src/main/java/crazypants/enderio/teleport/GuiTravelAuth.java +++ b/src/main/java/crazypants/enderio/teleport/GuiTravelAuth.java @@ -5,6 +5,7 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import org.lwjgl.opengl.GL11; @@ -24,7 +25,7 @@ public class GuiTravelAuth extends GuiContainerBaseEIO { private final EntityPlayer player; public GuiTravelAuth(EntityPlayer player, ITravelAccessable te, World world) { - super(new ContainerTravelAuth(player.inventory), "travelAuth"); + super(new ContainerTravelAuth(player.inventory, (TileEntity) te), "travelAuth"); this.ta = te; title = EnderIO.lang.localize("gui.travelAccessable.enterCode"); this.player = player; diff --git a/src/main/java/crazypants/enderio/teleport/anchor/BlockTravelAnchor.java b/src/main/java/crazypants/enderio/teleport/anchor/BlockTravelAnchor.java index 2351218017..d1dee927d2 100644 --- a/src/main/java/crazypants/enderio/teleport/anchor/BlockTravelAnchor.java +++ b/src/main/java/crazypants/enderio/teleport/anchor/BlockTravelAnchor.java @@ -181,7 +181,7 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int if (ID == GuiHandler.GUI_ID_TRAVEL_ACCESSABLE) { return new ContainerTravelAccessable(player.inventory, (ITravelAccessable) te, world); } else { - return new ContainerTravelAuth(player.inventory); + return new ContainerTravelAuth(player.inventory, te); } } return null; diff --git a/src/main/java/crazypants/enderio/teleport/packet/PacketAccessMode.java b/src/main/java/crazypants/enderio/teleport/packet/PacketAccessMode.java index 58f2112eec..fe6ce0823f 100644 --- a/src/main/java/crazypants/enderio/teleport/packet/PacketAccessMode.java +++ b/src/main/java/crazypants/enderio/teleport/packet/PacketAccessMode.java @@ -7,6 +7,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.api.teleport.ITravelAccessable; +import crazypants.enderio.network.PacketUtil; import crazypants.enderio.teleport.anchor.TileTravelAnchor; import io.netty.buffer.ByteBuf; @@ -48,6 +49,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketAccessMode message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof ITravelAccessable) { ((ITravelAccessable) te).setAccessMode(message.mode); player.worldObj.markBlockForUpdate(message.x, message.y, message.z); diff --git a/src/main/java/crazypants/enderio/teleport/packet/PacketLabel.java b/src/main/java/crazypants/enderio/teleport/packet/PacketLabel.java index 168062a20d..5f4fd50e50 100644 --- a/src/main/java/crazypants/enderio/teleport/packet/PacketLabel.java +++ b/src/main/java/crazypants/enderio/teleport/packet/PacketLabel.java @@ -8,6 +8,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.api.teleport.ITravelAccessable; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketLabel implements IMessage, IMessageHandler { @@ -55,6 +56,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketLabel message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof ITravelAccessable) { ((ITravelAccessable) te).setLabel(message.label); player.worldObj.markBlockForUpdate(message.x, message.y, message.z); diff --git a/src/main/java/crazypants/enderio/teleport/packet/PacketPassword.java b/src/main/java/crazypants/enderio/teleport/packet/PacketPassword.java index 67983fd394..323a5b7e60 100644 --- a/src/main/java/crazypants/enderio/teleport/packet/PacketPassword.java +++ b/src/main/java/crazypants/enderio/teleport/packet/PacketPassword.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.api.teleport.ITravelAccessable; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketPassword extends MessageTileEntity { @@ -61,6 +62,7 @@ public static class Handler implements IMessageHandler @Override public IMessage onMessage(PacketPassword msg, MessageContext ctx) { TileEntityEnder te = msg.getTileEntity(ctx.getServerHandler().playerEntity.worldObj); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof ITravelAccessable) { if (((ITravelAccessable) te).canUiBeAccessed(ctx.getServerHandler().playerEntity)) { if (msg.stack != null) { diff --git a/src/main/java/crazypants/enderio/teleport/packet/PacketVisibility.java b/src/main/java/crazypants/enderio/teleport/packet/PacketVisibility.java index f1e389d290..87d0213afa 100644 --- a/src/main/java/crazypants/enderio/teleport/packet/PacketVisibility.java +++ b/src/main/java/crazypants/enderio/teleport/packet/PacketVisibility.java @@ -7,6 +7,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.api.teleport.ITravelAccessable; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketVisibility implements IMessage, IMessageHandler { @@ -44,6 +45,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketVisibility message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity te = player.worldObj.getTileEntity(message.x, message.y, message.z); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; if (te instanceof ITravelAccessable) { ((ITravelAccessable) te).setVisible(message.visible); player.worldObj.markBlockForUpdate(message.x, message.y, message.z); diff --git a/src/main/java/crazypants/enderio/teleport/telepad/BlockTelePad.java b/src/main/java/crazypants/enderio/teleport/telepad/BlockTelePad.java index 01c5232799..c25582a7f6 100644 --- a/src/main/java/crazypants/enderio/teleport/telepad/BlockTelePad.java +++ b/src/main/java/crazypants/enderio/teleport/telepad/BlockTelePad.java @@ -167,11 +167,11 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int if (te instanceof TileTelePad) { switch (ID) { case GuiHandler.GUI_ID_TELEPAD: - return new ContainerTelePad(player.inventory); + return new ContainerTelePad(player.inventory, (TileTelePad) te); case GuiHandler.GUI_ID_TELEPAD_TRAVEL: return new ContainerTravelAccessable(player.inventory, (TileTelePad) te, world); default: - return new ContainerTravelAuth(player.inventory); + return new ContainerTravelAuth(player.inventory, te); } } return null; diff --git a/src/main/java/crazypants/enderio/teleport/telepad/ContainerTelePad.java b/src/main/java/crazypants/enderio/teleport/telepad/ContainerTelePad.java index 51133a82bf..ac904e4880 100644 --- a/src/main/java/crazypants/enderio/teleport/telepad/ContainerTelePad.java +++ b/src/main/java/crazypants/enderio/teleport/telepad/ContainerTelePad.java @@ -4,13 +4,19 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; import com.enderio.core.common.ContainerEnder; -public class ContainerTelePad extends ContainerEnder { +import crazypants.enderio.machine.gui.IContainerWithTileEntity; - public ContainerTelePad(InventoryPlayer playerInv) { +public class ContainerTelePad extends ContainerEnder implements IContainerWithTileEntity { + + private final TileTelePad te; + + public ContainerTelePad(InventoryPlayer playerInv, TileTelePad te) { super(playerInv, playerInv); + this.te = te; } @Override @@ -19,4 +25,9 @@ public Point getPlayerInventoryOffset() { p.translate(0, 34); return p; } + + @Override + public TileEntity getTileEntity() { + return te; + } } diff --git a/src/main/java/crazypants/enderio/teleport/telepad/GuiTelePad.java b/src/main/java/crazypants/enderio/teleport/telepad/GuiTelePad.java index 74ad183ce9..0809e57af0 100644 --- a/src/main/java/crazypants/enderio/teleport/telepad/GuiTelePad.java +++ b/src/main/java/crazypants/enderio/teleport/telepad/GuiTelePad.java @@ -51,7 +51,7 @@ public class GuiTelePad extends GuiContainerBaseEIO implements IToggleableGui { public static int SWITCH_X = 155, SWITCH_Y = 5; public GuiTelePad(InventoryPlayer playerInv, TileTelePad te, World world) { - super(new ContainerTelePad(playerInv), "telePad"); + super(new ContainerTelePad(playerInv, te), "telePad"); this.world = world; this.te = te; ySize += 34; diff --git a/src/main/java/crazypants/enderio/teleport/telepad/PacketTeleport.java b/src/main/java/crazypants/enderio/teleport/telepad/PacketTeleport.java index d9a016879c..6c319c7090 100644 --- a/src/main/java/crazypants/enderio/teleport/telepad/PacketTeleport.java +++ b/src/main/java/crazypants/enderio/teleport/telepad/PacketTeleport.java @@ -1,7 +1,6 @@ package crazypants.enderio.teleport.telepad; import net.minecraft.entity.Entity; -import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import com.enderio.core.common.network.MessageTileEntity; @@ -10,6 +9,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.EnderIO; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketTeleport extends MessageTileEntity @@ -60,20 +60,19 @@ public void fromBytes(ByteBuf buf) { @Override public IMessage onMessage(PacketTeleport message, MessageContext ctx) { World world = ctx.side.isClient() ? EnderIO.proxy.getClientWorld() : message.getWorld(ctx); - TileEntity te = message.getTileEntity(world); - if (te instanceof TileTelePad) { - Entity e = world.getEntityByID(message.entityId); - switch (message.type) { - case BEGIN: - ((TileTelePad) te).enqueueTeleport(e, false); - break; - case END: - ((TileTelePad) te).dequeueTeleport(e, false); - break; - case TELEPORT: - ((TileTelePad) te).wasBlocked = message.wasBlocked; - break; - } + TileTelePad te = message.getTileEntity(world); + if (PacketUtil.isInvalidPacketForGui(ctx, te, getClass())) return null; + Entity e = world.getEntityByID(message.entityId); + switch (message.type) { + case BEGIN: + te.enqueueTeleport(e, false); + break; + case END: + te.dequeueTeleport(e, false); + break; + case TELEPORT: + te.wasBlocked = message.wasBlocked; + break; } return null; } diff --git a/src/main/java/crazypants/enderio/xp/PacketDrainPlayerXP.java b/src/main/java/crazypants/enderio/xp/PacketDrainPlayerXP.java index a905472499..5ca0e1d24f 100644 --- a/src/main/java/crazypants/enderio/xp/PacketDrainPlayerXP.java +++ b/src/main/java/crazypants/enderio/xp/PacketDrainPlayerXP.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.network.simpleimpl.MessageContext; import cpw.mods.fml.relauncher.Side; import crazypants.enderio.network.PacketHandler; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketDrainPlayerXP extends MessageTileEntity @@ -57,6 +58,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketDrainPlayerXP message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity tile = message.getTileEntity(player.worldObj); + if (PacketUtil.isInvalidPacketForGui(ctx, tile, getClass())) return null; if (tile instanceof IHaveExperience) { IHaveExperience xpTile = (IHaveExperience) tile; if (player.capabilities.isCreativeMode && message.isContainerLevel) { diff --git a/src/main/java/crazypants/enderio/xp/PacketGivePlayerXP.java b/src/main/java/crazypants/enderio/xp/PacketGivePlayerXP.java index 455d39485d..dcf40126b9 100644 --- a/src/main/java/crazypants/enderio/xp/PacketGivePlayerXP.java +++ b/src/main/java/crazypants/enderio/xp/PacketGivePlayerXP.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.network.simpleimpl.MessageContext; import cpw.mods.fml.relauncher.Side; import crazypants.enderio.network.PacketHandler; +import crazypants.enderio.network.PacketUtil; import io.netty.buffer.ByteBuf; public class PacketGivePlayerXP extends MessageTileEntity @@ -53,6 +54,7 @@ public void fromBytes(ByteBuf buf) { public IMessage onMessage(PacketGivePlayerXP message, MessageContext ctx) { EntityPlayer player = ctx.getServerHandler().playerEntity; TileEntity tile = message.getTileEntity(player.worldObj); + if (PacketUtil.isInvalidPacketForGui(ctx, tile, getClass())) return null; if (tile instanceof IHaveExperience) { IHaveExperience xpTile = (IHaveExperience) tile; xpTile.getContainer().givePlayerXp(player, message.levels);