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 70b35188e4762c8dcd46b2df14d4efd85e147dcd..8861148b0598891e7851d2c9cc6d79edfc26e55e 100644 --- a/net/minecraft/network/FriendlyByteBuf.java +++ b/net/minecraft/network/FriendlyByteBuf.java @@ -105,7 +105,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)); @@ -117,6 +138,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..aba42c2ea4f2dde395edbded3bc96e58d213908f 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().level().getServer().isSingleplayerOwner(impl.getPlayer().nameAndId())) { + 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 88447fc2108126ccfad2fb7eb79ac94537f132d3..571cbe6844ebb330801dd893a45c1f735ee87531 100644 --- a/net/minecraft/network/protocol/status/ServerStatus.java +++ b/net/minecraft/network/protocol/status/ServerStatus.java @@ -14,13 +14,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.server.players.NameAndId; -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), @@ -32,6 +26,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 7486df33cedea98695c614bb3d584e1d8e84314f..f9ec63ed7feb67e558abed99746726c10e9e10f4 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java @@ -833,6 +833,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 4a333e87af17bd5b673b57c0fa0d3a239fb8db59..e5569978a23c5bde673146421963a2ff0905d514 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -344,10 +344,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 sendListener) { + // 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 && sendListener != 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 6c6213323df278391b30dd9f22c408a34ec052c8..c8e68bbb210457366822f2c4a01afb49693035ac 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -181,7 +181,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 @@ -1255,6 +1255,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()); }