Remap injected jars by findResource (#153)
This commit is contained in:
parent
2f4e7e9a58
commit
8822c89bb0
|
@ -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,15 +68,27 @@ 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;
|
||||||
classBytes = ByteStreams.toByteArray(is);
|
CodeSigner[] signers;
|
||||||
} catch (IOException ex) {
|
try {
|
||||||
throw new ClassNotFoundException(name, ex);
|
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);
|
classBytes = SwitchTableFixer.INSTANCE.processClass(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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
FileUtils.forceDelete(DUMP);
|
try {
|
||||||
|
FileUtils.forceDelete(DUMP);
|
||||||
|
} catch (IOException ignored) {
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
DUMP = null;
|
DUMP = null;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user