From 3b82a10c1ff1eacc4d4fa7d7fe16496c570c5662 Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Sun, 15 Oct 2023 00:36:38 +0100 Subject: [PATCH] Prevent proxy commands from breaking the chat chain system diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java b/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java index 14ad2e71..fe6c7339 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java @@ -277,5 +277,9 @@ public abstract class AbstractPacketHandler public void handle(net.md_5.bungee.protocol.packet.EntityRemoveEffect removeEffect) throws Exception { } + + public void handle(net.md_5.bungee.protocol.packet.ClientChatAcknowledgement clientChatAcknowledgement) + { + } // Waterfall end } diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java index 414d4578..3a69fced 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java @@ -545,6 +545,13 @@ public enum Protocol map( ProtocolConstants.MINECRAFT_1_19_1, 0x05 ), map( ProtocolConstants.MINECRAFT_1_20_5, 0x06 ) ); + // Waterfall start + TO_SERVER.registerPacket( + net.md_5.bungee.protocol.packet.ClientChatAcknowledgement.class, + net.md_5.bungee.protocol.packet.ClientChatAcknowledgement::new, + map (ProtocolConstants.MINECRAFT_1_19_3, 0x3) + ); + // Waterfall end TO_SERVER.registerPacket( TabCompleteRequest.class, TabCompleteRequest::new, diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientChatAcknowledgement.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientChatAcknowledgement.java new file mode 100644 index 00000000..08ecf2a3 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientChatAcknowledgement.java @@ -0,0 +1,33 @@ +package net.md_5.bungee.protocol.packet; + +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.ProtocolConstants; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class ClientChatAcknowledgement extends DefinedPacket { + private int offset; + + @Override + public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { + this.offset = DefinedPacket.readVarInt(buf); + } + + @Override + public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { + DefinedPacket.writeVarInt(this.offset, buf); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception { + handler.handle(this); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientCommand.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientCommand.java index fb53ba74..f8e2db8d 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientCommand.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientCommand.java @@ -118,4 +118,9 @@ public class ClientCommand extends DefinedPacket { handler.handle( this ); } + + public boolean isSigned() { + if (salt == 0) return false; + return this.seenMessages != null && !this.seenMessages.getAcknowledged().isEmpty(); + } } diff --git a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java index 740c90ec..134a843f 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java @@ -196,16 +196,22 @@ public class UpstreamBridge extends PacketHandler @Override public void handle(ClientCommand command) throws Exception { - handleChat( "/" + command.getCommand() ); + handleChat( "/" + command.getCommand(), command, null ); // Waterfall } @Override public void handle(ClientCommandSigned command) throws Exception { - handleChat( "/" + command.getCommand() ); + handleChat( "/" + command.getCommand(), null, command ); // Waterfall } private String handleChat(String message) + { + // Waterfall start + return handleChat(message, null, null); + } + private String handleChat(String message, @javax.annotation.Nullable ClientCommand clientCommand, @javax.annotation.Nullable ClientCommandSigned clientCommandSigned) + // Waterfall end { for ( int index = 0, length = message.length(); index < length; index++ ) { @@ -224,7 +230,18 @@ public class UpstreamBridge extends PacketHandler if ( !chatEvent.isCommand() || !bungee.getPluginManager().dispatchCommand( con, message.substring( 1 ) ) ) { return message; + // Waterfall start - We're going to cancel this packet, so, no matter what, we might as well try to send this + } else if (clientCommand != null && clientCommand.isSigned() && clientCommand.getSeenMessages() != null) { + if (con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_19_3) { + con.getServer().unsafe().sendPacket(new net.md_5.bungee.protocol.packet.ClientChatAcknowledgement(clientCommand.getSeenMessages().getOffset())); + } + // and then for the new one + } else if (clientCommandSigned != null) { + if (con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_20_5) { + con.getServer().unsafe().sendPacket(new net.md_5.bungee.protocol.packet.ClientChatAcknowledgement(clientCommandSigned.getSeenMessages().getOffset())); + } } + // Waterfall end } throw CancelSendSignal.INSTANCE; } -- 2.44.0