From abb2b8be2a06472cf404cd5023d04b76c3fb54bb Mon Sep 17 00:00:00 2001 From: Dawson <30784509+funkemunky@users.noreply.github.com> Date: Tue, 30 Aug 2022 09:37:50 -0400 Subject: [PATCH] Improvements --- .gitignore | 4 ++ API/API.iml | 22 ++++---- .../dev/brighten/ac/utils/ClassScanner.java | 51 ++++++++++++++++--- 3 files changed, 57 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index fedc12e..c7ca6f4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,8 @@ local.properties # PyDev specific (Python IDE for Eclipse) *.pydevproject +*.iml + # CDT-specific (C/C++ Development Tooling) .cproject @@ -272,3 +274,5 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/java,maven,intellij+all,eclipse,linux,macos,windows +*.iml +API/API.iml diff --git a/API/API.iml b/API/API.iml index 61e4724..fa63d4b 100644 --- a/API/API.iml +++ b/API/API.iml @@ -1,16 +1,12 @@ - - - - - - - - - - - - - + + + + + + SPIGOT + + + \ No newline at end of file diff --git a/src/main/java/dev/brighten/ac/utils/ClassScanner.java b/src/main/java/dev/brighten/ac/utils/ClassScanner.java index e26eba2..cb9c0a1 100644 --- a/src/main/java/dev/brighten/ac/utils/ClassScanner.java +++ b/src/main/java/dev/brighten/ac/utils/ClassScanner.java @@ -4,6 +4,7 @@ import dev.brighten.ac.Anticheat; import dev.brighten.ac.utils.annotation.Init; import dev.brighten.ac.utils.reflections.Reflections; import dev.brighten.ac.utils.reflections.types.WrappedClass; +import jdk.tools.jlink.resources.plugins; import org.bukkit.Bukkit; import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.AnnotationNode; @@ -30,19 +31,31 @@ public class ClassScanner { //TODO Get check classes too public static Set getClasses(Class annotationClass, String packageName) { - return getNames().stream().filter(pkg -> pkg.startsWith(packageName) && findClass(map.get(n), Init.class) != null) + Map map = (Map) Anticheat.INSTANCE.getStuffs(); + return getNames().stream().filter(pkg -> pkg.startsWith(packageName) && findClass(map.get(pkg), annotationClass) != null) .map(Reflections::getClass).collect(Collectors.toSet()); } public static Set getNames() { Map map = (Map) Anticheat.INSTANCE.getStuffs(); - return map.keySet().stream().filter(n -> { - return !n.endsWith(".yml") && !n.endsWith(".xml") && !n.endsWith(".") && !n.endsWith(".properties") - && !n.contains("dev.brighten.ac.packet") - && Character.isLetterOrDigit(n.charAt(n.length() - 1)) - && findClass(map.get(n), Init.class) != null; - }).collect(Collectors.toSet()); + Set nameSet = new HashSet<>(); + + for (String loadedClass : Anticheat.INSTANCE.getLoadedClasses()) { + InputStream stream = Anticheat.INSTANCE.getClassLoader2().getResourceAsStream(loadedClass); + + if(findClass(stream, Init.class) != null) { + nameSet.add(loadedClass); + } + } + + map.keySet().stream().filter(n -> !n.endsWith(".yml") + && !n.endsWith(".xml") && !n.endsWith(".") && !n.endsWith(".properties") + && !n.contains("dev.brighten.ac.packet") + && Character.isLetterOrDigit(n.charAt(n.length() - 1)) + && findClass(map.get(n), Init.class) != null).forEach(nameSet::add); + + return nameSet; } public static String findClass(byte[] array, Class annotationClass) { @@ -69,6 +82,30 @@ public class ClassScanner { return null; } + public static String findClass(InputStream stream, Class annotationClass) { + try { + ClassReader reader = new ClassReader(stream); + ClassNode classNode = new ClassNode(); + reader.accept(classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + String className = classNode.name.replace('/', '.'); + + final String anName = annotationClass.getName().replace(".", "/"); + if (classNode.visibleAnnotations != null) { + for (Object node : classNode.visibleAnnotations) { + AnnotationNode annotation = (AnnotationNode) node; + if (annotation.desc + .equals("L" + anName + ";")) { + return className; + } + } + } + } catch (Exception e) { + //Bukkit.getLogger().info("Failed to scan"); + //e.printStackTrace(); + } + return null; + } + private static HashSet newHashSet(E... elements) { HashSet set = new HashSet<>(); Collections.addAll(set, elements);