Minecraft 1.19.1 support

This commit is contained in:
md_5 2022-07-28 04:00:00 +10:00
parent adc32d5a5c
commit 78ca16dfe3
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
14 changed files with 237 additions and 135 deletions

View File

@ -23,7 +23,6 @@ import net.md_5.bungee.protocol.packet.LoginPayloadResponse;
import net.md_5.bungee.protocol.packet.LoginRequest;
import net.md_5.bungee.protocol.packet.LoginSuccess;
import net.md_5.bungee.protocol.packet.PingPacket;
import net.md_5.bungee.protocol.packet.PlayerChat;
import net.md_5.bungee.protocol.packet.PlayerListHeaderFooter;
import net.md_5.bungee.protocol.packet.PlayerListItem;
import net.md_5.bungee.protocol.packet.PluginMessage;
@ -86,10 +85,6 @@ public abstract class AbstractPacketHandler
{
}
public void handle(PlayerChat chat) throws Exception
{
}
public void handle(SystemChat chat) throws Exception
{
}

View File

@ -0,0 +1,82 @@
package net.md_5.bungee.protocol;
import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class ChatChain extends DefinedPacket
{
private List<ChainLink> seen;
private List<ChainLink> received;
@Override
public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
{
seen = readLinks( buf );
if ( buf.readBoolean() )
{
received = readLinks( buf );
}
}
private static List<ChainLink> readLinks(ByteBuf buf)
{
int cnt = readVarInt( buf );
Preconditions.checkArgument( cnt <= 5, "Too many entries" );
List<ChainLink> chain = new LinkedList<>();
for ( int i = 0; i < cnt; i++ )
{
chain.add( new ChainLink( readUUID( buf ), readArray( buf ) ) );
}
return chain;
}
@Override
public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
{
writeLinks( seen, buf );
if ( received != null )
{
buf.writeBoolean( true );
writeLinks( received, buf );
} else
{
buf.writeBoolean( false );
}
}
private static void writeLinks(List<ChainLink> links, ByteBuf buf)
{
writeVarInt( links.size(), buf );
for ( ChainLink link : links )
{
writeUUID( link.sender, buf );
writeArray( link.signature, buf );
}
}
@Override
public void handle(AbstractPacketHandler handler) throws Exception
{
throw new UnsupportedOperationException( "Not supported." );
}
@Data
public static class ChainLink
{
private final UUID sender;
private final byte[] signature;
}
}

View File

