From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:49:17 +0300 Subject: [PATCH] Implement NoChatReports diff --git a/net/minecraft/network/FriendlyByteBuf.java b/net/minecraft/network/FriendlyByteBuf.java index bef92cfa7eb86fbc6bc1b7d862eaca575eeeadec..b8701c45a6fa635f3ea18616f7c841de9df32877 100644 --- a/net/minecraft/network/FriendlyByteBuf.java +++ b/net/minecraft/network/FriendlyByteBuf.java @@ -106,7 +106,28 @@ public class FriendlyByteBuf extends ByteBuf { return this; } + @SuppressWarnings({"unchecked", "rawtypes"}) // DivineMC - Implement NoChatReports public T readLenientJsonWithCodec(Codec codec) { + // DivineMC start - Implement NoChatReports + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) { + if (codec == net.minecraft.network.protocol.status.ServerStatus.CODEC) { + JsonElement jsonElement = LenientJsonParser.parse(this.readUtf()); + DataResult dataResult = codec.parse(JsonOps.INSTANCE, jsonElement); + Object result; + try { + result = dataResult.getOrThrow(string -> new DecoderException("Failed to decode json: " + string)); + } catch (Throwable e) { + throw new RuntimeException("Unable to decode json!", e); + } + + if (jsonElement.getAsJsonObject().has("preventsChatReports")) { + ((net.minecraft.network.protocol.status.ServerStatus) result).setPreventsChatReports(jsonElement.getAsJsonObject().get("preventsChatReports").getAsBoolean()); + } + + return (T) (result); + } + } + // DivineMC end - Implement NoChatReports JsonElement jsonElement = LenientJsonParser.parse(this.readUtf()); DataResult dataResult = codec.parse(JsonOps.INSTANCE, jsonElement); return dataResult.getOrThrow(string -> new DecoderException("Failed to decode JSON: " + string)); @@ -118,6 +139,19 @@ public class FriendlyByteBuf extends ByteBuf { } public void writeJsonWithCodec(Codec codec, T value, int maxLength) { // Paper end - Adventure; add max length parameter + // DivineMC start - Implement NoChatReports + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsAddQueryData && codec == net.minecraft.network.protocol.status.ServerStatus.CODEC) { + DataResult dataResult = codec.encodeStart(JsonOps.INSTANCE, value); + JsonElement element = dataResult.getOrThrow(string -> new EncoderException("Failed to encode: " + string + " " + value)); + + element.getAsJsonObject().addProperty("preventsChatReports", true); + + this.writeUtf(GSON.toJson(element)); + return; + } + } + // DivineMC end - Implement NoChatReports DataResult dataResult = codec.encodeStart(JsonOps.INSTANCE, value); this.writeUtf(GSON.toJson(dataResult.getOrThrow(exception -> new EncoderException("Failed to encode: " + exception + " " + value))), maxLength); // Paper - Adventure; add max length parameter } diff --git a/net/minecraft/network/protocol/game/ServerboundChatCommandSignedPacket.java b/net/minecraft/network/protocol/game/ServerboundChatCommandSignedPacket.java index 07943553b562b95076bdce232d6f0796f469400f..478c07e8c569d35761ce138cf1deed9511b826d6 100644 --- a/net/minecraft/network/protocol/game/ServerboundChatCommandSignedPacket.java +++ b/net/minecraft/network/protocol/game/ServerboundChatCommandSignedPacket.java @@ -36,4 +36,15 @@ public record ServerboundChatCommandSignedPacket( public void handle(ServerGamePacketListener handler) { handler.handleSignedChatCommand(this); } + + // DivineMC start - Implement NoChatReports + @Override + public ArgumentSignatures argumentSignatures() { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) { + return ArgumentSignatures.EMPTY; + } + + return argumentSignatures; + } + // DivineMC end - Implement NoChatReports } diff --git a/net/minecraft/network/protocol/game/ServerboundChatPacket.java b/net/minecraft/network/protocol/game/ServerboundChatPacket.java index b5afc05924ae899e020c303c8b86398e1d4ab8a0..2a6fdec4faae3512060cbb21a2043129765a480e 100644 --- a/net/minecraft/network/protocol/game/ServerboundChatPacket.java +++ b/net/minecraft/network/protocol/game/ServerboundChatPacket.java @@ -36,4 +36,16 @@ public record ServerboundChatPacket(String message, Instant timeStamp, long salt public void handle(ServerGamePacketListener handler) { handler.handleChat(this); } + + // DivineMC start - Implement NoChatReports + @Override + @Nullable + public MessageSignature signature() { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) { + return null; + } + + return signature; + } + // DivineMC end - Implement NoChatReports } diff --git a/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java b/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java index 1df628ac0b414511aaed6e09d78f884c4170f730..1543f730843c1736c4db9a6ebe30be9cc9fbe36a 100644 --- a/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java +++ b/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java @@ -26,6 +26,19 @@ public record ServerboundChatSessionUpdatePacket(RemoteChatSession.Data chatSess @Override public void handle(ServerGamePacketListener handler) { + // DivineMC start - Implement NoChatReports + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) { + var impl = (net.minecraft.server.network.ServerGamePacketListenerImpl) handler; + + if (!impl.getPlayer().getServer().isSingleplayerOwner(impl.getPlayer().getGameProfile())) { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsDemandOnClient) { + impl.disconnect(net.minecraft.network.chat.Component.literal(org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsDisconnectDemandOnClientMessage)); + } + } + + return; + } + // DivineMC end - Implement NoChatReports handler.handleChatSessionUpdate(this); } } diff --git a/net/minecraft/network/protocol/status/ServerStatus.java b/net/minecraft/network/protocol/status/ServerStatus.java index a491be4250de3199c3e1aa9e5482b568692bd2f5..c88826db76c28c536e6c36c5592d69c12de395d0 100644 --- a/net/minecraft/network/protocol/status/ServerStatus.java +++ b/net/minecraft/network/protocol/status/ServerStatus.java @@ -15,13 +15,7 @@ import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; -public record ServerStatus( - Component description, - Optional players, - Optional version, - Optional favicon, - boolean enforcesSecureChat -) { +public final class ServerStatus { public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( ComponentSerialization.CODEC.lenientOptionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), @@ -33,6 +27,63 @@ public record ServerStatus( .apply(instance, ServerStatus::new) ); + // DivineMC start - Implement NoChatReports - convert to class + private final Component description; + private final Optional players; + private final Optional version; + private final Optional favicon; + private final boolean enforcesSecureChat; + private boolean preventsChatReports; + + public ServerStatus( + Component description, + Optional players, + Optional version, + Optional favicon, + boolean enforcesSecureChat + ) { + this.description = description; + this.players = players; + this.version = version; + this.favicon = favicon; + this.enforcesSecureChat = enforcesSecureChat; + } + + public Component description() { + return description; + } + + public Optional players() { + return players; + } + + public Optional version() { + return version; + } + + public Optional favicon() { + return favicon; + } + + public boolean enforcesSecureChat() { + return enforcesSecureChat; + } + + public boolean preventsChatReports() { + var self = (ServerStatus) (Object) this; + + if (self.version().isPresent() && self.version().get().protocol() < 759 + && self.version().get().protocol() > 0) + return true; + + return this.preventsChatReports; + } + + public void setPreventsChatReports(boolean prevents) { + this.preventsChatReports = prevents; + } + // DivineMC end - Implement NoChatReports + public record Favicon(byte[] iconBytes) { private static final String PREFIX = "data:image/png;base64,"; public static final Codec CODEC = Codec.STRING.comapFlatMap(string -> { diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java index 7ac82a49e3c64d1a41a2870c5cf9900812329a57..978934f81ba023d7565d2e66c51f6ca249510702 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java @@ -629,6 +629,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @Override public boolean enforceSecureProfile() { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) return false; // DivineMC - Implement NoChatReports DedicatedServerProperties properties = this.getProperties(); // Paper start - Add setting for proxy online mode status return properties.enforceSecureProfile diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java index 667ef5b2ab50eeb0491f7fe0bc8913ec29a4603a..a7c4fad2b1cb0cbac742a18d37d688bb2663944e 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -343,10 +343,64 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } public void send(Packet packet) { + // DivineMC start - Implement NoChatReports + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) { + Object self = this; + boolean cancel = false; + + if (self instanceof ServerGamePacketListenerImpl listener) { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsDebugLog && packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) { + MinecraftServer.LOGGER.info("Sending message: {}", chat.unsignedContent() != null ? chat.unsignedContent() + : chat.body().content()); + } + + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsConvertToGameMessage) { + if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) { + packet = new net.minecraft.network.protocol.game.ClientboundSystemChatPacket(chat.chatType().decorate( + chat.unsignedContent() != null ? chat.unsignedContent() + : Component.literal(chat.body().content()) + ), false); + + cancel = true; + listener.send(packet); + } + } + } + + if (cancel) { + return; + } + } + // DivineMC end - Implement NoChatReports this.send(packet, null); } public void send(Packet packet, @Nullable ChannelFutureListener channelFutureListener) { + // DivineMC start - Implement NoChatReports + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) { + Object self = this; + boolean cancel = false; + + if (self instanceof ServerGamePacketListenerImpl listenerImpl) { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsDebugLog && packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) { + MinecraftServer.LOGGER.info("Sending message: {}", chat.unsignedContent() != null ? chat.unsignedContent() + : chat.body().content()); + } + + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsConvertToGameMessage) { + if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat && channelFutureListener != null) { + cancel = true; + listenerImpl.send(chat); + } + } + + } + + if (cancel) { + return; + } + } + // DivineMC end - Implement NoChatReports // CraftBukkit start if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java index 8a67672f1175769ac213099331453fbae59442fa..5ebbb4e37469beef11bdfd1531b0d10f3d01c826 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -276,7 +276,7 @@ public abstract class PlayerList { !_boolean, _boolean2, player.createCommonSpawnInfo(serverLevel), - this.server.enforceSecureProfile() + org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled || this.server.enforceSecureProfile() // DivineMC - Implement NoChatReports ) ); player.getBukkitEntity().sendSupportedChannels(); // CraftBukkit @@ -1318,6 +1318,7 @@ public abstract class PlayerList { } public boolean verifyChatTrusted(PlayerChatMessage message) { + if (org.bxteam.divinemc.config.DivineConfig.NetworkCategory.noChatReportsEnabled) return true; // DivineMC - Implement NoChatReports return message.hasSignature() && !message.hasExpiredServer(Instant.now()); }