From 26bfb974e919c21950699a6a27ac43efd387e84f Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Wed, 3 Sep 2025 21:18:36 +0200 Subject: [PATCH] Marks encrypted books to prevent dual encryption #15 --- .../command/CommandEncrypt.java | 7 +++ .../command/CommandGroupEncrypt.java | 6 +-- .../config/translation/Translatable.java | 2 +- .../listener/SignEventListener.java | 16 +++++-- .../utility/EncryptedBookUtil.java | 2 +- .../utility/EncryptionUtil.java | 43 +++++++++++++++++++ src/main/resources/strings.yml | 2 +- 7 files changed, 69 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandEncrypt.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandEncrypt.java index af9a5ca..024ce27 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandEncrypt.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandEncrypt.java @@ -7,6 +7,7 @@ import net.knarcraft.bookswithoutborders.config.translation.Translatable; import net.knarcraft.bookswithoutborders.encryption.EncryptionStyle; import net.knarcraft.bookswithoutborders.state.ItemSlot; import net.knarcraft.bookswithoutborders.utility.EncryptedBookUtil; +import net.knarcraft.bookswithoutborders.utility.EncryptionUtil; import net.knarcraft.bookswithoutborders.utility.InventoryUtil; import net.knarcraft.knarlib.formatting.FormatBuilder; import net.knarcraft.knarlib.util.TabCompletionHelper; @@ -95,6 +96,11 @@ public class CommandEncrypt implements TabExecutor { new FormatBuilder(Translatable.ERROR_ENCRYPT_EMPTY).error(player); return null; } + + if (EncryptionUtil.isEncrypted(bookMetadata)) { + new FormatBuilder(Translatable.ERROR_ENCRYPTED_ALREADY).error(player); + return null; + } return bookMetadata; } @@ -115,6 +121,7 @@ public class CommandEncrypt implements TabExecutor { encryptionStyle, group, preventAdminDecryption); if (encryptedBook != null) { + EncryptionUtil.markEncrypted(encryptedBook); InventoryUtil.setHeldWrittenBook(player, encryptedBook); return true; } else { diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGroupEncrypt.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGroupEncrypt.java index c8fc04b..b928063 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGroupEncrypt.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGroupEncrypt.java @@ -2,6 +2,7 @@ package net.knarcraft.bookswithoutborders.command; import net.knarcraft.bookswithoutborders.config.translation.Translatable; import net.knarcraft.bookswithoutborders.encryption.EncryptionStyle; +import net.knarcraft.bookswithoutborders.utility.EncryptionUtil; import net.knarcraft.knarlib.formatting.FormatBuilder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -34,9 +35,8 @@ public class CommandGroupEncrypt extends CommandEncrypt implements TabExecutor { } //Check if book is already group encrypted - List lore = bookMetadata.getLore(); - if (bookMetadata.hasLore() && lore != null && lore.get(0).contains(" encrypted]")) { - new FormatBuilder(Translatable.ERROR_GROUP_ENCRYPTED_ALREADY).error(sender); + if (EncryptionUtil.isEncrypted(bookMetadata)) { + new FormatBuilder(Translatable.ERROR_ENCRYPTED_ALREADY).error(sender); return true; } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Translatable.java b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Translatable.java index 77d8564..8e11604 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Translatable.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Translatable.java @@ -281,7 +281,7 @@ public enum Translatable implements TranslatableMessage { /** * The error displayed when trying to attempt a group encrypted book twice */ - ERROR_GROUP_ENCRYPTED_ALREADY, + ERROR_ENCRYPTED_ALREADY, /** * The error displayed when a book fails to be loaded diff --git a/src/main/java/net/knarcraft/bookswithoutborders/listener/SignEventListener.java b/src/main/java/net/knarcraft/bookswithoutborders/listener/SignEventListener.java index f8dabe1..61d8b11 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/listener/SignEventListener.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/listener/SignEventListener.java @@ -12,6 +12,8 @@ import net.knarcraft.bookswithoutborders.state.SignType; import net.knarcraft.bookswithoutborders.utility.BookFileUtil; import net.knarcraft.bookswithoutborders.utility.BookLoaderUtil; import net.knarcraft.bookswithoutborders.utility.EncryptedBookUtil; +import net.knarcraft.bookswithoutborders.utility.EncryptionUtil; +import net.knarcraft.bookswithoutborders.utility.InventoryUtil; import net.knarcraft.knarlib.formatting.FormatBuilder; import net.knarcraft.knarlib.util.SignHelper; import net.md_5.bungee.api.ChatColor; @@ -29,6 +31,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.BookMeta; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -173,11 +176,18 @@ public class SignEventListener implements Listener { if (heldItemType != Material.WRITTEN_BOOK) { return; } + BookMeta meta = InventoryUtil.getHeldBookMetadata(player, ItemSlot.fromEquipmentSlot(hand)); + if (meta != null && EncryptionUtil.isEncrypted(meta)) { + new FormatBuilder(Translatable.ERROR_ENCRYPTED_ALREADY).error(player); + return; + } + player.closeInventory(); - ItemStack eBook = EncryptedBookUtil.encryptBook(player, ItemSlot.fromEquipmentSlot(hand), getPassword(lines), + ItemStack encryptedBook = EncryptedBookUtil.encryptBook(player, ItemSlot.fromEquipmentSlot(hand), getPassword(lines), getEncryptionStyle(lines), false); - if (eBook != null) { - player.getInventory().setItem(hand, eBook); + if (encryptedBook != null) { + EncryptionUtil.markEncrypted(encryptedBook); + player.getInventory().setItem(hand, encryptedBook); } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/utility/EncryptedBookUtil.java b/src/main/java/net/knarcraft/bookswithoutborders/utility/EncryptedBookUtil.java index 8debada..b45b936 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/utility/EncryptedBookUtil.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/utility/EncryptedBookUtil.java @@ -114,7 +114,7 @@ public final class EncryptedBookUtil { * @return

