Remap injected jars by findResource (#153)

This commit is contained in:
IzzelAliz 2021-02-10 23:18:54 +08:00
parent 2f4e7e9a58
commit 8822c89bb0
2 changed files with 27 additions and 13 deletions

View File

@ -16,13 +16,13 @@ import org.spongepowered.asm.mixin.Shadow;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.net.URLConnection;
import java.security.CodeSigner; import java.security.CodeSigner;
import java.security.CodeSource; import java.security.CodeSource;
import java.util.Map; import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.Manifest; import java.util.jar.Manifest;
@Mixin(targets = "org.bukkit.plugin.java.PluginClassLoader", remap = false) @Mixin(targets = "org.bukkit.plugin.java.PluginClassLoader", remap = false)
@ -31,7 +31,6 @@ public class PluginClassLoaderMixin extends URLClassLoader implements RemappingC
// @formatter:off // @formatter:off
@Shadow @Final private Map<String, Class<?>> classes; @Shadow @Final private Map<String, Class<?>> classes;
@Shadow @Final private JavaPluginLoader loader; @Shadow @Final private JavaPluginLoader loader;
@Shadow @Final private JarFile jar;
@Shadow @Final private PluginDescriptionFile description; @Shadow @Final private PluginDescriptionFile description;
@Shadow @Final private Manifest manifest; @Shadow @Final private Manifest manifest;
@Shadow @Final private URL url; @Shadow @Final private URL url;
@ -69,16 +68,28 @@ public class PluginClassLoaderMixin extends URLClassLoader implements RemappingC
if (result == null) { if (result == null) {
String path = name.replace('.', '/').concat(".class"); String path = name.replace('.', '/').concat(".class");
JarEntry entry = jar.getJarEntry(path); URL url = this.findResource(path);
if (entry != null) { if (url != null) {
byte[] classBytes; byte[] classBytes;
try (InputStream is = jar.getInputStream(entry)) { URLConnection connection;
CodeSigner[] signers;
try {
connection = url.openConnection();
try (InputStream is = connection.getInputStream()) {
classBytes = ByteStreams.toByteArray(is); classBytes = ByteStreams.toByteArray(is);
if (connection instanceof JarURLConnection) {
signers = ((JarURLConnection) connection).getJarEntry().getCodeSigners();
} else {
signers = new CodeSigner[0];
}
} catch (IOException ex) { } catch (IOException ex) {
throw new ClassNotFoundException(name, ex); throw new ClassNotFoundException(name, ex);
} }
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
classBytes = SwitchTableFixer.INSTANCE.processClass(classBytes); classBytes = SwitchTableFixer.INSTANCE.processClass(classBytes);
classBytes = Bukkit.getUnsafe().processClass(description, path, classBytes); classBytes = Bukkit.getUnsafe().processClass(description, path, classBytes);
@ -90,7 +101,7 @@ public class PluginClassLoaderMixin extends URLClassLoader implements RemappingC
if (getPackage(pkgName) == null) { if (getPackage(pkgName) == null) {
try { try {
if (manifest != null) { if (manifest != null) {
definePackage(pkgName, manifest, url); definePackage(pkgName, manifest, this.url);
} else { } else {
definePackage(pkgName, null, null, null, null, null, null, null); 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(this.url, signers);
CodeSource source = new CodeSource(url, signers);
result = defineClass(name, classBytes, 0, classBytes.length, source); result = defineClass(name, classBytes, 0, classBytes.length, source);
} }

View File

@ -13,6 +13,7 @@ import org.apache.commons.io.FileUtils;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -32,7 +33,10 @@ public class ArclightRemapper {
if (!DUMP.exists()) { if (!DUMP.exists()) {
DUMP.mkdirs(); DUMP.mkdirs();
} }
try {
FileUtils.forceDelete(DUMP); FileUtils.forceDelete(DUMP);
} catch (IOException ignored) {
}
} else { } else {
DUMP = null; DUMP = null;
} }