Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-11-17 05:20:14 +01:00
Detect and block connections to online-mode servers
Dieser Commit ist enthalten in:
Ursprung
8139ac35d9
Commit
1711e8b9ce
@ -3,6 +3,7 @@ package com.velocitypowered.proxy.connection.backend;
|
|||||||
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
||||||
import com.velocitypowered.proxy.protocol.StateRegistry;
|
import com.velocitypowered.proxy.protocol.StateRegistry;
|
||||||
import com.velocitypowered.proxy.protocol.packets.Disconnect;
|
import com.velocitypowered.proxy.protocol.packets.Disconnect;
|
||||||
|
import com.velocitypowered.proxy.protocol.packets.EncryptionRequest;
|
||||||
import com.velocitypowered.proxy.protocol.packets.ServerLoginSuccess;
|
import com.velocitypowered.proxy.protocol.packets.ServerLoginSuccess;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
|
import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
|
||||||
import com.velocitypowered.proxy.protocol.packets.SetCompression;
|
import com.velocitypowered.proxy.protocol.packets.SetCompression;
|
||||||
@ -16,6 +17,10 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(MinecraftPacket packet) {
|
public void handle(MinecraftPacket packet) {
|
||||||
|
if (packet instanceof EncryptionRequest) {
|
||||||
|
throw new IllegalStateException("Backend server is online-mode!");
|
||||||
|
}
|
||||||
|
|
||||||
if (packet instanceof Disconnect) {
|
if (packet instanceof Disconnect) {
|
||||||
Disconnect disconnect = (Disconnect) packet;
|
Disconnect disconnect = (Disconnect) packet;
|
||||||
connection.disconnect();
|
connection.disconnect();
|
||||||
@ -35,4 +40,9 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
connection.getChannel().setSessionHandler(new PlaySessionHandler(connection));
|
connection.getChannel().setSessionHandler(new PlaySessionHandler(connection));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exception(Throwable throwable) {
|
||||||
|
connection.getProxyPlayer().handleConnectionException(connection.getServerInfo(), throwable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,4 +49,21 @@ public enum ProtocolUtils { ;
|
|||||||
writeVarInt(buf, asUtf8.length);
|
writeVarInt(buf, asUtf8.length);
|
||||||
buf.writeBytes(asUtf8);
|
buf.writeBytes(asUtf8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static byte[] readByteArray(ByteBuf buf) {
|
||||||
|
return readByteArray(buf, DEFAULT_MAX_STRING_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] readByteArray(ByteBuf buf, int cap) {
|
||||||
|
int length = readVarInt(buf);
|
||||||
|
Preconditions.checkArgument(length <= cap, "Bad string size (got %s, maximum is %s)", length, cap);
|
||||||
|
byte[] array = new byte[length];
|
||||||
|
buf.readBytes(array);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeByteArray(ByteBuf buf, byte[] array) {
|
||||||
|
writeVarInt(buf, array.length);
|
||||||
|
buf.writeBytes(array);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ public enum StateRegistry {
|
|||||||
TO_SERVER.register(0x00, ServerLogin.class, ServerLogin::new);
|
TO_SERVER.register(0x00, ServerLogin.class, ServerLogin::new);
|
||||||
|
|
||||||
TO_CLIENT.register(0x00, Disconnect.class, Disconnect::new);
|
TO_CLIENT.register(0x00, Disconnect.class, Disconnect::new);
|
||||||
// Encryption Success will follow once Mojang auth/encryption is done
|
TO_CLIENT.register(0x01, EncryptionRequest.class, EncryptionRequest::new);
|
||||||
TO_CLIENT.register(0x02, ServerLoginSuccess.class, ServerLoginSuccess::new);
|
TO_CLIENT.register(0x02, ServerLoginSuccess.class, ServerLoginSuccess::new);
|
||||||
TO_CLIENT.register(0x03, SetCompression.class, SetCompression::new);
|
TO_CLIENT.register(0x03, SetCompression.class, SetCompression::new);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.velocitypowered.proxy.protocol.packets;
|
||||||
|
|
||||||
|
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
||||||
|
import com.velocitypowered.proxy.protocol.ProtocolConstants;
|
||||||
|
import com.velocitypowered.proxy.protocol.ProtocolUtils;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class EncryptionRequest implements MinecraftPacket {
|
||||||
|
private byte[] publicKey;
|
||||||
|
private byte[] verifyToken;
|
||||||
|
|
||||||
|
public byte[] getPublicKey() {
|
||||||
|
return publicKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPublicKey(byte[] publicKey) {
|
||||||
|
this.publicKey = publicKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getVerifyToken() {
|
||||||
|
return verifyToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVerifyToken(byte[] verifyToken) {
|
||||||
|
this.verifyToken = verifyToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "EncryptionRequest{" +
|
||||||
|
"publicKey=" + Arrays.toString(publicKey) +
|
||||||
|
", verifyToken=" + Arrays.toString(verifyToken) +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void decode(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) {
|
||||||
|
ProtocolUtils.readString(buf); // Server ID, can be ignored since it is an empty string
|
||||||
|
publicKey = ProtocolUtils.readByteArray(buf, 256);
|
||||||
|
verifyToken = ProtocolUtils.readByteArray(buf, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void encode(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) {
|
||||||
|
ProtocolUtils.writeString(buf, ""); // Server ID
|
||||||
|
ProtocolUtils.writeByteArray(buf, publicKey);
|
||||||
|
ProtocolUtils.writeByteArray(buf, verifyToken);
|
||||||
|
}
|
||||||
|
}
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren