From e33e8b542bb23fa0bd4e927b2d37461e0189261f Mon Sep 17 00:00:00 2001 From: OurLobanov Date: Mon, 24 Jun 2024 18:32:06 +0300 Subject: [PATCH] TextPacket limits in the protocol --- .../geyser/network/CodecProcessor.java | 48 +++++++++++++++++++ .../bedrock/BedrockTextTranslator.java | 13 ----- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java index 74e3e2405..e2e651f58 100644 --- a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java +++ b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java @@ -38,10 +38,12 @@ import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventoryContentS import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventorySlotSerializer_v407; import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.ItemStackRequestSerializer_v407; import org.cloudburstmc.protocol.bedrock.codec.v486.serializer.BossEventSerializer_v486; +import org.cloudburstmc.protocol.bedrock.codec.v554.serializer.TextSerializer_v554; import org.cloudburstmc.protocol.bedrock.codec.v557.serializer.SetEntityDataSerializer_v557; import org.cloudburstmc.protocol.bedrock.codec.v567.serializer.CommandRequestSerializer_v567; import org.cloudburstmc.protocol.bedrock.codec.v630.serializer.SetPlayerInventoryOptionsSerializer_v360; import org.cloudburstmc.protocol.bedrock.codec.v662.serializer.SetEntityMotionSerializer_v662; +import org.cloudburstmc.protocol.bedrock.codec.v685.serializer.TextSerializer_v685; import org.cloudburstmc.protocol.bedrock.data.inventory.InventoryLayout; import org.cloudburstmc.protocol.bedrock.data.inventory.InventoryTabLeft; import org.cloudburstmc.protocol.bedrock.data.inventory.InventoryTabRight; @@ -143,6 +145,47 @@ class CodecProcessor { } }; + private static final BedrockPacketSerializer TEXT_SERIALIZER_V554 = new TextSerializer_v554() { + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { + TextPacket.Type type = TextPacket.Type.values()[buffer.readUnsignedByte()]; + packet.setType(type); + packet.setNeedsTranslation(buffer.readBoolean()); + + if (type == TextPacket.Type.CHAT) { + packet.setSourceName(helper.readString(buffer)); + //The client does not send more than 512 characters, and we do not need to decode other TextPacket.Type + packet.setMessage(helper.readStringMaxLen(buffer, 513)); + } else { + throw new IllegalArgumentException("Unsupported TextType " + type); + } + + packet.setXuid(helper.readString(buffer)); + packet.setPlatformChatId(helper.readString(buffer)); + } + }; + + private static final BedrockPacketSerializer TEXT_SERIALIZER = new TextSerializer_v685() { + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, TextPacket packet) { + TextPacket.Type type = TextPacket.Type.values()[buffer.readUnsignedByte()]; + packet.setType(type); + packet.setNeedsTranslation(buffer.readBoolean()); + + if (type == TextPacket.Type.CHAT) { + packet.setSourceName(helper.readString(buffer)); + //The client does not send more than 512 characters, and we do not need to decode other TextPacket.Type + packet.setMessage(helper.readStringMaxLen(buffer, 513)); + } else { + throw new IllegalArgumentException("Unsupported TextType " + type); + } + + packet.setXuid(helper.readString(buffer)); + packet.setPlatformChatId(helper.readString(buffer)); + packet.setFilteredMessage(helper.readString(buffer)); + } + }; + /** * Serializer that does nothing when trying to deserialize BossEventPacket since it is not used from the client. */ @@ -282,6 +325,11 @@ class CodecProcessor { codecBuilder.updateSerializer(CommandRequestPacket.class, COMMAND_REQUEST_SERIALIZER); codecBuilder.updateSerializer(SetPlayerInventoryOptionsPacket.class, SET_PLAYER_INVENTORY_OPTIONS_SERIALIZER); + if (codec.getProtocolVersion() >= 685) { + codecBuilder.updateSerializer(TextPacket.class, TEXT_SERIALIZER); + } else { + codecBuilder.updateSerializer(TextPacket.class, TEXT_SERIALIZER_V554); + } return codecBuilder.build(); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockTextTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockTextTranslator.java index 6e657695b..961180400 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockTextTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockTextTranslator.java @@ -37,20 +37,7 @@ public class BedrockTextTranslator extends PacketTranslator { @Override public void translate(GeyserSession session, TextPacket packet) { - if (!(packet.getParameters().isEmpty())) { - // I don't know if the client sends something there on 1.1.5, the client doesn't send anything like that - // Add yourself for this text if you need it - session.disconnect(GeyserLocale.getPlayerLocaleString("geyser.chat.parameters", session.locale(), packet.getParameters().size())); - return; - } - String message = packet.getMessage(); - if (message.length() > 512) { - // A legitimate player cannot send more than 512 characters - // This is necessary so that the conversion to plain text is not clogged - session.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.chat.too_long", session.locale(), message.length())); - return; - } // Java trims all messages, and then checks for the leading slash message = MessageTranslator.convertToPlainText(