geforkt von Mirrors/Paper
Slightly untrash Spigot chat handling
Vanilla technically allows chat messages with starting slashes now, Spigot still accepts them as commands, most likely due to being too lazy to properly differentiate between chat and command intent in their implementation. This disallows modified clients to send chat messages with slashes and makes sure chat validation always happens on the netty event loop, rather than there and possibly being moved to the main thread, thus having the delayed handling cause a bad process order of message ids.
Dieser Commit ist enthalten in:
Ursprung
86c16504d6
Commit
11c2705ac2
100
patches/server/0904-Untrash-chat-handling.patch
Normale Datei
100
patches/server/0904-Untrash-chat-handling.patch
Normale Datei
@ -0,0 +1,100 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nassim Jahnke <jahnke.nassim@gmail.com>
|
||||||
|
Date: Wed, 8 Jun 2022 21:30:34 +0200
|
||||||
|
Subject: [PATCH] Untrash chat handling
|
||||||
|
|
||||||
|
Vanilla technically allows chat messages with starting slashes now,
|
||||||
|
Spigot still accepts them as commands, most likely due to being too
|
||||||
|
lazy to properly differentiate between chat and command intent in
|
||||||
|
their implementation. This disallows modified clients to send chat
|
||||||
|
messages with slashes and makes sure chat validation always happens
|
||||||
|
on the netty event loop, rather than there and possibly being moved
|
||||||
|
to the main thread, thus having the delayed handling cause a bad
|
||||||
|
process order of message ids.
|
||||||
|
|
||||||
|
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 3825aa2c381a3ee77e05bea520ff5fb828733857..4e9832d5753b98621e68246ffc5d80c86a3b5ed3 100644
|
||||||
|
--- a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java
|
||||||
|
+++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java
|
||||||
|
@@ -40,24 +40,16 @@ public class ServerboundChatPacket implements Packet<ServerGamePacketListener> {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spigot Start
|
||||||
|
- private static final java.util.concurrent.ExecutorService executors = java.util.concurrent.Executors.newCachedThreadPool(
|
||||||
|
+ // Paper start - untrash chat event handling
|
||||||
|
+ public static final java.util.concurrent.ExecutorService executors = java.util.concurrent.Executors.newCachedThreadPool(
|
||||||
|
new com.google.common.util.concurrent.ThreadFactoryBuilder().setDaemon( true ).setNameFormat( "Async Chat Thread - #%d" ).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build() ); // Paper
|
||||||
|
public void handle(final ServerGamePacketListener listener) {
|
||||||
|
- if ( !this.message.startsWith("/") )
|
||||||
|
- {
|
||||||
|
- ServerboundChatPacket.executors.execute( new Runnable() // Paper - Use #execute to propagate exceptions up instead of swallowing them
|
||||||
|
- {
|
||||||
|
-
|
||||||
|
- @Override
|
||||||
|
- public void run()
|
||||||
|
- {
|
||||||
|
- listener.handleChat( ServerboundChatPacket.this );
|
||||||
|
- }
|
||||||
|
- } );
|
||||||
|
+ if (this.message.startsWith("/")) {
|
||||||
|
+ // Just don't allow this instead of creating gigantic diff when untrashing more Spigot code
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
- // Spigot End
|
||||||
|
listener.handleChat(this);
|
||||||
|
+ // Paper end - untrash chat event handling
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
|
index b53876746fcc23e7517da3287fdc58909865eb39..0c18cc24baf155aac072cfd0ea871d600e0550cb 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
|
@@ -2103,11 +2103,6 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleChat(ServerboundChatPacket packet) {
|
||||||
|
- // CraftBukkit start - async chat
|
||||||
|
- // SPIGOT-3638
|
||||||
|
- if (this.server.isStopped()) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
// CraftBukkit end
|
||||||
|
if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.getMessage())) {
|
||||||
|
this.server.scheduleOnMain(() -> { // Paper - push to main for event firing
|
||||||
|
@@ -2117,8 +2112,15 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
|
||||||
|
if (this.tryHandleChat(packet.getMessage(), packet.getTimeStamp())) {
|
||||||
|
// CraftBukkit start
|
||||||
|
// this.filterTextPacket(packetplayinchat.getMessage(), (filteredtext) -> {
|
||||||
|
+ // Paper start - untrash chat handling
|
||||||
|
+ ServerboundChatPacket.executors.execute(() -> {
|
||||||
|
+ if (this.server.isStopped()) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
this.handleChat(packet, FilteredText.passThrough(packet.getMessage())); // CraftBukkit - filter NYI
|
||||||
|
// });
|
||||||
|
+ });
|
||||||
|
+ // Paper end - untrash chat handling
|
||||||
|
// CraftBukkit end
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2132,8 +2134,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
|
||||||
|
this.disconnect(Component.translatable("multiplayer.disconnect.illegal_characters"));
|
||||||
|
}); // Paper - push to main for event firing
|
||||||
|
} else {
|
||||||
|
- PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel());
|
||||||
|
+ // Paper start - untrash chat handling
|
||||||
|
if (this.tryHandleChat(packet.command(), packet.timeStamp())) {
|
||||||
|
+ this.server.scheduleOnMain(() -> {
|
||||||
|
// CraftBukkit start
|
||||||
|
// CommandListenerWrapper commandlistenerwrapper = this.player.createCommandSourceStack().withSigningContext(serverboundchatcommandpacket.signingContext(this.player.getUUID()));
|
||||||
|
|
||||||
|
@@ -2146,6 +2149,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
|
||||||
|
}
|
||||||
|
this.detectRateSpam(true, "/" + packet.command()); // Spigot
|
||||||
|
// CraftBukkit end
|
||||||
|
+ });
|
||||||
|
+ // Paper end - untrash chat handling
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren