From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> Date: Sun, 7 Jan 2024 11:56:00 +0300 Subject: [PATCH] Configurable Chat message signatures diff --git a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java index 1d78e8beacbc93ef2cd6beb418edca843f8a5429..9d389c5a09c090750b1c17b0d162e06e6899a063 100644 --- a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -317,7 +317,7 @@ public final class ChatProcessor { private void sendToServer(final ChatType.Bound chatType, final @Nullable Function msgFunction) { final PlayerChatMessage toConsoleMessage = msgFunction == null ? ChatProcessor.this.message : ChatProcessor.this.message.withUnsignedContent(msgFunction.apply(ChatProcessor.this.server.console)); - ChatProcessor.this.server.logChatMessage(toConsoleMessage.decoratedContent(), chatType, ChatProcessor.this.server.getPlayerList().verifyChatTrusted(toConsoleMessage) ? null : "Not Secure"); + ChatProcessor.this.server.logChatMessage(toConsoleMessage.decoratedContent(), chatType, ChatProcessor.this.server.getPlayerList().verifyChatTrusted(toConsoleMessage) ? null : (space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures ? null : "Not Secure")); // DivineMC - Configurable Chat message signatures } } diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java index e62ae57532ddcf12b7ebca77220cb1f3bd603717..70201f97584442b7573a3da7b9a439117aa442ca 100644 --- a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java +++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java @@ -18,7 +18,7 @@ public record ServerboundChatCommandPacket( buf.writeUtf(this.command, 256); buf.writeInstant(this.timeStamp); buf.writeLong(this.salt); - this.argumentSignatures.write(buf); + if (!space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) this.argumentSignatures.write(buf); // DivineMC - Configurable Chat message signatures this.lastSeenMessages.write(buf); } diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java index 831178218ddfaa1828c00d0662b251d11bb29ff5..10a4a52b13de38791c58f2323dffd320a789b547 100644 --- a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java +++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java @@ -18,7 +18,7 @@ public record ServerboundChatPacket(String message, Instant timeStamp, long salt buf.writeUtf(this.message, 256); buf.writeInstant(this.timeStamp); buf.writeLong(this.salt); - buf.writeNullable(this.signature, MessageSignature::write); + if (!space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) buf.writeNullable(this.signature, MessageSignature::write); // DivineMC - Configurable Chat message signatures this.lastSeenMessages.write(buf); } diff --git a/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java b/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java index 5ed4a3a30657ab9e748245ad34333b915e870ae2..7b76782d7fc7bebef4248b1847ba6dd8a6c5dc8c 100644 --- a/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java +++ b/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java @@ -23,14 +23,21 @@ public record ServerStatus( boolean enforcesSecureChat ) { public static final Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( - ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), - ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), - ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), - ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), - Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.valueOf(false)).forGetter(ServerStatus::enforcesSecureChat) - ) - .apply(instance, ServerStatus::new) + instance -> space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures ? instance.group( + ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), + ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), + ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), + ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), + Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.FALSE).forGetter(x -> true) + ) + .apply(instance, ServerStatus::new) : instance.group( + ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), + ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), + ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), + ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), + Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.FALSE).forGetter(ServerStatus::enforcesSecureChat) + ) + .apply(instance, ServerStatus::new) ); public static record Favicon(byte[] iconBytes) { diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java index 41cffa00d4978f46b47ac6ede2da2a256796a0ba..9fa9a1e1efab58f3133b32517bb04c2ec708816d 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -682,6 +682,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @Override public boolean enforceSecureProfile() { + if (space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) return false; // DivineMC - Configurable Chat message signatures DedicatedServerProperties dedicatedserverproperties = this.getProperties(); // Paper start - Add setting for proxy online mode status diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java index 305b90d10a499e9731f5178433fb10207e428091..8206429795ec7bf81b9e628ac08ffc591ddd409a 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -2258,7 +2258,7 @@ public class ServerPlayer extends Player { } public void sendServerStatus(ServerStatus metadata) { - this.connection.send(new ClientboundServerDataPacket(metadata.description(), metadata.favicon().map(ServerStatus.Favicon::iconBytes), metadata.enforcesSecureChat())); + if (space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) this.connection.send(new ClientboundServerDataPacket(metadata.description(), metadata.favicon().map(ServerStatus.Favicon::iconBytes), true)); else this.connection.send(new ClientboundServerDataPacket(metadata.description(), metadata.favicon().map(ServerStatus.Favicon::iconBytes), metadata.enforcesSecureChat())); // DivineMC - Configurable Chat message signatures } @Override diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java index 02e65b0bd212d46855baee48fab35dc95a88b43f..9d9c1bc8bdf55998172bca5edf78d9b8b048b2c9 100644 --- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -4,7 +4,7 @@ import com.mojang.authlib.GameProfile; import com.mojang.logging.LogUtils; import java.util.Objects; import javax.annotation.Nullable; -import net.minecraft.ChatFormatting; +import io.papermc.paper.adventure.PaperAdventure; // DivineMC import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; import net.minecraft.ReportedException; @@ -22,6 +22,7 @@ import net.minecraft.network.protocol.common.ServerboundKeepAlivePacket; import net.minecraft.network.protocol.common.ServerboundPongPacket; import net.minecraft.network.protocol.common.ServerboundResourcePackPacket; import net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket; +import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; // DivineMC import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ClientInformation; @@ -34,7 +35,6 @@ import org.slf4j.Logger; import io.netty.buffer.ByteBuf; import java.util.concurrent.ExecutionException; import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.craftbukkit.util.CraftLocation; import org.bukkit.craftbukkit.util.Waitable; import org.bukkit.event.player.PlayerKickEvent; @@ -271,10 +271,31 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } public void send(Packet packet) { + // DivineMC start - Configurable Chat message signatures + if (space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) { + if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) { + packet = new ClientboundSystemChatPacket(PaperAdventure.asAdventure(chat.chatType().resolve(this.player.level().registryAccess()) + .get().decorate(chat.unsignedContent() != null ? chat.unsignedContent() + : Component.literal(chat.body().content()))), false); + + this.send(packet); + return; + } + } + // DivineMC end this.send(packet, (PacketSendListener) null); } public void send(Packet packet, @Nullable PacketSendListener callbacks) { + // DivineMC start - Configurable Chat message signatures + if (space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) { + if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat && callbacks != null) { + this.send(chat); + return; + } + } + // DivineMC end + // CraftBukkit start if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java index ac1e0c66f167218306504db6037cc1d6509072a0..7784a81f2b861e1f5c9dd7a7885e8be70b89bc8a 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1469,7 +1469,7 @@ public abstract class PlayerList { // Paper end boolean flag = this.verifyChatTrusted(message); - this.server.logChatMessage((unsignedFunction == null ? message.decoratedContent() : unsignedFunction.apply(this.server.console)), params, flag ? null : "Not Secure"); // Paper + this.server.logChatMessage((unsignedFunction == null ? message.decoratedContent() : unsignedFunction.apply(this.server.console)), params, flag ? null : (space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures ? null : "Not Secure")); // Paper // DivineMC - Configurable Chat message signatures OutgoingChatMessage outgoingchatmessage = OutgoingChatMessage.create(message); boolean flag1 = false; @@ -1498,6 +1498,7 @@ public abstract class PlayerList { } public boolean verifyChatTrusted(PlayerChatMessage message) { // Paper - private -> public + if (space.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) return true; // DivineMC - Configurable Chat message signatures return message.hasSignature() && !message.hasExpiredServer(Instant.now()); } diff --git a/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java b/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java index ef7983863da3b4febef3da2fab93fe581fbd65af..b9223f4778de0c2ed6efed6f8c192cb0212cbda8 100644 --- a/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java +++ b/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java @@ -157,4 +157,9 @@ public class DivineConfig { private static void doNotProcessChatCommands() { doNotProcessChatCommands = getBoolean("settings.do-not-process-chat-commands", doNotProcessChatCommands); } + + public static boolean chatMessageSignatures = false; + private static void chatMessageSignatures() { + chatMessageSignatures = getBoolean("settings.disable-chat-reports", chatMessageSignatures); + } }