From 1cb7e4ec8af7d5b0cceeae77987276976913c17b Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Wed, 23 Dec 2020 00:46:15 -0600 Subject: [PATCH] Add PlayerBookTooLargeEvent --- .../api/0036-PlayerBookTooLargeEvent.patch | 77 +++++++++++++++++++ .../server/0164-PlayerBookTooLargeEvent.patch | 37 +++++++++ 2 files changed, 114 insertions(+) create mode 100644 patches/api/0036-PlayerBookTooLargeEvent.patch create mode 100644 patches/server/0164-PlayerBookTooLargeEvent.patch diff --git a/patches/api/0036-PlayerBookTooLargeEvent.patch b/patches/api/0036-PlayerBookTooLargeEvent.patch new file mode 100644 index 000000000..dc89fde7d --- /dev/null +++ b/patches/api/0036-PlayerBookTooLargeEvent.patch @@ -0,0 +1,77 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Wed, 23 Dec 2020 00:43:27 -0600 +Subject: [PATCH] PlayerBookTooLargeEvent + + +diff --git a/src/main/java/net/pl3x/purpur/event/player/PlayerBookTooLargeEvent.java b/src/main/java/net/pl3x/purpur/event/player/PlayerBookTooLargeEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..39378ee2bfadf42ff358cc7b42dd75ac61615e15 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/event/player/PlayerBookTooLargeEvent.java +@@ -0,0 +1,65 @@ ++package net.pl3x.purpur.event.player; ++ ++import org.bukkit.Bukkit; ++import org.bukkit.entity.Player; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.player.PlayerEvent; ++import org.bukkit.inventory.ItemStack; ++import org.jetbrains.annotations.NotNull; ++ ++/** ++ * Called when a player tries to bypass book limitations ++ */ ++public class PlayerBookTooLargeEvent extends PlayerEvent { ++ private static final HandlerList handlers = new HandlerList(); ++ private final ItemStack book; ++ private boolean kickPlayer = true; ++ ++ /** ++ * @param player The player ++ * @param book The book ++ */ ++ public PlayerBookTooLargeEvent(@NotNull Player player, @NotNull ItemStack book) { ++ super(player, !Bukkit.isPrimaryThread()); ++ this.book = book; ++ } ++ ++ /** ++ * Get the book containing the wanted edits ++ * ++ * @return The book ++ */ ++ @NotNull ++ public ItemStack getBook() { ++ return book; ++ } ++ ++ /** ++ * Whether server should kick the player or not ++ * ++ * @return True to kick player ++ */ ++ public boolean shouldKickPlayer() { ++ return kickPlayer; ++ } ++ ++ /** ++ * Whether server should kick the player or not ++ * ++ * @param kickPlayer True to kick player ++ */ ++ public void setShouldKickPlayer(boolean kickPlayer) { ++ this.kickPlayer = kickPlayer; ++ } ++ ++ @Override ++ @NotNull ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} diff --git a/patches/server/0164-PlayerBookTooLargeEvent.patch b/patches/server/0164-PlayerBookTooLargeEvent.patch new file mode 100644 index 000000000..09da7a80f --- /dev/null +++ b/patches/server/0164-PlayerBookTooLargeEvent.patch @@ -0,0 +1,37 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Wed, 23 Dec 2020 00:43:59 -0600 +Subject: [PATCH] PlayerBookTooLargeEvent + + +diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java +index f16109a08804e0942f2f41d9637bd9b88c1c8893..33327da588fec7c7458081d62ec6680d178c7dec 100644 +--- a/src/main/java/net/minecraft/server/PlayerConnection.java ++++ b/src/main/java/net/minecraft/server/PlayerConnection.java +@@ -928,8 +928,9 @@ public class PlayerConnection implements PacketListenerPlayIn { + ItemStack testStack = packetplayinbedit.getBook(); + if (!server.isPrimaryThread() && !testStack.isEmpty() && testStack.getTag() != null) { + NBTTagList pageList = testStack.getTag().getList("pages", 8); +- if (pageList.size() > 50) { ++ if (pageList.size() > 100) { // Purpur - java edition has 100 pages + PlayerConnection.LOGGER.warn(this.player.getName() + " tried to send a book with too many pages"); ++ net.pl3x.purpur.event.player.PlayerBookTooLargeEvent event = new net.pl3x.purpur.event.player.PlayerBookTooLargeEvent(player.getBukkitEntity(), testStack.asBukkitCopy()); if (event.shouldKickPlayer()) // Purpur + minecraftServer.scheduleOnMain(() -> this.disconnect("Book too large!")); + return; + } +@@ -942,6 +943,7 @@ public class PlayerConnection implements PacketListenerPlayIn { + int byteLength = testString.getBytes(java.nio.charset.StandardCharsets.UTF_8).length; + if (byteLength > 256 * 4) { + PlayerConnection.LOGGER.warn(this.player.getName() + " tried to send a book with with a page too large!"); ++ net.pl3x.purpur.event.player.PlayerBookTooLargeEvent event = new net.pl3x.purpur.event.player.PlayerBookTooLargeEvent(player.getBukkitEntity(), testStack.asBukkitCopy()); if (event.shouldKickPlayer()) // Purpur + minecraftServer.scheduleOnMain(() -> this.disconnect("Book too large!")); + return; + } +@@ -965,6 +967,7 @@ public class PlayerConnection implements PacketListenerPlayIn { + + if (byteTotal > byteAllowed) { + PlayerConnection.LOGGER.warn(this.player.getName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); ++ net.pl3x.purpur.event.player.PlayerBookTooLargeEvent event = new net.pl3x.purpur.event.player.PlayerBookTooLargeEvent(player.getBukkitEntity(), testStack.asBukkitCopy()); if (event.shouldKickPlayer()) // Purpur + minecraftServer.scheduleOnMain(() -> this.disconnect("Book too large!")); + return; + }