@ -29,7 +29,6 @@ import net.md_5.bungee.protocol.packet.LoginPayloadResponse;
import net.md_5.bungee.protocol.packet.LoginRequest;
import net.md_5.bungee.protocol.packet.LoginSuccess;
import net.md_5.bungee.protocol.packet.PingPacket;
import net.md_5.bungee.protocol.packet.PlayerChat;
import net.md_5.bungee.protocol.packet.PlayerListHeaderFooter;
import net.md_5.bungee.protocol.packet.PlayerListItem;
import net.md_5.bungee.protocol.packet.PluginMessage;
@ -80,7 +79,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x20 ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x1F ),
map( ProtocolConstants.MINECRAFT_1_17, 0x21 ),
map( ProtocolConstants.MINECRAFT_1_19, 0x1E )
map( ProtocolConstants.MINECRAFT_1_19, 0x1E ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x20 )
);
TO_CLIENT.registerPacket(
Login.class,
@ -92,7 +92,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x25 ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x24 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x26 ),
map( ProtocolConstants.MINECRAFT_1_19, 0x23 )
map( ProtocolConstants.MINECRAFT_1_19, 0x23 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x25 )
);
TO_CLIENT.registerPacket( Chat.class,
Chat::new,
@ -117,7 +118,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x3A ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x39 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x3D ),
map( ProtocolConstants.MINECRAFT_1_19, 0x3B )
map( ProtocolConstants.MINECRAFT_1_19, 0x3B ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x3E )
);
TO_CLIENT.registerPacket(
BossBar.class,
@ -128,11 +130,6 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_17, 0x0D ),
map( ProtocolConstants.MINECRAFT_1_19, 0x0A )
);
TO_CLIENT.registerPacket(
PlayerChat.class,
PlayerChat::new,
map( ProtocolConstants.MINECRAFT_1_19, 0x30 )
);
TO_CLIENT.registerPacket(
PlayerListItem.class, // PlayerInfo
PlayerListItem::new,
@ -145,7 +142,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x33 ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x32 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x36 ),
map( ProtocolConstants.MINECRAFT_1_19, 0x34 )
map( ProtocolConstants.MINECRAFT_1_19, 0x34 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x37 )
);
TO_CLIENT.registerPacket(
TabCompleteResponse.class,
@ -169,7 +167,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_13, 0x45 ),
map( ProtocolConstants.MINECRAFT_1_14, 0x49 ),
map( ProtocolConstants.MINECRAFT_1_15, 0x4A ),
map( ProtocolConstants.MINECRAFT_1_17, 0x53 )
map( ProtocolConstants.MINECRAFT_1_17, 0x53 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x56 )
);
TO_CLIENT.registerPacket(
ScoreboardScore.class,
@ -181,7 +180,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_13, 0x48 ),
map( ProtocolConstants.MINECRAFT_1_14, 0x4C ),
map( ProtocolConstants.MINECRAFT_1_15, 0x4D ),
map( ProtocolConstants.MINECRAFT_1_17, 0x56 )
map( ProtocolConstants.MINECRAFT_1_17, 0x56 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x59 )
);
TO_CLIENT.registerPacket(
ScoreboardDisplay.class,
@ -193,7 +193,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_13, 0x3E ),
map( ProtocolConstants.MINECRAFT_1_14, 0x42 ),
map( ProtocolConstants.MINECRAFT_1_15, 0x43 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x4C )
map( ProtocolConstants.MINECRAFT_1_17, 0x4C ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x4F )
);
TO_CLIENT.registerPacket(
Team.class,
@ -205,7 +206,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_13, 0x47 ),
map( ProtocolConstants.MINECRAFT_1_14, 0x4B ),
map( ProtocolConstants.MINECRAFT_1_15, 0x4C ),
map( ProtocolConstants.MINECRAFT_1_17, 0x55 )
map( ProtocolConstants.MINECRAFT_1_17, 0x55 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x58 )
);
TO_CLIENT.registerPacket(
PluginMessage.class,
@ -218,7 +220,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x18 ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x17 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x18 ),
map( ProtocolConstants.MINECRAFT_1_19, 0x15 )
map( ProtocolConstants.MINECRAFT_1_19, 0x15 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x16 )
);
TO_CLIENT.registerPacket(
Kick.class,
@ -231,7 +234,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x1A ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x19 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x1A ),
map( ProtocolConstants.MINECRAFT_1_19, 0x17 )
map( ProtocolConstants.MINECRAFT_1_19, 0x17 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x19 )
);
TO_CLIENT.registerPacket(
Title.class,
@ -244,7 +248,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_15, 0x50 ),
map( ProtocolConstants.MINECRAFT_1_16, 0x4F ),
map( ProtocolConstants.MINECRAFT_1_17, 0x59 ),
map( ProtocolConstants.MINECRAFT_1_18, 0x5A )
map( ProtocolConstants.MINECRAFT_1_18, 0x5A ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x5D )
);
TO_CLIENT.registerPacket(
ClearTitles.class,
@ -256,18 +261,21 @@ public enum Protocol
Subtitle.class,
Subtitle::new,
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 )
);
TO_CLIENT.registerPacket(
TitleTimes.class,
TitleTimes::new,
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 )
);
TO_CLIENT.registerPacket(
SystemChat.class,
SystemChat::new,
map( ProtocolConstants.MINECRAFT_1_19, 0x5F )
map( ProtocolConstants.MINECRAFT_1_19, 0x5F ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x62 )
);
TO_CLIENT.registerPacket(
PlayerListHeaderFooter.class,
@ -283,7 +291,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x53 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x5E ),
map( ProtocolConstants.MINECRAFT_1_18, 0x5F ),
map( ProtocolConstants.MINECRAFT_1_19, 0x60 )
map( ProtocolConstants.MINECRAFT_1_19, 0x60 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x63 )
);
TO_CLIENT.registerPacket(
EntityStatus.class,
@ -296,7 +305,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x1B ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x1A ),
map( ProtocolConstants.MINECRAFT_1_17, 0x1B ),
map( ProtocolConstants.MINECRAFT_1_19, 0x18 )
map( ProtocolConstants.MINECRAFT_1_19, 0x18 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x1A )
);
TO_CLIENT.registerPacket(
Commands.class,
@ -315,7 +325,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_16, 0x1E ),
map( ProtocolConstants.MINECRAFT_1_16_2, 0x1D ),
map( ProtocolConstants.MINECRAFT_1_17, 0x1E ),
map( ProtocolConstants.MINECRAFT_1_19, 0x1B )
map( ProtocolConstants.MINECRAFT_1_19, 0x1B ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x1D )
);
TO_CLIENT.registerPacket(
ViewDistance.class,
@ -324,7 +335,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_15, 0x42 ),
map( ProtocolConstants.MINECRAFT_1_16, 0x41 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x4A ),
map( ProtocolConstants.MINECRAFT_1_19, 0x49 )
map( ProtocolConstants.MINECRAFT_1_19, 0x49 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x4C )
);
TO_SERVER.registerPacket(
@ -338,7 +350,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_14, 0x0F ),
map( ProtocolConstants.MINECRAFT_1_16, 0x10 ),
map( ProtocolConstants.MINECRAFT_1_17, 0x0F ),
map( ProtocolConstants.MINECRAFT_1_19, 0x11 )
map( ProtocolConstants.MINECRAFT_1_19, 0x11 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x12 )
);
TO_SERVER.registerPacket( Chat.class,
Chat::new,
@ -352,12 +365,14 @@ public enum Protocol
TO_SERVER.registerPacket(
ClientCommand.class,
ClientCommand::new,
map( ProtocolConstants.MINECRAFT_1_19, 0x03 )
map( ProtocolConstants.MINECRAFT_1_19, 0x03 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x04 )
);
TO_SERVER.registerPacket(
ClientChat.class,
ClientChat::new,
map( ProtocolConstants.MINECRAFT_1_19, 0x04 )
map( ProtocolConstants.MINECRAFT_1_19, 0x04 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x05 )
);
TO_SERVER.registerPacket(
TabCompleteRequest.class,
@ -368,7 +383,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_12_1, 0x01 ),
map( ProtocolConstants.MINECRAFT_1_13, 0x05 ),
map( ProtocolConstants.MINECRAFT_1_14, 0x06 ),
map( ProtocolConstants.MINECRAFT_1_19, 0x08 )
map( ProtocolConstants.MINECRAFT_1_19, 0x08 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x09 )
);
TO_SERVER.registerPacket(
ClientSettings.class,
@ -378,7 +394,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_12, 0x05 ),
map( ProtocolConstants.MINECRAFT_1_12_1, 0x04 ),
map( ProtocolConstants.MINECRAFT_1_14, 0x05 ),
map( ProtocolConstants.MINECRAFT_1_19, 0x07 )
map( ProtocolConstants.MINECRAFT_1_19, 0x07 ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x08 )
);
TO_SERVER.registerPacket(
PluginMessage.class,
@ -390,7 +407,8 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_13, 0x0A ),
map( ProtocolConstants.MINECRAFT_1_14, 0x0B ),
map( ProtocolConstants.MINECRAFT_1_17, 0x0A ),
map( ProtocolConstants.MINECRAFT_1_19, 0x0C )
map( ProtocolConstants.MINECRAFT_1_19, 0x0C ),
map( ProtocolConstants.MINECRAFT_1_19_1, 0x0D )
);
}
},

