From d3fa2a77ebc44a458bf6515572145e3692f597eb Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 29 Apr 2020 23:25:43 +0800 Subject: [PATCH] Refactor packages & classes structure --- .../authlibinjector/AuthlibInjector.java | 2 +- .../transform/CallbackSupport.java | 4 +- .../transform/ClassTransformer.java | 98 ++++++------------- .../transform/ClassVersionException.java | 23 +++++ .../transform/ClassVersionTransformUnit.java | 59 +++++++++++ .../transform/TransformContext.java | 27 +++++ .../transform/TransformUnit.java | 12 +-- .../support/AuthlibLogInterceptor.java | 3 +- .../support/CitizensTransformer.java | 3 +- .../ConstantURLTransformUnit.java | 5 +- .../LaunchwrapperExclusionTransformer.java | 2 + .../transform/support/MC52974Workaround.java | 3 +- .../support/MC52974_1710Workaround.java | 3 +- .../support/MainArgumentsTransformer.java | 3 +- .../support/SkinWhitelistTransformUnit.java | 3 +- .../support/YggdrasilKeyTransformUnit.java | 3 +- 16 files changed, 162 insertions(+), 91 deletions(-) create mode 100644 src/main/java/moe/yushi/authlibinjector/transform/ClassVersionException.java create mode 100644 src/main/java/moe/yushi/authlibinjector/transform/ClassVersionTransformUnit.java create mode 100644 src/main/java/moe/yushi/authlibinjector/transform/TransformContext.java rename src/main/java/moe/yushi/authlibinjector/transform/{ => support}/ConstantURLTransformUnit.java (86%) diff --git a/src/main/java/moe/yushi/authlibinjector/AuthlibInjector.java b/src/main/java/moe/yushi/authlibinjector/AuthlibInjector.java index 5812fd4..46dd4ea 100644 --- a/src/main/java/moe/yushi/authlibinjector/AuthlibInjector.java +++ b/src/main/java/moe/yushi/authlibinjector/AuthlibInjector.java @@ -56,10 +56,10 @@ import moe.yushi.authlibinjector.httpd.QueryUUIDsFilter; import moe.yushi.authlibinjector.httpd.URLFilter; import moe.yushi.authlibinjector.httpd.URLProcessor; import moe.yushi.authlibinjector.transform.ClassTransformer; -import moe.yushi.authlibinjector.transform.ConstantURLTransformUnit; import moe.yushi.authlibinjector.transform.DumpClassListener; import moe.yushi.authlibinjector.transform.support.AuthlibLogInterceptor; import moe.yushi.authlibinjector.transform.support.CitizensTransformer; +import moe.yushi.authlibinjector.transform.support.ConstantURLTransformUnit; import moe.yushi.authlibinjector.transform.support.LaunchwrapperExclusionTransformer; import moe.yushi.authlibinjector.transform.support.MC52974Workaround; import moe.yushi.authlibinjector.transform.support.MC52974_1710Workaround; diff --git a/src/main/java/moe/yushi/authlibinjector/transform/CallbackSupport.java b/src/main/java/moe/yushi/authlibinjector/transform/CallbackSupport.java index 00cf9f1..81aea3e 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/CallbackSupport.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/CallbackSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -25,8 +25,6 @@ import org.objectweb.asm.Handle; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; -import moe.yushi.authlibinjector.transform.TransformUnit.TransformContext; - public final class CallbackSupport { private CallbackSupport() { } diff --git a/src/main/java/moe/yushi/authlibinjector/transform/ClassTransformer.java b/src/main/java/moe/yushi/authlibinjector/transform/ClassTransformer.java index 44b504f..91ed0fb 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/ClassTransformer.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/ClassTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -17,8 +17,6 @@ package moe.yushi.authlibinjector.transform; import static java.util.Collections.emptyList; -import static org.objectweb.asm.Opcodes.ASM7; - import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.security.ProtectionDomain; @@ -33,9 +31,7 @@ import java.util.logging.Level; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; - import moe.yushi.authlibinjector.AuthlibInjector; -import moe.yushi.authlibinjector.transform.TransformUnit.TransformContext; import moe.yushi.authlibinjector.util.Logging; public class ClassTransformer implements ClassFileTransformer { @@ -46,71 +42,39 @@ public class ClassTransformer implements ClassFileTransformer { public final List listeners = new CopyOnWriteArrayList<>(); public final Set ignores = Collections.newSetFromMap(new ConcurrentHashMap<>()); + private static class TransformContextImpl implements TransformContext { + + public boolean modifiedMark; + public int minVersionMark = -1; + public int upgradedVersionMark = -1; + + @Override + public void markModified() { + modifiedMark = true; + } + + @Override + public void requireMinimumClassVersion(int version) { + if (this.minVersionMark < version) { + this.minVersionMark = version; + } + } + + @Override + public void upgradeClassVersion(int version) { + if (this.upgradedVersionMark < version) { + this.upgradedVersionMark = version; + } + } + } + private static class TransformHandle { - private static class TransformContextImpl implements TransformContext { - public boolean modifiedMark; - public int minVersionMark = -1; - public int upgradedVersionMark = -1; - - @Override - public void markModified() { - modifiedMark = true; - } - - @Override - public void requireMinimumClassVersion(int version) { - if (this.minVersionMark < version) { - this.minVersionMark = version; - } - } - - @Override - public void upgradeClassVersion(int version) { - if (this.upgradedVersionMark < version) { - this.upgradedVersionMark = version; - } - } - } - - private static class ClassVersionException extends RuntimeException { - public ClassVersionException(String message) { - super(message); - } - } - - private class ClassVersionTransformUnit implements TransformUnit { - @Override - public Optional transform(ClassLoader classLoader, String className, ClassVisitor writer, TransformContext context) { - return Optional.of(new ClassVisitor(ASM7, writer) { - @Override - public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - int major = version & 0xffff; - - if (minVersion != -1 && major < minVersion) { - throw new ClassVersionException("class version (" + major + ") is lower than required(" + minVersion + ")"); - } - - if (upgradedVersion != -1 && major < upgradedVersion) { - Logging.TRANSFORM.fine("Upgrading class version from " + major + " to " + upgradedVersion); - version = upgradedVersion; - context.markModified(); - } - super.visit(version, access, name, signature, superName, interfaces); - } - }); - } - - @Override - public String toString() { - return "Class File Version Transformer"; - } - } + private final String className; + private final ClassLoader classLoader; + private byte[] classBuffer; private List appliedTransformers; - private String className; - private byte[] classBuffer; - private ClassLoader classLoader; private int minVersion = -1; private int upgradedVersion = -1; @@ -153,7 +117,7 @@ public class ClassTransformer implements ClassFileTransformer { return Optional.of(classBuffer); } else { try { - accept(new ClassVersionTransformUnit()); + accept(new ClassVersionTransformUnit(minVersion, upgradedVersion)); return Optional.of(classBuffer); } catch (ClassVersionException e) { Logging.TRANSFORM.warning("Skipping [" + className + "], " + e.getMessage()); diff --git a/src/main/java/moe/yushi/authlibinjector/transform/ClassVersionException.java b/src/main/java/moe/yushi/authlibinjector/transform/ClassVersionException.java new file mode 100644 index 0000000..85067d5 --- /dev/null +++ b/src/main/java/moe/yushi/authlibinjector/transform/ClassVersionException.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2020 Haowei Wen and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package moe.yushi.authlibinjector.transform; + +class ClassVersionException extends RuntimeException { + public ClassVersionException(String message) { + super(message); + } +} diff --git a/src/main/java/moe/yushi/authlibinjector/transform/ClassVersionTransformUnit.java b/src/main/java/moe/yushi/authlibinjector/transform/ClassVersionTransformUnit.java new file mode 100644 index 0000000..f9c8052 --- /dev/null +++ b/src/main/java/moe/yushi/authlibinjector/transform/ClassVersionTransformUnit.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2020 Haowei Wen and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package moe.yushi.authlibinjector.transform; + +import static org.objectweb.asm.Opcodes.ASM7; +import java.util.Optional; +import org.objectweb.asm.ClassVisitor; +import moe.yushi.authlibinjector.util.Logging; + +class ClassVersionTransformUnit implements TransformUnit { + + private final int minVersion; + private final int upgradedVersion; + + public ClassVersionTransformUnit(int minVersion, int upgradedVersion) { + this.minVersion = minVersion; + this.upgradedVersion = upgradedVersion; + } + + @Override + public Optional transform(ClassLoader classLoader, String className, ClassVisitor writer, TransformContext context) { + return Optional.of(new ClassVisitor(ASM7, writer) { + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + int major = version & 0xffff; + + if (minVersion != -1 && major < minVersion) { + throw new ClassVersionException("class version (" + major + ") is lower than required(" + minVersion + ")"); + } + + if (upgradedVersion != -1 && major < upgradedVersion) { + Logging.TRANSFORM.fine("Upgrading class version from " + major + " to " + upgradedVersion); + version = upgradedVersion; + context.markModified(); + } + super.visit(version, access, name, signature, superName, interfaces); + } + }); + } + + @Override + public String toString() { + return "Class File Version Transformer"; + } +} diff --git a/src/main/java/moe/yushi/authlibinjector/transform/TransformContext.java b/src/main/java/moe/yushi/authlibinjector/transform/TransformContext.java new file mode 100644 index 0000000..8be3856 --- /dev/null +++ b/src/main/java/moe/yushi/authlibinjector/transform/TransformContext.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2020 Haowei Wen and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package moe.yushi.authlibinjector.transform; + +public interface TransformContext { + + void markModified(); + + void requireMinimumClassVersion(int version); + + void upgradeClassVersion(int version); + +} diff --git a/src/main/java/moe/yushi/authlibinjector/transform/TransformUnit.java b/src/main/java/moe/yushi/authlibinjector/transform/TransformUnit.java index 993a471..01f3d41 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/TransformUnit.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/TransformUnit.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -21,16 +21,6 @@ import org.objectweb.asm.ClassVisitor; public interface TransformUnit { - public interface TransformContext { - - void markModified(); - - void requireMinimumClassVersion(int version); - - void upgradeClassVersion(int version); - - } - Optional transform(ClassLoader classLoader, String className, ClassVisitor writer, TransformContext context); } diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/AuthlibLogInterceptor.java b/src/main/java/moe/yushi/authlibinjector/transform/support/AuthlibLogInterceptor.java index deefb33..68c33e9 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/AuthlibLogInterceptor.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/AuthlibLogInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -39,6 +39,7 @@ import org.objectweb.asm.Type; import moe.yushi.authlibinjector.transform.CallbackMethod; import moe.yushi.authlibinjector.transform.CallbackSupport; +import moe.yushi.authlibinjector.transform.TransformContext; import moe.yushi.authlibinjector.transform.TransformUnit; import moe.yushi.authlibinjector.util.Logging; diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/CitizensTransformer.java b/src/main/java/moe/yushi/authlibinjector/transform/support/CitizensTransformer.java index 5114151..370ba0b 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/CitizensTransformer.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/CitizensTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -30,6 +30,7 @@ import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; +import moe.yushi.authlibinjector.transform.TransformContext; import moe.yushi.authlibinjector.transform.TransformUnit; /** diff --git a/src/main/java/moe/yushi/authlibinjector/transform/ConstantURLTransformUnit.java b/src/main/java/moe/yushi/authlibinjector/transform/support/ConstantURLTransformUnit.java similarity index 86% rename from src/main/java/moe/yushi/authlibinjector/transform/ConstantURLTransformUnit.java rename to src/main/java/moe/yushi/authlibinjector/transform/support/ConstantURLTransformUnit.java index b427741..9f9fe27 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/ConstantURLTransformUnit.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/ConstantURLTransformUnit.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -14,11 +14,12 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -package moe.yushi.authlibinjector.transform; +package moe.yushi.authlibinjector.transform.support; import java.util.Optional; import moe.yushi.authlibinjector.httpd.URLProcessor; +import moe.yushi.authlibinjector.transform.LdcTransformUnit; public class ConstantURLTransformUnit extends LdcTransformUnit { diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/LaunchwrapperExclusionTransformer.java b/src/main/java/moe/yushi/authlibinjector/transform/support/LaunchwrapperExclusionTransformer.java index 6d5b08c..fa95e15 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/LaunchwrapperExclusionTransformer.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/LaunchwrapperExclusionTransformer.java @@ -22,6 +22,8 @@ import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL; import java.util.Optional; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; + +import moe.yushi.authlibinjector.transform.TransformContext; import moe.yushi.authlibinjector.transform.TransformUnit; public class LaunchwrapperExclusionTransformer implements TransformUnit { diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/MC52974Workaround.java b/src/main/java/moe/yushi/authlibinjector/transform/support/MC52974Workaround.java index 94614f0..d623bdc 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/MC52974Workaround.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/MC52974Workaround.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -29,6 +29,7 @@ import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import moe.yushi.authlibinjector.AuthlibInjector; +import moe.yushi.authlibinjector.transform.TransformContext; import moe.yushi.authlibinjector.transform.TransformUnit; import moe.yushi.authlibinjector.util.Logging; diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/MC52974_1710Workaround.java b/src/main/java/moe/yushi/authlibinjector/transform/support/MC52974_1710Workaround.java index b73f45b..59ade46 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/MC52974_1710Workaround.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/MC52974_1710Workaround.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -35,6 +35,7 @@ import org.objectweb.asm.MethodVisitor; import moe.yushi.authlibinjector.AuthlibInjector; import moe.yushi.authlibinjector.transform.CallbackMethod; import moe.yushi.authlibinjector.transform.CallbackSupport; +import moe.yushi.authlibinjector.transform.TransformContext; import moe.yushi.authlibinjector.transform.TransformUnit; import moe.yushi.authlibinjector.util.Logging; import moe.yushi.authlibinjector.util.WeakIdentityHashMap; diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/MainArgumentsTransformer.java b/src/main/java/moe/yushi/authlibinjector/transform/support/MainArgumentsTransformer.java index 554fbbb..02393bc 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/MainArgumentsTransformer.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/MainArgumentsTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -33,6 +33,7 @@ import org.objectweb.asm.MethodVisitor; import moe.yushi.authlibinjector.transform.CallbackMethod; import moe.yushi.authlibinjector.transform.CallbackSupport; +import moe.yushi.authlibinjector.transform.TransformContext; import moe.yushi.authlibinjector.transform.TransformUnit; import moe.yushi.authlibinjector.util.Logging; diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/SkinWhitelistTransformUnit.java b/src/main/java/moe/yushi/authlibinjector/transform/support/SkinWhitelistTransformUnit.java index cb77032..47ffc4e 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/SkinWhitelistTransformUnit.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/SkinWhitelistTransformUnit.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -31,6 +31,7 @@ import org.objectweb.asm.MethodVisitor; import moe.yushi.authlibinjector.transform.CallbackMethod; import moe.yushi.authlibinjector.transform.CallbackSupport; +import moe.yushi.authlibinjector.transform.TransformContext; import moe.yushi.authlibinjector.transform.TransformUnit; public class SkinWhitelistTransformUnit implements TransformUnit { diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/YggdrasilKeyTransformUnit.java b/src/main/java/moe/yushi/authlibinjector/transform/support/YggdrasilKeyTransformUnit.java index 891334c..7dd8649 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/YggdrasilKeyTransformUnit.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/YggdrasilKeyTransformUnit.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Haowei Wen and contributors + * Copyright (C) 2020 Haowei Wen and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -46,6 +46,7 @@ import org.objectweb.asm.MethodVisitor; import moe.yushi.authlibinjector.transform.CallbackMethod; import moe.yushi.authlibinjector.transform.CallbackSupport; +import moe.yushi.authlibinjector.transform.TransformContext; import moe.yushi.authlibinjector.transform.TransformUnit; public class YggdrasilKeyTransformUnit implements TransformUnit {