mirror of
https://github.com/Minestom/Minestom.git
synced 2024-12-31 21:48:08 +01:00
Added buffer length check in DynamicChunk#readChunk
This commit is contained in:
parent
d2eff4abbc
commit
70e047e6ee
@ -6,6 +6,7 @@ import net.minestom.server.chat.ColoredText;
|
|||||||
import net.minestom.server.network.ConnectionState;
|
import net.minestom.server.network.ConnectionState;
|
||||||
import net.minestom.server.network.packet.client.ClientPreplayPacket;
|
import net.minestom.server.network.packet.client.ClientPreplayPacket;
|
||||||
import net.minestom.server.network.packet.server.login.LoginDisconnect;
|
import net.minestom.server.network.packet.server.login.LoginDisconnect;
|
||||||
|
import net.minestom.server.network.player.NettyPlayerConnection;
|
||||||
import net.minestom.server.network.player.PlayerConnection;
|
import net.minestom.server.network.player.PlayerConnection;
|
||||||
import net.minestom.server.utils.binary.BinaryReader;
|
import net.minestom.server.utils.binary.BinaryReader;
|
||||||
|
|
||||||
@ -36,8 +37,15 @@ public class HandshakePacket implements ClientPreplayPacket {
|
|||||||
connection.setConnectionState(ConnectionState.STATUS);
|
connection.setConnectionState(ConnectionState.STATUS);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
connection.setConnectionState(ConnectionState.LOGIN);
|
if (protocolVersion == MinecraftServer.PROTOCOL_VERSION) {
|
||||||
if (protocolVersion != MinecraftServer.PROTOCOL_VERSION) {
|
connection.setConnectionState(ConnectionState.LOGIN);
|
||||||
|
|
||||||
|
if (connection instanceof NettyPlayerConnection) {
|
||||||
|
// Give to the connection the server info that the client used
|
||||||
|
((NettyPlayerConnection) connection).refreshServerInformation(serverAddress, serverPort);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Incorrect client version
|
||||||
connection.sendPacket(new LoginDisconnect(INVALID_VERSION_TEXT.toString()));
|
connection.sendPacket(new LoginDisconnect(INVALID_VERSION_TEXT.toString()));
|
||||||
connection.disconnect();
|
connection.disconnect();
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import net.minestom.server.extras.mojangAuth.MojangCrypt;
|
|||||||
import net.minestom.server.network.netty.codec.PacketCompressor;
|
import net.minestom.server.network.netty.codec.PacketCompressor;
|
||||||
import net.minestom.server.network.packet.server.ServerPacket;
|
import net.minestom.server.network.packet.server.ServerPacket;
|
||||||
import net.minestom.server.network.packet.server.login.SetCompressionPacket;
|
import net.minestom.server.network.packet.server.login.SetCompressionPacket;
|
||||||
|
import net.minestom.server.utils.validate.Check;
|
||||||
|
|
||||||
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKey;
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
@ -27,12 +28,22 @@ public class NettyPlayerConnection extends PlayerConnection {
|
|||||||
@Getter
|
@Getter
|
||||||
private boolean compressed = false;
|
private boolean compressed = false;
|
||||||
|
|
||||||
|
private String serverAddress;
|
||||||
|
private int serverPort;
|
||||||
|
|
||||||
public NettyPlayerConnection(SocketChannel channel) {
|
public NettyPlayerConnection(SocketChannel channel) {
|
||||||
super();
|
super();
|
||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the encryption key and add the channels to the pipeline.
|
||||||
|
*
|
||||||
|
* @param secretKey the secret key to use in the encryption
|
||||||
|
* @throws IllegalStateException if encryption is already enabled for this connection
|
||||||
|
*/
|
||||||
public void setEncryptionKey(SecretKey secretKey) {
|
public void setEncryptionKey(SecretKey secretKey) {
|
||||||
|
Check.stateCondition(encrypted, "Encryption is already enabled!");
|
||||||
this.encrypted = true;
|
this.encrypted = true;
|
||||||
getChannel().pipeline().addBefore("framer", "decrypt", new Decrypter(MojangCrypt.getCipher(2, secretKey)));
|
getChannel().pipeline().addBefore("framer", "decrypt", new Decrypter(MojangCrypt.getCipher(2, secretKey)));
|
||||||
getChannel().pipeline().addBefore("framer", "encrypt", new Encrypter(MojangCrypt.getCipher(1, secretKey)));
|
getChannel().pipeline().addBefore("framer", "encrypt", new Encrypter(MojangCrypt.getCipher(1, secretKey)));
|
||||||
@ -93,4 +104,36 @@ public class NettyPlayerConnection extends PlayerConnection {
|
|||||||
return channel;
|
return channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the server address that the client used to connect.
|
||||||
|
* <p>
|
||||||
|
* WARNING: it is given by the client, it is possible for it to be wrong.
|
||||||
|
*
|
||||||
|
* @return the server address used
|
||||||
|
*/
|
||||||
|
public String getServerAddress() {
|
||||||
|
return serverAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the server port that the client used to connect.
|
||||||
|
* <p>
|
||||||
|
* WARNING: it is given by the client, it is possible for it to be wrong.
|
||||||
|
*
|
||||||
|
* @return the server port used
|
||||||
|
*/
|
||||||
|
public int getServerPort() {
|
||||||
|
return serverPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used in {@link net.minestom.server.network.packet.client.handshake.HandshakePacket} to change the internal fields.
|
||||||
|
*
|
||||||
|
* @param serverAddress the server address which the client used
|
||||||
|
* @param serverPort the server port which the client used
|
||||||
|
*/
|
||||||
|
public void refreshServerInformation(String serverAddress, int serverPort) {
|
||||||
|
this.serverAddress = serverAddress;
|
||||||
|
this.serverPort = serverPort;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user