From 8822c89bb019949d9e5e3149ddfb8f9b98e61444 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Wed, 10 Feb 2021 23:18:54 +0800 Subject: [PATCH] Remap injected jars by findResource (#153) --- .../mixin/bukkit/PluginClassLoaderMixin.java | 34 ++++++++++++------- .../mod/util/remapper/ArclightRemapper.java | 6 +++- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/PluginClassLoaderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/PluginClassLoaderMixin.java index feb7e7fb..c4a296d2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/PluginClassLoaderMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/PluginClassLoaderMixin.java @@ -16,13 +16,13 @@ import org.spongepowered.asm.mixin.Shadow; import java.io.IOException; import java.io.InputStream; +import java.net.JarURLConnection; import java.net.URL; import java.net.URLClassLoader; +import java.net.URLConnection; import java.security.CodeSigner; import java.security.CodeSource; import java.util.Map; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; import java.util.jar.Manifest; @Mixin(targets = "org.bukkit.plugin.java.PluginClassLoader", remap = false) @@ -31,7 +31,6 @@ public class PluginClassLoaderMixin extends URLClassLoader implements RemappingC // @formatter:off @Shadow @Final private Map> classes; @Shadow @Final private JavaPluginLoader loader; - @Shadow @Final private JarFile jar; @Shadow @Final private PluginDescriptionFile description; @Shadow @Final private Manifest manifest; @Shadow @Final private URL url; @@ -69,15 +68,27 @@ public class PluginClassLoaderMixin extends URLClassLoader implements RemappingC if (result == null) { String path = name.replace('.', '/').concat(".class"); - JarEntry entry = jar.getJarEntry(path); + URL url = this.findResource(path); - if (entry != null) { + if (url != null) { byte[] classBytes; - try (InputStream is = jar.getInputStream(entry)) { - classBytes = ByteStreams.toByteArray(is); - } catch (IOException ex) { - throw new ClassNotFoundException(name, ex); + URLConnection connection; + CodeSigner[] signers; + try { + connection = url.openConnection(); + try (InputStream is = connection.getInputStream()) { + classBytes = ByteStreams.toByteArray(is); + if (connection instanceof JarURLConnection) { + signers = ((JarURLConnection) connection).getJarEntry().getCodeSigners(); + } else { + signers = new CodeSigner[0]; + } + } catch (IOException ex) { + throw new ClassNotFoundException(name, ex); + } + } catch (IOException e) { + throw new ClassNotFoundException(name, e); } classBytes = SwitchTableFixer.INSTANCE.processClass(classBytes); @@ -90,7 +101,7 @@ public class PluginClassLoaderMixin extends URLClassLoader implements RemappingC if (getPackage(pkgName) == null) { try { if (manifest != null) { - definePackage(pkgName, manifest, url); + definePackage(pkgName, manifest, this.url); } else { definePackage(pkgName, null, null, null, null, null, null, null); } @@ -102,8 +113,7 @@ public class PluginClassLoaderMixin extends URLClassLoader implements RemappingC } } - CodeSigner[] signers = entry.getCodeSigners(); - CodeSource source = new CodeSource(url, signers); + CodeSource source = new CodeSource(this.url, signers); result = defineClass(name, classBytes, 0, classBytes.length, source); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java index 2d4d0efa..d6d63e4e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java @@ -13,6 +13,7 @@ import org.apache.commons.io.FileUtils; import java.io.BufferedReader; import java.io.File; +import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; @@ -32,7 +33,10 @@ public class ArclightRemapper { if (!DUMP.exists()) { DUMP.mkdirs(); } - FileUtils.forceDelete(DUMP); + try { + FileUtils.forceDelete(DUMP); + } catch (IOException ignored) { + } } else { DUMP = null; }