An encrypted version of the book

*/ @Nullable - public static ItemStack encryptBook(Player player, @NotNull ItemSlot itemSlot, @NotNull String key, + public static ItemStack encryptBook(@NotNull Player player, @NotNull ItemSlot itemSlot, @NotNull String key, @NotNull EncryptionStyle style, @NotNull String groupName, boolean preventAdminDecrypt) { BookMeta book = InventoryUtil.getHeldBookMetadata(player, itemSlot); diff --git a/src/main/java/net/knarcraft/bookswithoutborders/utility/EncryptionUtil.java b/src/main/java/net/knarcraft/bookswithoutborders/utility/EncryptionUtil.java index a960626..da439b5 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/utility/EncryptionUtil.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/utility/EncryptionUtil.java @@ -1,11 +1,16 @@ package net.knarcraft.bookswithoutborders.utility; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; import org.jetbrains.annotations.NotNull; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; import java.util.Base64; +import java.util.List; /** * A utility class for encryption-related tasks @@ -100,4 +105,42 @@ public final class EncryptionUtil { return data; } + /** + * Adds a lore line marking the book as encrypted + * + * @param itemStack

The book to mark as encrypted

+ */ + public static void markEncrypted(@NotNull ItemStack itemStack) { + BookMeta meta = (BookMeta) itemStack.getItemMeta(); + if (meta == null) { + return; + } + + List lore = meta.getLore(); + if (lore == null) { + lore = new ArrayList<>(); + } + lore.add(0, ChatColor.GRAY + "[Encrypted]"); + meta.setLore(lore); + itemStack.setItemMeta(meta); + } + + /** + * Checks whether the given item stack is an encrypted book + * + * @param meta

The meta of the book to check

+ * @return

True if the item is marked as an encrypted book

+ */ + public static boolean isEncrypted(@NotNull BookMeta meta) { + if (!meta.hasLore()) { + return false; + } + + List lore = meta.getLore(); + if (lore == null) { + return false; + } + return lore.get(0).equals(ChatColor.GRAY + "[Encrypted]") || lore.get(0).contains(" encrypted]"); + } + } diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml index 714cd7d..c009d49 100644 --- a/src/main/resources/strings.yml +++ b/src/main/resources/strings.yml @@ -72,7 +72,7 @@ en: ERROR_OUT_OF_RANGE_BOOK_PAGE: "The given page index is out of bounds!" ERROR_NO_BOOK_PAGE: "You must supply a page index" ERROR_GROUP_ENCRYPT_ARGUMENTS_MISSING: "You must specify a group name and key to encrypt a book!" - ERROR_GROUP_ENCRYPTED_ALREADY: "Book is already group encrypted!" + ERROR_ENCRYPTED_ALREADY: "Book is already encrypted!" ERROR_LOAD_FAILED: "Book failed to load!" ERROR_RELOAD_FAILED: | Reload Failed!