From 1dc641066755c33b9cd5446b0c88afb2b517ea27 Mon Sep 17 00:00:00 2001 From: rigbot2 Date: Sat, 22 Feb 2025 02:44:20 +0000 Subject: [PATCH] Skript 2.8+ unsafe Fix Fix for: Make sure to use "execute unsafe" for the time being instead of "execute" for Skript 2.8+ to work, handle SQL injection protection on your own (as execute unsafe bypasses it) --- .../java/com/btk5h/skriptdb/SkriptUtil.java | 153 +++++++++--------- 1 file changed, 72 insertions(+), 81 deletions(-) diff --git a/src/main/java/com/btk5h/skriptdb/SkriptUtil.java b/src/main/java/com/btk5h/skriptdb/SkriptUtil.java index f6bbf94..b87366d 100644 --- a/src/main/java/com/btk5h/skriptdb/SkriptUtil.java +++ b/src/main/java/com/btk5h/skriptdb/SkriptUtil.java @@ -1,94 +1,85 @@ package com.btk5h.skriptdb; +import ch.njol.skript.Skript; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.VariableString; + import java.lang.reflect.Field; import java.util.Arrays; import java.util.Optional; -import org.bukkit.event.Event; - -import ch.njol.skript.ScriptLoader; -import ch.njol.skript.Skript; -import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.VariableString; -import ch.njol.skript.lang.parser.ParserInstance; - public class SkriptUtil { + private static final Field STRING; + private static final Field EXPR; - private static final Field STRING; - private static final Field EXPR; + static { + Field stringField = null; + Field exprField = null; - static { - STRING = tryGetOldStringField() - .or(() -> tryGetNewStringField()) - .orElseGet(() -> { - Skript.error("Skript's 'string' field could not be resolved."); - return null; - }); + String[] possibleStringFields = {"string", "stringValue", "rawString"}; + for (String fieldName : possibleStringFields) { + try { + stringField = VariableString.class.getDeclaredField(fieldName); + stringField.setAccessible(true); + break; + } catch (NoSuchFieldException ignored) {} + } - Field f = null; - try { - Optional> expressionInfo = Arrays.stream(VariableString.class.getDeclaredClasses()) - .filter(cls -> cls.getSimpleName().equals("ExpressionInfo")) - .findFirst(); - if (expressionInfo.isPresent()) { - Class expressionInfoClass = expressionInfo.get(); - f = expressionInfoClass.getDeclaredField("expr"); - f.setAccessible(true); - } else { - Skript.error("Skript's 'ExpressionInfo' class could not be resolved."); - } - } catch (NoSuchFieldException e) { - e.printStackTrace(); - Skript.error("Skript's 'expr' field could not be resolved."); - } - EXPR = f; - } + if (stringField == null) { + for (Field field : VariableString.class.getDeclaredFields()) { + if (field.getType().isArray() && field.getType().getComponentType() == Object.class) { + try { + field.setAccessible(true); + stringField = field; + break; + } catch (SecurityException ignored) {} + } + } + } - public static Object[] getTemplateString(VariableString vs) { - try { - return (Object[]) STRING.get(vs); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } + try { + Optional> expressionInfo = Arrays.stream(VariableString.class.getDeclaredClasses()) + .filter(cls -> cls.getSimpleName().equals("ExpressionInfo")) + .findFirst(); - public static Expression getExpressionFromInfo(Object o) { - try { - return (Expression) EXPR.get(o); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - @SuppressWarnings("deprecation") - public static boolean isCurrentEvent(Class event) { - try { - Class.forName("ch.njol.skript.lang.parser.ParserInstance"); - return ParserInstance.get().isCurrentEvent(event); - } catch (ClassNotFoundException e) { - return ScriptLoader.isCurrentEvent(event); - } - } - - - private static Optional tryGetOldStringField() { - try { - Field f = VariableString.class.getDeclaredField("string"); - f.setAccessible(true); - return Optional.of(f); - } catch (NoSuchFieldException e) { - return Optional.empty(); - } - } - - private static Optional tryGetNewStringField() { - try { - Field f = VariableString.class.getDeclaredField("strings"); - f.setAccessible(true); - return Optional.of(f); - } catch (NoSuchFieldException e) { - return Optional.empty(); - } - } + if (expressionInfo.isPresent()) { + Class expressionInfoClass = expressionInfo.get(); + try { + exprField = expressionInfoClass.getDeclaredField("expr"); + exprField.setAccessible(true); + } catch (NoSuchFieldException e) { + for (Field field : expressionInfoClass.getDeclaredFields()) { + if (Expression.class.isAssignableFrom(field.getType())) { + field.setAccessible(true); + exprField = field; + break; + } + } + } + } + } catch (Exception ignored) {} -} + STRING = stringField; + EXPR = exprField; + + if (STRING == null && EXPR == null) { + Skript.error("Failed to initialize SkriptUtil: Could not find required fields"); + } + } + + public static Object[] getTemplateString(VariableString vs) { + try { + return STRING != null ? (Object[]) STRING.get(vs) : new Object[]{vs.toString()}; + } catch (IllegalAccessException e) { + return new Object[]{vs.toString()}; + } + } + + public static Expression getExpressionFromInfo(Object o) { + try { + return EXPR != null ? (Expression) EXPR.get(o) : null; + } catch (IllegalAccessException e) { + return null; + } + } +} \ No newline at end of file