mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 03:48:01 +01:00
da9d110d5b
This patch does not appear to be doing anything useful, and may hide errors. Currently, the save logic does not run through this path either so it did not do anything. Additionally, properly implement support for handling RegionFileSizeException in Moonrise.
57 lines
3.0 KiB
Diff
57 lines
3.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Fri, 16 Nov 2018 23:08:50 -0500
|
|
Subject: [PATCH] Book size limits
|
|
|
|
Puts some limits on the size of books.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index c3e281754a1cd9d5ce5f4aab36822f9f5d34be39..542899c382309986f3aaa16bf534b677aaac82f5 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -1056,6 +1056,44 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
@Override
|
|
public void handleEditBook(ServerboundEditBookPacket packet) {
|
|
+ // Paper start - Book size limits
|
|
+ final io.papermc.paper.configuration.type.number.IntOr.Disabled pageMax = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax;
|
|
+ if (!this.cserver.isPrimaryThread() && pageMax.enabled()) {
|
|
+ final List<String> pageList = packet.pages();
|
|
+ long byteTotal = 0;
|
|
+ final int maxBookPageSize = pageMax.intValue();
|
|
+ final double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D);
|
|
+ long byteAllowed = maxBookPageSize;
|
|
+ for (final String page : pageList) {
|
|
+ final int byteLength = page.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;
|
|
+ byteTotal += byteLength;
|
|
+ final int length = page.length();
|
|
+ int multiByteCharacters = 0;
|
|
+ if (byteLength != length) {
|
|
+ // Count the number of multi byte characters
|
|
+ for (final char c : page.toCharArray()) {
|
|
+ if (c > 127) {
|
|
+ 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;
|
|
+
|
|
+ if (multiByteCharacters > 1) {
|
|
+ // Penalize multibyte characters
|
|
+ byteAllowed -= multiByteCharacters;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (byteTotal > byteAllowed) {
|
|
+ ServerGamePacketListenerImpl.LOGGER.warn("{} tried to send a book too large. Book size: {} - Allowed: {} - Pages: {}", this.player.getScoreboardName(), byteTotal, byteAllowed, pageList.size());
|
|
+ this.disconnect(Component.literal("Book too large!"));
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+ // Paper end - Book size limits
|
|
// CraftBukkit start
|
|
if (this.lastBookTick + 20 > MinecraftServer.currentTick) {
|
|
this.disconnect(Component.literal("Book edited too quickly!"));
|