Paper/paper-server/patches/sources/net/minecraft/server/network/LegacyQueryHandler.java.patch

196 lines
8.4 KiB
Diff
Raw Normal View History

--- a/net/minecraft/server/network/LegacyQueryHandler.java
+++ b/net/minecraft/server/network/LegacyQueryHandler.java
2024-12-14 17:00:39 +01:00
@@ -14,6 +_,7 @@
public class LegacyQueryHandler extends ChannelInboundHandlerAdapter {
private static final Logger LOGGER = LogUtils.getLogger();
private final ServerInfo server;
+ private ByteBuf buf; // Paper
public LegacyQueryHandler(ServerInfo server) {
this.server = server;
2024-12-14 17:00:39 +01:00
@@ -22,6 +_,17 @@
@Override
public void channelRead(ChannelHandlerContext context, Object message) {
ByteBuf byteBuf = (ByteBuf)message;
+ // Paper start - Make legacy ping handler more reliable
+ if (this.buf != null) {
+ try {
2024-12-14 17:00:39 +01:00
+ readLegacy1_6(context, byteBuf);
+ } finally {
2024-12-14 17:00:39 +01:00
+ byteBuf.release();
+ }
+ return;
+ }
2024-12-14 17:00:39 +01:00
+ // Paper end - Make legacy ping handler more reliable
+
byteBuf.markReaderIndex();
boolean flag = true;
2024-12-14 18:22:38 +01:00
@@ -33,9 +_,19 @@
2024-12-14 17:00:39 +01:00
SocketAddress socketAddress = context.channel().remoteAddress();
int i = byteBuf.readableBytes();
+ String string = null; // Paper
if (i == 0) {
2024-12-14 17:00:39 +01:00
- LOGGER.debug("Ping: (<1.3.x) from {}", socketAddress);
- String string = createVersion0Response(this.server);
+ LOGGER.debug("Ping: (<1.3.x) from {}", net.minecraft.server.MinecraftServer.getServer().logIPs() ? socketAddress: "<ip address withheld>"); // Paper - Respect logIPs option
+ // Paper start - Call PaperServerListPingEvent and use results
2024-12-14 18:22:38 +01:00
+ com.destroystokyo.paper.event.server.PaperServerListPingEvent event = com.destroystokyo.paper.network.PaperLegacyStatusClient.processRequest(net.minecraft.server.MinecraftServer.getServer(), (java.net.InetSocketAddress) socketAddress, 39, null);
+ if (event == null) {
2024-12-14 17:00:39 +01:00
+ context.close();
+ byteBuf.release();
+ flag = false;
+ return;
+ }
2024-12-14 18:22:38 +01:00
+ string = String.format(Locale.ROOT, "%s§%d§%d", com.destroystokyo.paper.network.PaperLegacyStatusClient.getUnformattedMotd(event), event.getNumPlayers(), event.getMaxPlayers());
2024-12-14 17:00:39 +01:00
+ // Paper end - Call PaperServerListPingEvent and use results
sendFlushAndClose(context, createLegacyDisconnectPacket(context.alloc(), string));
} else {
2024-12-14 17:00:39 +01:00
if (byteBuf.readUnsignedByte() != 1) {
2024-12-19 15:55:01 +01:00
@@ -43,16 +_,39 @@
}
2024-12-14 17:00:39 +01:00
if (byteBuf.isReadable()) {
- if (!readCustomPayloadPacket(byteBuf)) {
2024-12-19 15:55:01 +01:00
+ // Paper start - Replace below
2024-12-14 17:00:39 +01:00
+ if (byteBuf.readUnsignedByte() != LegacyProtocolUtils.CUSTOM_PAYLOAD_PACKET_ID) {
+ string = this.readLegacy1_6(context, byteBuf);
+ if (string == null) {
+ return;
+ }
2024-12-14 17:00:39 +01:00
+ }
2024-12-19 15:55:01 +01:00
+ // Paper end - Replace below
2024-12-14 17:00:39 +01:00
+ } else {
+ LOGGER.debug("Ping: (1.4-1.5.x) from {}", net.minecraft.server.MinecraftServer.getServer().logIPs() ? socketAddress : "<ip address withheld>"); // Paper - Respect logIPs option
+ }
+
2024-12-19 15:55:01 +01:00
+ // Paper start - Call PaperServerListPingEvent and use results
2024-12-14 17:00:39 +01:00
+ if (string == null) {
2024-12-14 18:22:38 +01:00
+ com.destroystokyo.paper.event.server.PaperServerListPingEvent event = com.destroystokyo.paper.network.PaperLegacyStatusClient.processRequest(net.minecraft.server.MinecraftServer.getServer(), (java.net.InetSocketAddress) socketAddress, 127, null); // Paper
+ if (event == null) {
2024-12-14 17:00:39 +01:00
+ context.close();
+ byteBuf.release();
+ flag = false;
2024-12-14 17:00:39 +01:00
return;
}
2024-12-19 15:55:01 +01:00
2024-12-14 17:00:39 +01:00
- LOGGER.debug("Ping: (1.6) from {}", socketAddress);
- } else {
- LOGGER.debug("Ping: (1.4-1.5.x) from {}", socketAddress);
2024-12-19 15:55:01 +01:00
+ // See createVersion1Response
+ string = String.format(
+ Locale.ROOT,
+ "§1\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d",
+ event.getProtocolVersion(), this.server.getServerVersion(),
+ event.getMotd(),
+ event.getNumPlayers(),
+ event.getMaxPlayers()
+ );
2024-12-14 17:00:39 +01:00
+ // Paper end - Call PaperServerListPingEvent and use results
}
-
- String string = createVersion1Response(this.server);
sendFlushAndClose(context, createLegacyDisconnectPacket(context.alloc(), string));
}
2024-12-14 18:22:38 +01:00
@@ -110,6 +_,98 @@
server.getMaxPlayers()
);
}
2024-12-14 18:22:38 +01:00
+
+ // Paper start
+ private static String readLegacyString(ByteBuf buf) {
+ int size = buf.readShort() * Character.BYTES;
+ if (!buf.isReadable(size)) {
+ return null;
+ }
+
+ String result = buf.toString(buf.readerIndex(), size, java.nio.charset.StandardCharsets.UTF_16BE);
+ buf.skipBytes(size); // toString doesn't increase readerIndex automatically
+ return result;
2024-12-14 17:00:39 +01:00
+ }
+
+ private String readLegacy1_6(ChannelHandlerContext ctx, ByteBuf part) {
+ ByteBuf buf = this.buf;
+
+ if (buf == null) {
+ this.buf = buf = ctx.alloc().buffer();
+ buf.markReaderIndex();
+ } else {
+ buf.resetReaderIndex();
+ }
+
+ buf.writeBytes(part);
+
+ if (!buf.isReadable(Short.BYTES + Short.BYTES + Byte.BYTES + Short.BYTES + Integer.BYTES)) {
+ return null;
+ }
+
2024-12-14 17:00:39 +01:00
+ String string = readLegacyString(buf);
+ if (string == null) {
+ return null;
+ }
+
2024-12-14 17:00:39 +01:00
+ if (!string.equals(LegacyProtocolUtils.CUSTOM_PAYLOAD_PACKET_PING_CHANNEL)) {
+ removeHandler(ctx);
+ return null;
+ }
+
+ if (!buf.isReadable(Short.BYTES) || !buf.isReadable(buf.readShort())) {
+ return null;
+ }
+
+ int protocolVersion = buf.readByte();
+ String host = readLegacyString(buf);
+ if (host == null) {
+ removeHandler(ctx);
+ return null;
+ }
+
2024-12-14 17:00:39 +01:00
+ int port = buf.readInt();
+ if (buf.isReadable()) {
+ removeHandler(ctx);
+ return null;
+ }
+
+ buf.release();
+ this.buf = null;
+
+ LOGGER.debug("Ping: (1.6) from {}", net.minecraft.server.MinecraftServer.getServer().logIPs() ? ctx.channel().remoteAddress(): "<ip address withheld>"); // Paper - Respect logIPs option
+
2024-12-14 17:00:39 +01:00
+ net.minecraft.server.MinecraftServer server = net.minecraft.server.MinecraftServer.getServer();
+ java.net.InetSocketAddress virtualHost = com.destroystokyo.paper.network.PaperNetworkClient.prepareVirtualHost(host, port);
+ com.destroystokyo.paper.event.server.PaperServerListPingEvent event = com.destroystokyo.paper.network.PaperLegacyStatusClient.processRequest(
2024-12-14 17:00:39 +01:00
+ server, (java.net.InetSocketAddress) ctx.channel().remoteAddress(), protocolVersion, virtualHost);
+ if (event == null) {
+ ctx.close();
+ return null;
+ }
+
+ String response = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", event.getProtocolVersion(), event.getVersion(),
+ com.destroystokyo.paper.network.PaperLegacyStatusClient.getMotd(event), event.getNumPlayers(), event.getMaxPlayers());
+ return response;
2024-12-14 17:00:39 +01:00
+ }
+
+ private void removeHandler(ChannelHandlerContext ctx) {
+ ByteBuf buf = this.buf;
+ this.buf = null;
+
+ buf.resetReaderIndex();
+ ctx.pipeline().remove(this);
+ ctx.fireChannelRead(buf);
+ }
+
+ @Override
+ public void handlerRemoved(ChannelHandlerContext ctx) {
+ if (this.buf != null) {
+ this.buf.release();
+ this.buf = null;
+ }
+ }
+ // Paper end
2024-12-14 17:00:39 +01:00
private static void sendFlushAndClose(ChannelHandlerContext context, ByteBuf buffer) {
context.pipeline().firstContext().writeAndFlush(buffer).addListener(ChannelFutureListener.CLOSE);