From b6f41a0df58bb35efeabd9583ee80f5bf4e5dd2c Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 16 Mar 2025 14:03:21 +0000 Subject: [PATCH] Fix several issues with char/paste event validation - Fix isValidClipboard always returning true. - Fix characters >=128 being rejected. We changed the signature from a byte to an int in 0f123b5efdca5f277f2c15208b9241d3fb9ca8fa, but didn't update all call sites. Valhalla cannot come soon enough. I would love to be able to have (cheap) wrapper classes for some of these types. See Zeus-guy's comments in #860. --- .../shared/computer/menu/ServerInputState.java | 2 +- .../dan200/computercraft/core/util/StringUtil.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/menu/ServerInputState.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/menu/ServerInputState.java index 4bfeeba2c..3079f5be8 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/menu/ServerInputState.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/menu/ServerInputState.java @@ -74,7 +74,7 @@ public class ServerInputState im } private static boolean isValidClipboard(ByteBuffer buffer) { - for (int i = buffer.remaining(), max = buffer.limit(); i < max; i++) { + for (int i = buffer.position(), max = buffer.limit(); i < max; i++) { if (!StringUtil.isTypableChar(buffer.get(i))) return false; } return true; diff --git a/projects/core/src/main/java/dan200/computercraft/core/util/StringUtil.java b/projects/core/src/main/java/dan200/computercraft/core/util/StringUtil.java index a3af9376c..234127244 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/util/StringUtil.java +++ b/projects/core/src/main/java/dan200/computercraft/core/util/StringUtil.java @@ -70,6 +70,17 @@ public final class StringUtil { }; } + /** + * Check if a character is capable of being input and passed to a {@linkplain ComputerEvents#charTyped(ComputerEvents.Receiver, byte) + * "char" event}. + * + * @param chr The character to check. + * @return Whether this character can be typed. + */ + public static boolean isTypableChar(byte chr) { + return isTypableChar(chr & 0xFF); + } + /** * Check if a character is capable of being input and passed to a {@linkplain ComputerEvents#charTyped(ComputerEvents.Receiver, byte) * "char" event}.