118 lines
3.5 KiB
Java
118 lines
3.5 KiB
Java
package net.minecraft.server.network;
|
|
|
|
import com.mojang.logging.LogUtils;
|
|
import io.netty.buffer.ByteBuf;
|
|
import io.netty.buffer.ByteBufAllocator;
|
|
import io.netty.channel.ChannelFutureListener;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
|
import java.net.SocketAddress;
|
|
import java.util.Locale;
|
|
import net.minecraft.server.ServerInfo;
|
|
import org.slf4j.Logger;
|
|
|
|
public class LegacyQueryHandler extends ChannelInboundHandlerAdapter {
|
|
private static final Logger LOGGER = LogUtils.getLogger();
|
|
private final ServerInfo server;
|
|
|
|
public LegacyQueryHandler(ServerInfo server) {
|
|
this.server = server;
|
|
}
|
|
|
|
@Override
|
|
public void channelRead(ChannelHandlerContext channelHandlerContext, Object object) {
|
|
ByteBuf byteBuf = (ByteBuf)object;
|
|
byteBuf.markReaderIndex();
|
|
boolean bl = true;
|
|
|
|
try {
|
|
try {
|
|
if (byteBuf.readUnsignedByte() != 254) {
|
|
return;
|
|
}
|
|
|
|
SocketAddress socketAddress = channelHandlerContext.channel().remoteAddress();
|
|
int i = byteBuf.readableBytes();
|
|
if (i == 0) {
|
|
LOGGER.debug("Ping: (<1.3.x) from {}", socketAddress);
|
|
String string = createVersion0Response(this.server);
|
|
sendFlushAndClose(channelHandlerContext, createLegacyDisconnectPacket(channelHandlerContext.alloc(), string));
|
|
} else {
|
|
if (byteBuf.readUnsignedByte() != 1) {
|
|
return;
|
|
}
|
|
|
|
if (byteBuf.isReadable()) {
|
|
if (!readCustomPayloadPacket(byteBuf)) {
|
|
return;
|
|
}
|
|
|
|
LOGGER.debug("Ping: (1.6) from {}", socketAddress);
|
|
} else {
|
|
LOGGER.debug("Ping: (1.4-1.5.x) from {}", socketAddress);
|
|
}
|
|
|
|
String string = createVersion1Response(this.server);
|
|
sendFlushAndClose(channelHandlerContext, createLegacyDisconnectPacket(channelHandlerContext.alloc(), string));
|
|
}
|
|
|
|
byteBuf.release();
|
|
bl = false;
|
|
} catch (RuntimeException var11) {
|
|
}
|
|
} finally {
|
|
if (bl) {
|
|
byteBuf.resetReaderIndex();
|
|
channelHandlerContext.channel().pipeline().remove(this);
|
|
channelHandlerContext.fireChannelRead(object);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static boolean readCustomPayloadPacket(ByteBuf buffer) {
|
|
short s = buffer.readUnsignedByte();
|
|
if (s != 250) {
|
|
return false;
|
|
} else {
|
|
String string = LegacyProtocolUtils.readLegacyString(buffer);
|
|
if (!"MC|PingHost".equals(string)) {
|
|
return false;
|
|
} else {
|
|
int i = buffer.readUnsignedShort();
|
|
if (buffer.readableBytes() != i) {
|
|
return false;
|
|
} else {
|
|
short t = buffer.readUnsignedByte();
|
|
if (t < 73) {
|
|
return false;
|
|
} else {
|
|
String string2 = LegacyProtocolUtils.readLegacyString(buffer);
|
|
int j = buffer.readInt();
|
|
return j <= 65535;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static String createVersion0Response(ServerInfo server) {
|
|
return String.format(Locale.ROOT, "%s§%d§%d", server.getMotd(), server.getPlayerCount(), server.getMaxPlayers());
|
|
}
|
|
|
|
private static String createVersion1Response(ServerInfo server) {
|
|
return String.format(
|
|
Locale.ROOT, "§1\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, server.getServerVersion(), server.getMotd(), server.getPlayerCount(), server.getMaxPlayers()
|
|
);
|
|
}
|
|
|
|
private static void sendFlushAndClose(ChannelHandlerContext context, ByteBuf buffer) {
|
|
context.pipeline().firstContext().writeAndFlush(buffer).addListener(ChannelFutureListener.CLOSE);
|
|
}
|
|
|
|
private static ByteBuf createLegacyDisconnectPacket(ByteBufAllocator bufferAllocator, String reason) {
|
|
ByteBuf byteBuf = bufferAllocator.buffer();
|
|
byteBuf.writeByte(255);
|
|
LegacyProtocolUtils.writeLegacyString(byteBuf, reason);
|
|
return byteBuf;
|
|
}
|
|
}
|