[ci skip] Clean up book limits patch (#11297)

This commit is contained in:
Nassim Jahnke 2024-08-19 11:33:17 +02:00
parent 9804f7ffe1
commit 5703e6c6d8

View file

@ -5,6 +5,22 @@ Subject: [PATCH] Book size limits
Puts some limits on the size of books. Puts some limits on the size of books.
diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundEditBookPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundEditBookPacket.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/network/protocol/game/ServerboundEditBookPacket.java
+++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundEditBookPacket.java
@@ -0,0 +0,0 @@ public record ServerboundEditBookPacket(int slot, List<String> pages, Optional<S
public static final StreamCodec<FriendlyByteBuf, ServerboundEditBookPacket> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.VAR_INT,
ServerboundEditBookPacket::slot,
- ByteBufCodecs.stringUtf8(8192).apply(ByteBufCodecs.list(200)),
+ ByteBufCodecs.stringUtf8(net.minecraft.world.item.component.WritableBookContent.PAGE_EDIT_LENGTH).apply(ByteBufCodecs.list(net.minecraft.world.item.component.WritableBookContent.MAX_PAGES)), // Paper - limit books
ServerboundEditBookPacket::pages,
- ByteBufCodecs.stringUtf8(128).apply(ByteBufCodecs::optional),
+ ByteBufCodecs.stringUtf8(net.minecraft.world.item.component.WrittenBookContent.TITLE_MAX_LENGTH).apply(ByteBufCodecs::optional), // Paper - limit books
ServerboundEditBookPacket::title,
ServerboundEditBookPacket::new
);
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@ -15,28 +31,31 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
public void handleEditBook(ServerboundEditBookPacket packet) { public void handleEditBook(ServerboundEditBookPacket packet) {
+ // Paper start - Book size limits + // Paper start - Book size limits
+ if (!this.cserver.isPrimaryThread()) { + if (!this.cserver.isPrimaryThread()) {
+ List<String> pageList = packet.pages(); + final List<String> pageList = packet.pages();
+ long byteTotal = 0; + long byteTotal = 0;
+ int maxBookPageSize = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax; + final int maxBookPageSize = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax;
+ double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D); + final double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D);
+ long byteAllowed = maxBookPageSize; + long byteAllowed = maxBookPageSize;
+ for (String testString : pageList) { + for (final String page : pageList) {
+ int byteLength = testString.getBytes(java.nio.charset.StandardCharsets.UTF_8).length; + final int byteLength = page.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;
+ byteTotal += byteLength; + byteTotal += byteLength;
+ int length = testString.length(); + final int length = page.length();
+ int multibytes = 0; + int multiByteCharacters = 0;
+ if (byteLength != length) { + if (byteLength != length) {
+ for (char c : testString.toCharArray()) { + // Count the number of multi byte characters
+ for (final char c : page.toCharArray()) {
+ if (c > 127) { + if (c > 127) {
+ multibytes++; + multiByteCharacters++;
+ } + }
+ } + }
+ } + }
+
+ // Allow pages with fewer characters to consume less of the allowed byte quota
+ byteAllowed += maxBookPageSize * Math.clamp((double) length / 255D, 0.1D, 1) * multiplier; + byteAllowed += maxBookPageSize * Math.clamp((double) length / 255D, 0.1D, 1) * multiplier;
+ +
+ if (multibytes > 1) { + if (multiByteCharacters > 1) {
+ // penalize MB + // Penalize multibyte characters
+ byteAllowed -= multibytes; + byteAllowed -= multiByteCharacters;
+ } + }
+ } + }
+ +