View File

@ -39,6 +39,7 @@ public class ProtocolConstants
public static final int MINECRAFT_1_18 = 757;
public static final int MINECRAFT_1_18_2 = 758;
public static final int MINECRAFT_1_19 = 759;
public static final int MINECRAFT_1_19_1 = 760;
public static final List<String> SUPPORTED_VERSIONS;
public static final List<Integer> SUPPORTED_VERSION_IDS;
@ -90,7 +91,8 @@ public class ProtocolConstants
ProtocolConstants.MINECRAFT_1_17_1,
ProtocolConstants.MINECRAFT_1_18,
ProtocolConstants.MINECRAFT_1_18_2,
ProtocolConstants.MINECRAFT_1_19
ProtocolConstants.MINECRAFT_1_19,
ProtocolConstants.MINECRAFT_1_19_1
);
if ( SNAPSHOT_SUPPORT )

View File

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import net.md_5.bungee.protocol.AbstractPacketHandler;
import net.md_5.bungee.protocol.ChatChain;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.ProtocolConstants;
@ -21,6 +22,7 @@ public class ClientChat extends DefinedPacket
private long salt;
private byte[] signature;
private boolean signedPreview;
private ChatChain chain;
@Override
public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
@ -30,6 +32,11 @@ public class ClientChat extends DefinedPacket
salt = buf.readLong();
signature = readArray( buf );
signedPreview = buf.readBoolean();
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_19_1 )
{
chain = new ChatChain();
chain.read( buf, direction, protocolVersion );
}
}
@Override
@ -40,6 +47,10 @@ public class ClientChat extends DefinedPacket
buf.writeLong( salt );
writeArray( signature, buf );
buf.writeBoolean( signedPreview );
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_19_1 )
{
chain.write( buf );
}
}
@Override

View File

