#3808: Do not decode packets that we don't handle

This commit is contained in:
Outfluencer 2025-06-28 10:36:23 +10:00 committed by md_5
parent 5e59b6dc85
commit bdd32d5a58
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
3 changed files with 57 additions and 45 deletions

View File

@ -8,7 +8,6 @@ import net.md_5.bungee.protocol.packet.ClearTitles;
import net.md_5.bungee.protocol.packet.ClientChat; import net.md_5.bungee.protocol.packet.ClientChat;
import net.md_5.bungee.protocol.packet.ClientCommand; import net.md_5.bungee.protocol.packet.ClientCommand;
import net.md_5.bungee.protocol.packet.ClientSettings; import net.md_5.bungee.protocol.packet.ClientSettings;
import net.md_5.bungee.protocol.packet.ClientStatus;
import net.md_5.bungee.protocol.packet.Commands; import net.md_5.bungee.protocol.packet.Commands;
import net.md_5.bungee.protocol.packet.CookieRequest; import net.md_5.bungee.protocol.packet.CookieRequest;
import net.md_5.bungee.protocol.packet.CookieResponse; import net.md_5.bungee.protocol.packet.CookieResponse;
@ -128,10 +127,6 @@ public abstract class AbstractPacketHandler
{ {
} }
public void handle(ClientStatus clientStatus) throws Exception
{
}
public void handle(PlayerListItem playerListItem) throws Exception public void handle(PlayerListItem playerListItem) throws Exception
{ {
} }

View File

