55 lines
2.8 KiB
Diff
55 lines
2.8 KiB
Diff
|
From 7eba93a4292ea7e612ae168aa7ba7f6a9704ba9a Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
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/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
|
||
|
index 5c58b85388..dc8c20efb4 100644
|
||
|
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
|
||
|
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
|
||
|
@@ -104,6 +104,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
|
||
|
private int E;
|
||
|
private int receivedMovePackets;
|
||
|
private int processedMovePackets;
|
||
|
+ private static final int MAX_SIGN_LINE_LENGTH = Integer.getInteger("Paper.maxSignLength", 80);
|
||
|
private static final long KEEPALIVE_LIMIT = Long.getLong("paper.playerconnection.keepalive", 30) * 1000; // Paper - provide property to set keepalive limit
|
||
|
|
||
|
public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) {
|
||
|
@@ -2543,6 +2544,15 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
|
||
|
String[] lines = new String[4];
|
||
|
|
||
|
for (int i = 0; i < astring.length; ++i) {
|
||
|
+ // Paper start - cap line length - modified clients can send longer data than normal
|
||
|
+ if (MAX_SIGN_LINE_LENGTH > 0 && astring[i].length() > MAX_SIGN_LINE_LENGTH) {
|
||
|
+ // This handles multibyte characters as 1
|
||
|
+ int offset = astring[i].codePoints().limit(MAX_SIGN_LINE_LENGTH).map(Character::charCount).sum();
|
||
|
+ if (offset > astring.length) {
|
||
|
+ astring[i] = astring[i].substring(0, offset);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
lines[i] = SharedConstants.a(astring[i]); //Paper - Replaced with anvil color stripping method to stop exploits that allow colored signs to be created.
|
||
|
}
|
||
|
SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.server.getPlayer(this.player), lines);
|
||
|
--
|
||
|
2.20.1
|
||
|
|