@ -9,6 +9,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import net.md_5.bungee.protocol.AbstractPacketHandler;
import net.md_5.bungee.protocol.ChatChain;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.ProtocolConstants;
@ -24,6 +25,7 @@ public class ClientCommand extends DefinedPacket
private long salt;
private Map<String, byte[]> signatures;
private boolean signedPreview;
private ChatChain chain;
@Override
public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
@ -41,6 +43,11 @@ public class ClientCommand extends DefinedPacket
}
signedPreview = buf.readBoolean();
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_19_1 )
{
chain = new ChatChain();
chain.read( buf, direction, protocolVersion );
}
}
@Override
@ -58,6 +65,10 @@ public class ClientCommand extends DefinedPacket
}
buf.writeBoolean( signedPreview );
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_19_1 )
{
chain.write( buf );
}
}
@Override

View File

@ -1,6 +1,7 @@
package net.md_5.bungee.protocol.packet;
import io.netty.buffer.ByteBuf;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -19,6 +20,7 @@ public class LoginRequest extends DefinedPacket
private String data;
private PlayerPublicKey publicKey;
private UUID uuid;
@Override
public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
@ -28,6 +30,13 @@ public class LoginRequest extends DefinedPacket
{
publicKey = readPublicKey( buf );
}
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_19_1 )
{
if ( buf.readBoolean() )
{
uuid = readUUID( buf );
}
}
}
@Override
@ -38,6 +47,17 @@ public class LoginRequest extends DefinedPacket
{
writePublicKey( publicKey, buf );
}
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_19_1 )
{
if ( uuid != null )
{
buf.writeBoolean( true );
writeUUID( uuid, buf );
} else
{
buf.writeBoolean( false );
}
}
}
@Override

View File

@ -1,84 +0,0 @@
package net.md_5.bungee.protocol.packet;
import io.netty.buffer.ByteBuf;
import java.util.UUID;
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 PlayerChat extends DefinedPacket
{
private static final UUID EMPTY_UUID = new UUID( 0L, 0L );
private String signedContent;
private String unsignedContent; // nullable
private UUID sender;
private int typeId;
private String displayName;
private String teamName; // nullable
private long timestamp;
private long salt;
private byte[] signature;
@Override
public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
{
signedContent = readString( buf, 262144 );
if ( buf.readBoolean() )
{
unsignedContent = readString( buf, 262144 );
}
typeId = readVarInt( buf );
sender = readUUID( buf );
displayName = readString( buf, 262144 );
if ( buf.readBoolean() )
{
teamName = readString( buf, 262144 );
}
timestamp = buf.readLong();
salt = buf.readLong();
signature = readArray( buf );
}
@Override
public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
{
writeString( signedContent, buf );
if ( unsignedContent != null )
{
buf.writeBoolean( true );
writeString( unsignedContent, buf );
} else
{
buf.writeBoolean( false );
}
writeVarInt( typeId, buf );
writeUUID( sender, buf );
writeString( displayName, buf );
if ( teamName != null )
{
buf.writeBoolean( true );
writeString( teamName, buf );
} else
{
buf.writeBoolean( false );
}
buf.writeLong( timestamp );
buf.writeLong( salt );
writeArray( signature, buf );
}
@Override
public void handle(AbstractPacketHandler handler) throws Exception
{
handler.handle( this );
}
}

View File

@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.protocol.AbstractPacketHandler;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.ProtocolConstants;
@ -23,14 +24,20 @@ public class SystemChat extends DefinedPacket
public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
{
message = readString( buf, 262144 );
position = readVarInt( buf );
position = ( protocolVersion >= ProtocolConstants.MINECRAFT_1_19_1 ) ? ( ( buf.readBoolean() ) ? ChatMessageType.ACTION_BAR.ordinal() : 0 ) : readVarInt( buf );
}
@Override
public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
{
writeString( message, buf );
writeVarInt( position, buf );
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_19_1 )
{
buf.writeBoolean( position == ChatMessageType.ACTION_BAR.ordinal() );
} else
{
writeVarInt( position, buf );
}
}
@Override

View File

