From a3d75bfaec69e76746c4a24f2670ee77cd07c93a Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 13 May 2024 10:31:21 +0100 Subject: [PATCH] fix: more robust validation for filter text --- .../ftbfiltersystem/FilterSystemCommands.java | 18 +++++++++++------- .../gui/AbstractItemEditorConfigScreen.java | 4 +--- .../filter/ExpressionFilter.java | 7 ++++--- .../registry/item/SmartFilterItem.java | 2 ++ .../ftbfiltersystem/util/FilterParser.java | 9 ++++++++- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/FilterSystemCommands.java b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/FilterSystemCommands.java index 3d5d0e0..7b8342b 100644 --- a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/FilterSystemCommands.java +++ b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/FilterSystemCommands.java @@ -105,13 +105,17 @@ public static int tryMatch(CommandSourceStack source) throws CommandSyntaxExcept throw NO_OFFHAND_ITEM.create(); } - SmartFilter filter = FilterParser.parse(SmartFilterItem.getFilterString(getHeldFilter(source))); - if (filter.test(offhandItem)) { - source.sendSuccess(() -> TICK_MARK.copy().append(Component.translatable("ftbfiltersystem.message.matched", offhandItem.getDisplayName())), false); - return 1; - } else { - source.sendSuccess(() -> X_MARK.copy().append(Component.translatable("ftbfiltersystem.message.not_matched", offhandItem.getDisplayName())), false); - return 0; + try { + SmartFilter filter = FilterParser.parse(SmartFilterItem.getFilterString(getHeldFilter(source))); + if (filter.test(offhandItem)) { + source.sendSuccess(() -> TICK_MARK.copy().append(Component.translatable("ftbfiltersystem.message.matched", offhandItem.getDisplayName())), false); + return 1; + } else { + source.sendSuccess(() -> X_MARK.copy().append(Component.translatable("ftbfiltersystem.message.not_matched", offhandItem.getDisplayName())), false); + return 0; + } + } catch (FilterException e) { + throw PARSE_FAILED.create(e.getMessage()); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/client/gui/AbstractItemEditorConfigScreen.java b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/client/gui/AbstractItemEditorConfigScreen.java index 41a302d..36d7f93 100644 --- a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/client/gui/AbstractItemEditorConfigScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/client/gui/AbstractItemEditorConfigScreen.java @@ -30,7 +30,6 @@ public AbstractItemEditorConfigScreen(T filter, AbstractFilterScreen parentScree private CustomStringWidget statusLine; private final List itemWidgets = new ArrayList<>(); protected Component customHoverName = null; -// protected Component statusMsg = Component.empty(); @Override protected void init() { @@ -74,8 +73,6 @@ public void render(GuiGraphics guiGraphics, int pMouseX, int pMouseY, float pPar super.render(guiGraphics, pMouseX, pMouseY, pPartialTick); guiGraphics.renderOutline(leftPos + 7, topPos + 109, 164, 74, 0xFFA0A0A0); -// int w = font.width(statusMsg); -// guiGraphics.drawString(font, statusMsg, leftPos + guiWidth - (w + 8), topPos + 98, 0x404040, false); } protected abstract Predicate inventoryChecker(); @@ -89,6 +86,7 @@ protected void setStatus(boolean ok, Component message, String detail) { } protected abstract String serialize(ItemStack stack); + private class SearchItemWidget extends ItemWidget { public SearchItemWidget(int row, int col) { diff --git a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/filter/ExpressionFilter.java b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/filter/ExpressionFilter.java index 6723c41..1afb8e8 100644 --- a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/filter/ExpressionFilter.java +++ b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/filter/ExpressionFilter.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbfiltersystem.filter; import dev.ftb.mods.ftbfiltersystem.api.FTBFilterSystemAPI; +import dev.ftb.mods.ftbfiltersystem.api.FilterException; import dev.ftb.mods.ftbfiltersystem.api.filter.AbstractSmartFilter; import dev.ftb.mods.ftbfiltersystem.api.filter.SmartFilter; import dev.ftb.mods.ftbfiltersystem.util.FilterParser; @@ -15,11 +16,11 @@ public class ExpressionFilter extends AbstractSmartFilter { private final String customName; private final SmartFilter parsedExpression; - public ExpressionFilter(SmartFilter.Compound parent) { + public ExpressionFilter(SmartFilter.Compound parent) throws FilterException { this(parent, ""); } - public ExpressionFilter(SmartFilter.Compound parent, String expression) { + public ExpressionFilter(SmartFilter.Compound parent, String expression) throws FilterException { super(parent); String[] parts = expression.split("/", 2); @@ -52,7 +53,7 @@ public Component getDisplayArg() { return customName.isEmpty() ? super.getDisplayArg() : Component.literal(customName); } - public static ExpressionFilter fromString(SmartFilter.Compound parent, String str) { + public static ExpressionFilter fromString(SmartFilter.Compound parent, String str) throws FilterException { return new ExpressionFilter(parent, str); } diff --git a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/registry/item/SmartFilterItem.java b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/registry/item/SmartFilterItem.java index 88c9fe8..33f3ef6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/registry/item/SmartFilterItem.java +++ b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/registry/item/SmartFilterItem.java @@ -16,6 +16,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -31,6 +32,7 @@ public static String getFilterString(ItemStack filterStack) { return filterStack.hasTag() ? filterStack.getTag().getString(FILTER_TAG_NAME) : ""; } + @NotNull public static SmartFilter getFilter(ItemStack filterStack) throws FilterException { return FilterParser.parse(getFilterString(filterStack)); } diff --git a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/util/FilterParser.java b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/util/FilterParser.java index 7ba4dc2..4cac7ba 100644 --- a/common/src/main/java/dev/ftb/mods/ftbfiltersystem/util/FilterParser.java +++ b/common/src/main/java/dev/ftb/mods/ftbfiltersystem/util/FilterParser.java @@ -6,15 +6,22 @@ import dev.ftb.mods.ftbfiltersystem.filter.compound.RootFilter; import dev.ftb.mods.ftbfiltersystem.registry.FilterRegistry; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; public class FilterParser { + @NotNull public static SmartFilter parse(String str) throws FilterException { - return FilterCache.INSTANCE.getOrCreateFilter(str); + SmartFilter filter = FilterCache.INSTANCE.getOrCreateFilter(str); + if (filter == null) { + throw new FilterException("invalid filter: " + str); + } + return filter; } + @NotNull static SmartFilter parseRaw(String str) throws FilterException { RootFilter root = new RootFilter(); root.getChildren().addAll(parseFilterList(root, str));