diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index 6ce129262..8192c065a 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -13,9 +13,11 @@ import cpw.mods.fml.common.event.FMLServerStoppedEvent; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import foxz.command.CommandNoppes; import io.github.somehussar.janinoloader.api.IDynamicCompiler; import io.github.somehussar.janinoloader.api.IDynamicCompilerBuilder; +import io.github.somehussar.janinoloader.api.delegates.LoadClassCondition; import kamkeel.npcs.addon.AddonManager; import kamkeel.npcs.command.CommandKamkeel; import kamkeel.npcs.command.profile.CommandProfile; @@ -98,9 +100,16 @@ import noppes.npcs.entity.old.EntityNpcNagaFemale; import noppes.npcs.entity.old.EntityNpcNagaMale; import noppes.npcs.entity.old.EntityNpcSkeleton; import noppes.npcs.scripted.NpcAPI; +import somehussar.janino.AdvancedClassFilter; import java.io.File; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.function.Consumer; +import java.util.regex.Pattern; +import java.util.stream.Collectors; @Mod(modid = "customnpcs", name = "CustomNPC+", version = "1.10.2") public class CustomNpcs { @@ -139,12 +148,21 @@ public class CustomNpcs { public static MinecraftServer Server; + private static IDynamicCompiler jls; + @SideOnly(Side.CLIENT) + private static IDynamicCompiler clientJaninoCompiler; + @SideOnly(Side.CLIENT) + private final static Set> clientClassFilterConsumer = new HashSet<>(); + + @SideOnly(Side.CLIENT) + public static void addClassesToClientClassFilter(Consumer consumer) { + clientClassFilterConsumer.add(consumer); + } + public CustomNpcs() { instance = this; } - private static IDynamicCompiler jls; - public static IDynamicCompiler getDynamicCompiler() { if (jls == null) { jls = IDynamicCompilerBuilder.createBuilder().getCompiler(); @@ -153,6 +171,26 @@ public class CustomNpcs { return jls; } + @SideOnly(Side.CLIENT) + public static IDynamicCompiler getClientCompiler() { + + if (clientJaninoCompiler == null) { + AdvancedClassFilter filter = new AdvancedClassFilter() + .addRegexes("noppes\\.npcs\\.api\\..*") + .banRegexes(".*ClassLoader.*", + ".*File*."); + + for (Consumer consumer : clientClassFilterConsumer) { + consumer.accept(filter); + } + + + clientJaninoCompiler = IDynamicCompilerBuilder.createBuilder().setClassFilter(filter).getCompiler(); + } + + return clientJaninoCompiler; + } + @EventHandler public void load(FMLPreInitializationEvent ev) { PacketHandler.Instance = new PacketHandler(); diff --git a/src/main/java/somehussar/janino/AdvancedClassFilter.java b/src/main/java/somehussar/janino/AdvancedClassFilter.java new file mode 100644 index 000000000..fb1fac6e8 --- /dev/null +++ b/src/main/java/somehussar/janino/AdvancedClassFilter.java @@ -0,0 +1,54 @@ +package somehussar.janino; + +import io.github.somehussar.janinoloader.api.delegates.LoadClassCondition; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class AdvancedClassFilter implements LoadClassCondition { + + private final Set allowedClasses = new HashSet<>(); + private final Set allowedWildCards = new HashSet<>(); + private final Set bannedClasses = new HashSet<>(); + private final Set bannedWildCards = new HashSet<>(); + + public AdvancedClassFilter() { + addClasses("java.io.Serializable", "java.util.Iterator"); + addRegexes("java\\.lang\\.."); + } + + public AdvancedClassFilter addRegexes(String... classRegexes) { + allowedWildCards.addAll(Arrays.stream(classRegexes).map(Pattern::compile).collect(Collectors.toList())); + return this; + } + public AdvancedClassFilter banRegexes(String... classRegexes) { + bannedWildCards.addAll(Arrays.stream(classRegexes).map(Pattern::compile).collect(Collectors.toList())); + return this; + } + public AdvancedClassFilter addClasses(String... classPath) { + allowedClasses.addAll(Arrays.asList(classPath)); + return this; + } + public AdvancedClassFilter banClasses(String... classPath) { + bannedClasses.addAll(Arrays.asList(classPath)); + return this; + } + + + @Override + public boolean isValid(String name) { + if (bannedClasses.contains(name)) + return false; + if (bannedWildCards.stream().anyMatch(pattern -> pattern.matcher(name).matches())) + return false; + + if (name.startsWith("java.lang")) return true; + + if (allowedClasses.contains(name)) return true; + + return allowedWildCards.stream().anyMatch(pattern -> pattern.matcher(name).matches()); + } +}