@ -3,6 +3,8 @@ package net.md_5.bungee;
import com.google.common.io.ByteStreams;
import com.google.common.primitives.Longs;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.Key;
@ -17,6 +19,7 @@ import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.Base64;
import java.util.Random;
import java.util.UUID;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
@ -73,12 +76,23 @@ public class EncryptionUtil
return new EncryptionRequest( hash, pubKey, verify );
}
public static boolean check(PlayerPublicKey publicKey) throws GeneralSecurityException
public static boolean check(PlayerPublicKey publicKey, UUID uuid) throws GeneralSecurityException
{
Signature signature = Signature.getInstance( "SHA1withRSA" );
signature.initVerify( MOJANG_KEY );
signature.update( ( publicKey.getExpiry() + "-----BEGIN RSA PUBLIC KEY-----\n" + MIME_ENCODER.encodeToString( getPubkey( publicKey.getKey() ).getEncoded() ) + "\n-----END RSA PUBLIC KEY-----\n" ).getBytes( StandardCharsets.US_ASCII ) );
byte[] check;
if ( uuid != null )
{
byte[] encoded = getPubkey( publicKey.getKey() ).getEncoded();
check = new byte[ 24 + encoded.length ];
ByteBuffer.wrap( check ).order( ByteOrder.BIG_ENDIAN ).putLong( uuid.getMostSignificantBits() ).putLong( uuid.getLeastSignificantBits() ).putLong( publicKey.getExpiry() ).put( encoded );
} else
{
check = ( publicKey.getExpiry() + "-----BEGIN RSA PUBLIC KEY-----\n" + MIME_ENCODER.encodeToString( getPubkey( publicKey.getKey() ).getEncoded() ) + "\n-----END RSA PUBLIC KEY-----\n" ).getBytes( StandardCharsets.US_ASCII );
}
signature.update( check );
return signature.verify( publicKey.getSignature() );
}

View File

@ -123,7 +123,7 @@ public class ServerConnector extends PacketHandler
channel.write( copiedHandshake );
channel.setProtocol( Protocol.LOGIN );
channel.write( new LoginRequest( user.getName(), null ) );
channel.write( new LoginRequest( user.getName(), null, user.getUniqueId() ) );
}
@Override

View File

@ -8,6 +8,7 @@ import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.time.Instant;
import java.util.HashSet;
@ -396,10 +397,13 @@ public class InitialHandler extends PacketHandler implements PendingConnection
return;
}
if ( !EncryptionUtil.check( publicKey ) )
if ( getVersion() < ProtocolConstants.MINECRAFT_1_19_1 )
{
disconnect( bungee.getTranslation( "secure_profile_invalid" ) );
return;
if ( !EncryptionUtil.check( publicKey, null ) )
{
disconnect( bungee.getTranslation( "secure_profile_invalid" ) );
return;
}
}
}
@ -509,6 +513,32 @@ public class InitialHandler extends PacketHandler implements PendingConnection
private void finish()
{
offlineId = UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + getName() ).getBytes( Charsets.UTF_8 ) );
if ( uniqueId == null )
{
uniqueId = offlineId;
}
if ( BungeeCord.getInstance().config.isEnforceSecureProfile() )
{
if ( getVersion() >= ProtocolConstants.MINECRAFT_1_19_1 )
{
boolean secure = false;
try
{
secure = EncryptionUtil.check( loginRequest.getPublicKey(), uniqueId );
} catch ( GeneralSecurityException ex )
{
}
if ( !secure )
{
disconnect( bungee.getTranslation( "secure_profile_invalid" ) );
return;
}
}
}
if ( isOnlineMode() )
{
// Check for multiple connections
@ -539,12 +569,6 @@ public class InitialHandler extends PacketHandler implements PendingConnection
}
offlineId = UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + getName() ).getBytes( Charsets.UTF_8 ) );
if ( uniqueId == null )
{
uniqueId = offlineId;
}
Callback<LoginEvent> complete = new Callback<LoginEvent>()
{
@Override

View File

@ -76,6 +76,8 @@ public abstract class EntityMap
return EntityMap_1_16_2.INSTANCE_1_18;
case ProtocolConstants.MINECRAFT_1_19:
return EntityMap_1_16_2.INSTANCE_1_19;
case ProtocolConstants.MINECRAFT_1_19_1:
return EntityMap_1_16_2.INSTANCE_1_19_1;
}
throw new RuntimeException( "Version " + version + " has no entity map" );
}

View File

@ -18,7 +18,7 @@ class EntityMap_1_16_2 extends EntityMap
static final EntityMap_1_16_2 INSTANCE_1_17 = new EntityMap_1_16_2( 0x04, 0x2D );
static final EntityMap_1_16_2 INSTANCE_1_18 = new EntityMap_1_16_2( 0x04, 0x2D );
static final EntityMap_1_16_2 INSTANCE_1_19 = new EntityMap_1_16_2( 0x02, 0x2F );
static final EntityMap_1_16_2 INSTANCE_1_19_1 = new EntityMap_1_16_2( 0x02, 0x30 );
//
private final int spawnPlayerId;
private final int spectateId;