aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0300-Limit-Client-Sign-length-more.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0300-Limit-Client-Sign-length-more.patch')
-rw-r--r--patches/server/0300-Limit-Client-Sign-length-more.patch56
1 files changed, 56 insertions, 0 deletions
diff --git a/patches/server/0300-Limit-Client-Sign-length-more.patch b/patches/server/0300-Limit-Client-Sign-length-more.patch
new file mode 100644
index 0000000000..f357b73ac8
--- /dev/null
+++ b/patches/server/0300-Limit-Client-Sign-length-more.patch
@@ -0,0 +1,56 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Wed, 27 Feb 2019 22:18:40 -0500
+Subject: [PATCH] Limit Client Sign length more
+
+modified clients can send more data from the client
+to the server and it would get stored on the sign as sent.
+
+Mojang has a limit of 384 which is much higher than reasonable.
+
+the client can barely render around 16 characters as-is, but formatting
+codes can get it to be more than 16 actual length.
+
+Set a limit of 80 which should give an average of 16 characters 2
+sets of legacy formatting codes which should be plenty for all uses.
+
+This does not strip any existing data from the NBT as plugins
+may use this for storing data out of the rendered area.
+
+it only impacts data sent from the client.
+
+Set -DPaper.maxSignLength=XX to change limit or -1 to disable
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index ac5f70ee86cc5a01b046e8e610434742448e3919..1c1ba459535296e029a8d39a5f78d60eb29cdb71 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -296,6 +296,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+ private final LastSeenMessagesValidator lastSeenMessagesValidator;
+ private final FutureChain chatMessageChain;
+ private static final long KEEPALIVE_LIMIT = Long.getLong("paper.playerconnection.keepalive", 30) * 1000; // Paper - provide property to set keepalive limit
++ private static final int MAX_SIGN_LINE_LENGTH = Integer.getInteger("Paper.maxSignLength", 80); // Paper
+
+ public ServerGamePacketListenerImpl(MinecraftServer server, Connection connection, ServerPlayer player) {
+ this.lastChatTimeStamp = new AtomicReference(Instant.EPOCH);
+@@ -3296,7 +3297,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+
+ @Override
+ public void handleSignUpdate(ServerboundSignUpdatePacket packet) {
+- List<String> list = (List) Stream.of(packet.getLines()).map(ChatFormatting::stripFormatting).collect(Collectors.toList());
++ // Paper start - cap line length - modified clients can send longer data than normal
++ String[] lines = packet.getLines();
++ for (int i = 0; i < lines.length; ++i) {
++ if (MAX_SIGN_LINE_LENGTH > 0 && lines[i].length() > MAX_SIGN_LINE_LENGTH) {
++ // This handles multibyte characters as 1
++ int offset = lines[i].codePoints().limit(MAX_SIGN_LINE_LENGTH).map(Character::charCount).sum();
++ if (offset < lines[i].length()) {
++ lines[i] = lines[i].substring(0, offset); // this will break any filtering, but filtering is NYI as of 1.17
++ }
++ }
++ }
++ List<String> list = (List) Stream.of(lines).map(ChatFormatting::stripFormatting).collect(Collectors.toList());
++ // Paper end
+
+ this.filterTextPacket(list).thenAcceptAsync((list1) -> {
+ this.updateSignText(packet, list1);