@ -131,7 +131,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_21_2, 0x2C ), map( ProtocolConstants.MINECRAFT_1_21_2, 0x2C ),
map( ProtocolConstants.MINECRAFT_1_21_5, 0x2B ) map( ProtocolConstants.MINECRAFT_1_21_5, 0x2B )
); );
TO_CLIENT.registerPacket( Chat.class, TO_CLIENT.registerPacket(
Chat.class,
Chat::new, Chat::new,
map( ProtocolConstants.MINECRAFT_1_8, 0x02 ), map( ProtocolConstants.MINECRAFT_1_8, 0x02 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x0F ), map( ProtocolConstants.MINECRAFT_1_9, 0x0F ),
@ -337,6 +338,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
Title.class, Title.class,
Title::new, Title::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_8, 0x45 ), map( ProtocolConstants.MINECRAFT_1_8, 0x45 ),
map( ProtocolConstants.MINECRAFT_1_12, 0x47 ), map( ProtocolConstants.MINECRAFT_1_12, 0x47 ),
map( ProtocolConstants.MINECRAFT_1_12_1, 0x48 ), map( ProtocolConstants.MINECRAFT_1_12_1, 0x48 ),
@ -358,6 +360,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
ClearTitles.class, ClearTitles.class,
ClearTitles::new, ClearTitles::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_17, 0x10 ), map( ProtocolConstants.MINECRAFT_1_17, 0x10 ),
map( ProtocolConstants.MINECRAFT_1_19, 0x0D ), map( ProtocolConstants.MINECRAFT_1_19, 0x0D ),
map( ProtocolConstants.MINECRAFT_1_19_3, 0x0C ), map( ProtocolConstants.MINECRAFT_1_19_3, 0x0C ),
@ -368,6 +371,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
Subtitle.class, Subtitle.class,
Subtitle::new, Subtitle::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_17, 0x57 ), map( ProtocolConstants.MINECRAFT_1_17, 0x57 ),
map( ProtocolConstants.MINECRAFT_1_18, 0x58 ), map( ProtocolConstants.MINECRAFT_1_18, 0x58 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x5B ), map( ProtocolConstants.MINECRAFT_1_19_1, 0x5B ),
@ -382,6 +386,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
TitleTimes.class, TitleTimes.class,
TitleTimes::new, TitleTimes::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_17, 0x5A ), map( ProtocolConstants.MINECRAFT_1_17, 0x5A ),
map( ProtocolConstants.MINECRAFT_1_18, 0x5B ), map( ProtocolConstants.MINECRAFT_1_18, 0x5B ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x5E ), map( ProtocolConstants.MINECRAFT_1_19_1, 0x5E ),
@ -396,6 +401,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
SystemChat.class, SystemChat.class,
SystemChat::new, SystemChat::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_19, 0x5F ), map( ProtocolConstants.MINECRAFT_1_19, 0x5F ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x62 ), map( ProtocolConstants.MINECRAFT_1_19_1, 0x62 ),
map( ProtocolConstants.MINECRAFT_1_19_3, 0x60 ), map( ProtocolConstants.MINECRAFT_1_19_3, 0x60 ),
@ -409,6 +415,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
PlayerListHeaderFooter.class, PlayerListHeaderFooter.class,
PlayerListHeaderFooter::new, PlayerListHeaderFooter::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_8, 0x47 ), map( ProtocolConstants.MINECRAFT_1_8, 0x47 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x48 ), map( ProtocolConstants.MINECRAFT_1_9, 0x48 ),
map( ProtocolConstants.MINECRAFT_1_9_4, 0x47 ), map( ProtocolConstants.MINECRAFT_1_9_4, 0x47 ),
@ -433,6 +440,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
EntityStatus.class, EntityStatus.class,
EntityStatus::new, EntityStatus::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_8, 0x1A ), map( ProtocolConstants.MINECRAFT_1_8, 0x1A ),
map( ProtocolConstants.MINECRAFT_1_9, 0x1B ), map( ProtocolConstants.MINECRAFT_1_9, 0x1B ),
map( ProtocolConstants.MINECRAFT_1_13, 0x1C ), map( ProtocolConstants.MINECRAFT_1_13, 0x1C ),
@ -466,6 +474,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
GameState.class, GameState.class,
GameState::new, GameState::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_15, 0x1F ), map( ProtocolConstants.MINECRAFT_1_15, 0x1F ),
map( ProtocolConstants.MINECRAFT_1_16, 0x1E ), map( ProtocolConstants.MINECRAFT_1_16, 0x1E ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x1D ), map( ProtocolConstants.MINECRAFT_1_16_2, 0x1D ),
@ -482,6 +491,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
ViewDistance.class, ViewDistance.class,
ViewDistance::new, ViewDistance::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_14, 0x41 ), map( ProtocolConstants.MINECRAFT_1_14, 0x41 ),
map( ProtocolConstants.MINECRAFT_1_15, 0x42 ), map( ProtocolConstants.MINECRAFT_1_15, 0x42 ),
map( ProtocolConstants.MINECRAFT_1_16, 0x41 ), map( ProtocolConstants.MINECRAFT_1_16, 0x41 ),
@ -547,6 +557,7 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
StoreCookie.class, StoreCookie.class,
StoreCookie::new, StoreCookie::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_20_5, 0x6B ), map( ProtocolConstants.MINECRAFT_1_20_5, 0x6B ),
map( ProtocolConstants.MINECRAFT_1_21_2, 0x72 ), map( ProtocolConstants.MINECRAFT_1_21_2, 0x72 ),
map( ProtocolConstants.MINECRAFT_1_21_5, 0x71 ) map( ProtocolConstants.MINECRAFT_1_21_5, 0x71 )
@ -554,29 +565,34 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
Transfer.class, Transfer.class,
Transfer::new, Transfer::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_20_5, 0x73 ), map( ProtocolConstants.MINECRAFT_1_20_5, 0x73 ),
map( ProtocolConstants.MINECRAFT_1_21_2, 0x7A ) map( ProtocolConstants.MINECRAFT_1_21_2, 0x7A )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
DisconnectReportDetails.class, DisconnectReportDetails.class,
DisconnectReportDetails::new, DisconnectReportDetails::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_21, 0x7A ), map( ProtocolConstants.MINECRAFT_1_21, 0x7A ),
map( ProtocolConstants.MINECRAFT_1_21_2, 0x81 ) map( ProtocolConstants.MINECRAFT_1_21_2, 0x81 )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
ServerLinks.class, ServerLinks.class,
ServerLinks::new, ServerLinks::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_21, 0x7B ), map( ProtocolConstants.MINECRAFT_1_21, 0x7B ),
map( ProtocolConstants.MINECRAFT_1_21_2, 0x82 ) map( ProtocolConstants.MINECRAFT_1_21_2, 0x82 )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
ClearDialog.class, ClearDialog.class,
ClearDialog::new, ClearDialog::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_21_6, 0x84 ) map( ProtocolConstants.MINECRAFT_1_21_6, 0x84 )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
ShowDialog.class, ShowDialog.class,
ShowDialog::new, ShowDialog::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_21_6, 0x85 ) map( ProtocolConstants.MINECRAFT_1_21_6, 0x85 )
); );
@ -841,31 +857,37 @@ public enum Protocol
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
StoreCookie.class, StoreCookie.class,
StoreCookie::new, StoreCookie::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_20_5, 0x0A ) map( ProtocolConstants.MINECRAFT_1_20_5, 0x0A )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
Transfer.class, Transfer.class,
Transfer::new, Transfer::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_20_5, 0x0B ) map( ProtocolConstants.MINECRAFT_1_20_5, 0x0B )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
DisconnectReportDetails.class, DisconnectReportDetails.class,
DisconnectReportDetails::new, DisconnectReportDetails::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_21, 0x0F ) map( ProtocolConstants.MINECRAFT_1_21, 0x0F )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
ServerLinks.class, ServerLinks.class,
ServerLinks::new, ServerLinks::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_21, 0x10 ) map( ProtocolConstants.MINECRAFT_1_21, 0x10 )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
ClearDialog.class, ClearDialog.class,
ClearDialog::new, ClearDialog::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_21_6, 0x11 ) map( ProtocolConstants.MINECRAFT_1_21_6, 0x11 )
); );
TO_CLIENT.registerPacket( TO_CLIENT.registerPacket(
ShowDialogDirect.class, ShowDialogDirect.class,
ShowDialogDirect::new, ShowDialogDirect::new,
RegisterType.ENCODE,
map( ProtocolConstants.MINECRAFT_1_21_6, 0x12 ) map( ProtocolConstants.MINECRAFT_1_21_6, 0x12 )
); );
@ -957,6 +979,26 @@ public enum Protocol
private final int packetID; private final int packetID;
} }
private enum RegisterType
{
// packet is registered to be encoded (only sent, never handled)
ENCODE,
// packet is registered to be decoded (only handled never modified)
DECODE,
// packet is registered to be both, encoded and decoded
BOTH;
public boolean encode()
{
return this == BOTH || this == ENCODE;
}
public boolean decode()
{
return this == BOTH || this == DECODE;
}
}
// Helper method // Helper method
private static ProtocolMapping map(int protocol, int id) private static ProtocolMapping map(int protocol, int id)
{ {
@ -1010,6 +1052,11 @@ public enum Protocol
} }
private void registerPacket(Class<? extends DefinedPacket> packetClass, Supplier<? extends DefinedPacket> constructor, ProtocolMapping... mappings) private void registerPacket(Class<? extends DefinedPacket> packetClass, Supplier<? extends DefinedPacket> constructor, ProtocolMapping... mappings)
{
registerPacket( packetClass, constructor, RegisterType.BOTH, mappings );
}
private void registerPacket(Class<? extends DefinedPacket> packetClass, Supplier<? extends DefinedPacket> constructor, RegisterType registerType, ProtocolMapping... mappings)
{ {
int mappingIndex = 0; int mappingIndex = 0;
ProtocolMapping mapping = mappings[mappingIndex]; ProtocolMapping mapping = mappings[mappingIndex];
@ -1042,9 +1089,16 @@ public enum Protocol
ProtocolData data = protocols.get( protocol ); ProtocolData data = protocols.get( protocol );
Preconditions.checkState( data.packetConstructors[mapping.packetID] == null, "Duplicate packet mapping (%s)", mapping.packetID ); Preconditions.checkState( data.packetConstructors[mapping.packetID] == null, "Duplicate packet mapping (%s)", mapping.packetID );
Preconditions.checkState( !data.packetMap.containsKey( packetClass ), "Duplicate packet mapping (%s)", mapping.packetID );
data.packetMap.put( packetClass, mapping.packetID ); if ( registerType.encode() )
data.packetConstructors[mapping.packetID] = constructor; {
data.packetMap.put( packetClass, mapping.packetID );
}
if ( registerType.decode() )
{
data.packetConstructors[mapping.packetID] = constructor;
}
} }
} }

View File

@ -1,37 +0,0 @@
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;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class ClientStatus extends DefinedPacket
{
private byte payload;
@Override
public void read(ByteBuf buf)
{
payload = buf.readByte();
}
@Override
public void write(ByteBuf buf)
{
buf.writeByte( payload );
}
@Override
public void handle(AbstractPacketHandler handler) throws Exception
{
handler.handle( this );
}
}