mirror of
https://github.com/unmojang/authlib-injector.git
synced 2025-10-03 08:11:04 -04:00
Move dump class feature into DumpClassListener
This commit is contained in:
parent
1f5605c973
commit
1d73a05413
@ -13,11 +13,13 @@ import java.net.HttpURLConnection;
|
|||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import moe.yushi.authlibinjector.transform.ClassTransformer;
|
import moe.yushi.authlibinjector.transform.ClassTransformer;
|
||||||
|
import moe.yushi.authlibinjector.transform.DumpClassListener;
|
||||||
import moe.yushi.authlibinjector.transform.SkinWhitelistTransformUnit;
|
import moe.yushi.authlibinjector.transform.SkinWhitelistTransformUnit;
|
||||||
import moe.yushi.authlibinjector.transform.LocalYggdrasilApiTransformUnit;
|
import moe.yushi.authlibinjector.transform.LocalYggdrasilApiTransformUnit;
|
||||||
import moe.yushi.authlibinjector.transform.RemoteYggdrasilTransformUnit;
|
import moe.yushi.authlibinjector.transform.RemoteYggdrasilTransformUnit;
|
||||||
@ -260,9 +262,14 @@ public final class AuthlibInjector {
|
|||||||
|
|
||||||
private static ClassTransformer createTransformer(YggdrasilConfiguration config) {
|
private static ClassTransformer createTransformer(YggdrasilConfiguration config) {
|
||||||
ClassTransformer transformer = new ClassTransformer();
|
ClassTransformer transformer = new ClassTransformer();
|
||||||
transformer.debugSaveClass = "true".equals(System.getProperty(PROP_DUMP_CLASS));
|
|
||||||
for (String ignore : nonTransformablePackages)
|
for (String ignore : nonTransformablePackages) {
|
||||||
transformer.ignores.add(ignore);
|
transformer.ignores.add(ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("true".equals(System.getProperty(PROP_DUMP_CLASS))) {
|
||||||
|
transformer.listeners.add(new DumpClassListener(Paths.get("").toAbsolutePath()));
|
||||||
|
}
|
||||||
|
|
||||||
if (!"true".equals(System.getProperty(PROP_DISABLE_HTTPD))) {
|
if (!"true".equals(System.getProperty(PROP_DISABLE_HTTPD))) {
|
||||||
transformer.units.add(new LocalYggdrasilApiTransformUnit(config));
|
transformer.units.add(new LocalYggdrasilApiTransformUnit(config));
|
||||||
|
@ -2,13 +2,8 @@ package moe.yushi.authlibinjector.transform;
|
|||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.instrument.ClassFileTransformer;
|
import java.lang.instrument.ClassFileTransformer;
|
||||||
import java.lang.instrument.IllegalClassFormatException;
|
import java.lang.instrument.IllegalClassFormatException;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.nio.file.StandardOpenOption;
|
|
||||||
import java.security.ProtectionDomain;
|
import java.security.ProtectionDomain;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -27,7 +22,6 @@ public class ClassTransformer implements ClassFileTransformer {
|
|||||||
public List<TransformUnit> units = new ArrayList<>();
|
public List<TransformUnit> units = new ArrayList<>();
|
||||||
public List<ClassLoadingListener> listeners = new ArrayList<>();
|
public List<ClassLoadingListener> listeners = new ArrayList<>();
|
||||||
public Set<String> ignores = new HashSet<>();
|
public Set<String> ignores = new HashSet<>();
|
||||||
public boolean debugSaveClass;
|
|
||||||
|
|
||||||
private static class TransformHandle {
|
private static class TransformHandle {
|
||||||
|
|
||||||
@ -102,31 +96,15 @@ public class ClassTransformer implements ClassFileTransformer {
|
|||||||
units.forEach(handle::accept);
|
units.forEach(handle::accept);
|
||||||
listeners.forEach(it -> it.onClassLoading(loader, className, handle.getFinalResult(), handle.getAppliedTransformers()));
|
listeners.forEach(it -> it.onClassLoading(loader, className, handle.getFinalResult(), handle.getAppliedTransformers()));
|
||||||
|
|
||||||
if (handle.getTransformResult().isPresent()) {
|
Optional<byte[]> transformResult = handle.getTransformResult();
|
||||||
byte[] classBuffer = handle.getTransformResult().get();
|
if (!transformResult.isPresent()) {
|
||||||
if (debugSaveClass) {
|
|
||||||
saveClassFile(className, classBuffer);
|
|
||||||
}
|
|
||||||
return classBuffer;
|
|
||||||
} else {
|
|
||||||
Logging.TRANSFORM_SKIPPED.fine("No transformation is applied to [" + className + "]");
|
Logging.TRANSFORM_SKIPPED.fine("No transformation is applied to [" + className + "]");
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
return transformResult.orElse(null);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Logging.TRANSFORM.log(Level.WARNING, "Failed to transform [" + internalClassName + "]", e);
|
Logging.TRANSFORM.log(Level.WARNING, "Failed to transform [" + internalClassName + "]", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveClassFile(String className, byte[] classBuffer) {
|
|
||||||
Path dumpFile = Paths.get(className + "_dump.class");
|
|
||||||
try {
|
|
||||||
Files.write(dumpFile, classBuffer, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
|
||||||
Logging.TRANSFORM.info("Transformed class is dumped to [" + dumpFile + "]");
|
|
||||||
} catch (IOException e) {
|
|
||||||
Logging.TRANSFORM.log(Level.WARNING, "Failed to dump class [" + className + "]", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
package moe.yushi.authlibinjector.transform;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import moe.yushi.authlibinjector.util.Logging;
|
||||||
|
|
||||||
|
public class DumpClassListener implements ClassLoadingListener {
|
||||||
|
|
||||||
|
private Path outputPath;
|
||||||
|
|
||||||
|
public DumpClassListener(Path outputPath) {
|
||||||
|
this.outputPath = outputPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClassLoading(ClassLoader classLoader, String className, byte[] bytecode, List<TransformUnit> appliedTransformers) {
|
||||||
|
if (!appliedTransformers.isEmpty()) {
|
||||||
|
Path dumpFile = outputPath.resolve(className + "_dump.class");
|
||||||
|
try {
|
||||||
|
Files.write(dumpFile, bytecode, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
||||||
|
Logging.TRANSFORM.info("Transformed class is dumped to [" + dumpFile + "]");
|
||||||
|
} catch (IOException e) {
|
||||||
|
Logging.TRANSFORM.log(Level.WARNING, "Failed to dump class [" + className + "]", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user