Commit 885da345c63da9d1cd7a462b1b10dee4f652b423
1 parent
fba0e0ff
allow accessor injections specified in JSON to use obfuscation entries from the JSON file
Showing
7 changed files
with
137 additions
and
18 deletions
java/common/com/mumfrey/liteloader/transformers/ObfProvider.java
0 → 100644
| 1 | +package com.mumfrey.liteloader.transformers; | ||
| 2 | + | ||
| 3 | +import com.mumfrey.liteloader.core.runtime.Obf; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * Interface for dynamic (context-specific) obfuscation provider, used internally by ModEventInjectionTransformer to | ||
| 7 | + * provide obf entries for the AccessorTransformer from JSON | ||
| 8 | + * | ||
| 9 | + * @author Adam Mummery-Smith | ||
| 10 | + */ | ||
| 11 | +public interface ObfProvider | ||
| 12 | +{ | ||
| 13 | + /** | ||
| 14 | + * Try to locate an obfuscation table entry by name (id), returns null if no entry was found | ||
| 15 | + * | ||
| 16 | + * @param name | ||
| 17 | + * @return | ||
| 18 | + */ | ||
| 19 | + public abstract Obf getByName(String name); | ||
| 20 | +} |
java/common/com/mumfrey/liteloader/transformers/access/AccessorTransformer.java
| @@ -22,6 +22,7 @@ import org.objectweb.asm.tree.VarInsnNode; | @@ -22,6 +22,7 @@ import org.objectweb.asm.tree.VarInsnNode; | ||
| 22 | import com.mumfrey.liteloader.core.runtime.Obf; | 22 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 23 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | 23 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; |
| 24 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 24 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 25 | +import com.mumfrey.liteloader.transformers.ObfProvider; | ||
| 25 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 26 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 26 | 27 | ||
| 27 | /** | 28 | /** |
| @@ -49,18 +50,29 @@ public abstract class AccessorTransformer extends ClassTransformer | @@ -49,18 +50,29 @@ public abstract class AccessorTransformer extends ClassTransformer | ||
| 49 | private final Class<? extends Obf> table; | 50 | private final Class<? extends Obf> table; |
| 50 | 51 | ||
| 51 | /** | 52 | /** |
| 53 | + * Obfuscation provider for this context | ||
| 54 | + */ | ||
| 55 | + private final ObfProvider obfProvider; | ||
| 56 | + | ||
| 57 | + /** | ||
| 52 | * Target class to inject into | 58 | * Target class to inject into |
| 53 | */ | 59 | */ |
| 54 | private final Obf target; | 60 | private final Obf target; |
| 55 | 61 | ||
| 56 | protected AccessorInjection(String iface) throws IOException | 62 | protected AccessorInjection(String iface) throws IOException |
| 57 | { | 63 | { |
| 64 | + this(iface, null); | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + protected AccessorInjection(String iface, ObfProvider obfProvider) throws IOException | ||
| 68 | + { | ||
| 58 | ClassNode ifaceNode = this.loadClass(iface); | 69 | ClassNode ifaceNode = this.loadClass(iface); |
| 59 | this.table = this.setupTable(ifaceNode); | 70 | this.table = this.setupTable(ifaceNode); |
| 60 | this.target = this.setupTarget(ifaceNode); | 71 | this.target = this.setupTarget(ifaceNode); |
| 61 | this.iface = iface; | 72 | this.iface = iface; |
| 73 | + this.obfProvider = obfProvider; | ||
| 62 | } | 74 | } |
| 63 | - | 75 | + |
| 64 | private ClassNode loadClass(String iface) throws IOException | 76 | private ClassNode loadClass(String iface) throws IOException |
| 65 | { | 77 | { |
| 66 | byte[] bytes = this.getClassBytes(iface); | 78 | byte[] bytes = this.getClassBytes(iface); |
| @@ -77,7 +89,22 @@ public abstract class AccessorTransformer extends ClassTransformer | @@ -77,7 +89,22 @@ public abstract class AccessorTransformer extends ClassTransformer | ||
| 77 | 89 | ||
| 78 | private Obf getObf(String name) | 90 | private Obf getObf(String name) |
| 79 | { | 91 | { |
| 80 | - return Obf.getByName(this.table, name); | 92 | + if (this.obfProvider != null) |
| 93 | + { | ||
| 94 | + Obf obf = this.obfProvider.getByName(name); | ||
| 95 | + if (obf != null) | ||
| 96 | + { | ||
| 97 | + return obf; | ||
| 98 | + } | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + Obf obf = Obf.getByName(this.table, name); | ||
| 102 | + if (obf != null) | ||
| 103 | + { | ||
| 104 | + return obf; | ||
| 105 | + } | ||
| 106 | + | ||
| 107 | + throw new RuntimeException("No obfuscation table entry could be found for '" + name + "'"); | ||
| 81 | } | 108 | } |
| 82 | 109 | ||
| 83 | protected Obf getTarget() | 110 | protected Obf getTarget() |
| @@ -318,7 +345,7 @@ public abstract class AccessorTransformer extends ClassTransformer | @@ -318,7 +345,7 @@ public abstract class AccessorTransformer extends ClassTransformer | ||
| 318 | } | 345 | } |
| 319 | } | 346 | } |
| 320 | 347 | ||
| 321 | - private List<AccessorInjection> accessors = new ArrayList<AccessorInjection>(); | 348 | + private final List<AccessorInjection> accessors = new ArrayList<AccessorInjection>(); |
| 322 | 349 | ||
| 323 | public AccessorTransformer() | 350 | public AccessorTransformer() |
| 324 | { | 351 | { |
| @@ -327,9 +354,14 @@ public abstract class AccessorTransformer extends ClassTransformer | @@ -327,9 +354,14 @@ public abstract class AccessorTransformer extends ClassTransformer | ||
| 327 | 354 | ||
| 328 | public void addAccessor(String interfaceName) | 355 | public void addAccessor(String interfaceName) |
| 329 | { | 356 | { |
| 357 | + this.addAccessor(interfaceName, null); | ||
| 358 | + } | ||
| 359 | + | ||
| 360 | + public void addAccessor(String interfaceName, ObfProvider obfProvider) | ||
| 361 | + { | ||
| 330 | try | 362 | try |
| 331 | { | 363 | { |
| 332 | - this.accessors.add(new AccessorInjection(interfaceName)); | 364 | + this.accessors.add(new AccessorInjection(interfaceName, obfProvider)); |
| 333 | } | 365 | } |
| 334 | catch (Exception ex) | 366 | catch (Exception ex) |
| 335 | { | 367 | { |
java/common/com/mumfrey/liteloader/transformers/event/EventInjectionTransformer.java
| 1 | package com.mumfrey.liteloader.transformers.event; | 1 | package com.mumfrey.liteloader.transformers.event; |
| 2 | 2 | ||
| 3 | +import com.mumfrey.liteloader.transformers.ObfProvider; | ||
| 4 | + | ||
| 3 | import net.minecraft.launchwrapper.IClassTransformer; | 5 | import net.minecraft.launchwrapper.IClassTransformer; |
| 4 | 6 | ||
| 5 | public abstract class EventInjectionTransformer implements IClassTransformer | 7 | public abstract class EventInjectionTransformer implements IClassTransformer |
| @@ -85,4 +87,15 @@ public abstract class EventInjectionTransformer implements IClassTransformer | @@ -85,4 +87,15 @@ public abstract class EventInjectionTransformer implements IClassTransformer | ||
| 85 | { | 87 | { |
| 86 | EventTransformer.addAccessor(interfaceName); | 88 | EventTransformer.addAccessor(interfaceName); |
| 87 | } | 89 | } |
| 90 | + | ||
| 91 | + /** | ||
| 92 | + * Register an access injection interface and provide a contextual obfuscation provider | ||
| 93 | + * | ||
| 94 | + * @param interfaceName | ||
| 95 | + * @param obfProvider | ||
| 96 | + */ | ||
| 97 | + protected final void addAccessor(String interfaceName, ObfProvider obfProvider) | ||
| 98 | + { | ||
| 99 | + EventTransformer.addAccessor(interfaceName, obfProvider); | ||
| 100 | + } | ||
| 88 | } | 101 | } |
java/common/com/mumfrey/liteloader/transformers/event/EventTransformer.java
| @@ -19,6 +19,7 @@ import org.objectweb.asm.util.CheckClassAdapter; | @@ -19,6 +19,7 @@ import org.objectweb.asm.util.CheckClassAdapter; | ||
| 19 | 19 | ||
| 20 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | 20 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; |
| 21 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 21 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 22 | +import com.mumfrey.liteloader.transformers.ObfProvider; | ||
| 22 | import com.mumfrey.liteloader.transformers.access.AccessorTransformer; | 23 | import com.mumfrey.liteloader.transformers.access.AccessorTransformer; |
| 23 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 24 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 24 | 25 | ||
| @@ -191,6 +192,11 @@ public final class EventTransformer extends ClassTransformer | @@ -191,6 +192,11 @@ public final class EventTransformer extends ClassTransformer | ||
| 191 | 192 | ||
| 192 | static void addAccessor(String interfaceName) | 193 | static void addAccessor(String interfaceName) |
| 193 | { | 194 | { |
| 195 | + EventTransformer.addAccessor(interfaceName, null); | ||
| 196 | + } | ||
| 197 | + | ||
| 198 | + static void addAccessor(String interfaceName, ObfProvider obfProvider) | ||
| 199 | + { | ||
| 194 | if (EventTransformer.accessorTransformer == null) | 200 | if (EventTransformer.accessorTransformer == null) |
| 195 | { | 201 | { |
| 196 | EventTransformer.accessorTransformer = new AccessorTransformer() | 202 | EventTransformer.accessorTransformer = new AccessorTransformer() |
| @@ -200,7 +206,7 @@ public final class EventTransformer extends ClassTransformer | @@ -200,7 +206,7 @@ public final class EventTransformer extends ClassTransformer | ||
| 200 | }; | 206 | }; |
| 201 | } | 207 | } |
| 202 | 208 | ||
| 203 | - EventTransformer.accessorTransformer.addAccessor(interfaceName); | 209 | + EventTransformer.accessorTransformer.addAccessor(interfaceName, obfProvider); |
| 204 | } | 210 | } |
| 205 | 211 | ||
| 206 | @Override | 212 | @Override |
java/common/com/mumfrey/liteloader/transformers/event/json/JsonEvents.java
| @@ -10,6 +10,7 @@ import com.google.gson.Gson; | @@ -10,6 +10,7 @@ import com.google.gson.Gson; | ||
| 10 | import com.google.gson.GsonBuilder; | 10 | import com.google.gson.GsonBuilder; |
| 11 | import com.google.gson.annotations.SerializedName; | 11 | import com.google.gson.annotations.SerializedName; |
| 12 | import com.mumfrey.liteloader.core.runtime.Obf; | 12 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 13 | +import com.mumfrey.liteloader.transformers.ObfProvider; | ||
| 13 | 14 | ||
| 14 | /** | 15 | /** |
| 15 | * Serialisable class which represents a set of event injection definitions. Instances of this class are | 16 | * Serialisable class which represents a set of event injection definitions. Instances of this class are |
| @@ -21,7 +22,7 @@ import com.mumfrey.liteloader.core.runtime.Obf; | @@ -21,7 +22,7 @@ import com.mumfrey.liteloader.core.runtime.Obf; | ||
| 21 | * | 22 | * |
| 22 | * @author Adam Mummery-Smith | 23 | * @author Adam Mummery-Smith |
| 23 | */ | 24 | */ |
| 24 | -public class JsonEvents implements Serializable | 25 | +public class JsonEvents implements Serializable, ObfProvider |
| 25 | { | 26 | { |
| 26 | private static final long serialVersionUID = 1L; | 27 | private static final long serialVersionUID = 1L; |
| 27 | 28 | ||
| @@ -71,9 +72,9 @@ public class JsonEvents implements Serializable | @@ -71,9 +72,9 @@ public class JsonEvents implements Serializable | ||
| 71 | */ | 72 | */ |
| 72 | private void parse() | 73 | private void parse() |
| 73 | { | 74 | { |
| 74 | - if (this.events == null || this.events.isEmpty()) | 75 | + if (this.obfuscation == null) |
| 75 | { | 76 | { |
| 76 | - throw new InvalidEventJsonException("No events were defined in the supplied JSON"); | 77 | + this.obfuscation = new JsonObfuscationTable(); |
| 77 | } | 78 | } |
| 78 | 79 | ||
| 79 | try | 80 | try |
| @@ -84,10 +85,13 @@ public class JsonEvents implements Serializable | @@ -84,10 +85,13 @@ public class JsonEvents implements Serializable | ||
| 84 | // Parse the descriptor list | 85 | // Parse the descriptor list |
| 85 | this.methods = new JsonMethods(this.obfuscation, this.descriptors); | 86 | this.methods = new JsonMethods(this.obfuscation, this.descriptors); |
| 86 | 87 | ||
| 87 | - // Parse the events | ||
| 88 | - for (JsonEvent event : this.events) | 88 | + if (this.events != null) |
| 89 | { | 89 | { |
| 90 | - event.parse(this.methods); | 90 | + // Parse the events |
| 91 | + for (JsonEvent event : this.events) | ||
| 92 | + { | ||
| 93 | + event.parse(this.methods); | ||
| 94 | + } | ||
| 91 | } | 95 | } |
| 92 | 96 | ||
| 93 | if (this.accessors != null) | 97 | if (this.accessors != null) |
| @@ -144,9 +148,18 @@ public class JsonEvents implements Serializable | @@ -144,9 +148,18 @@ public class JsonEvents implements Serializable | ||
| 144 | 148 | ||
| 145 | for (String interfaceName : this.accessorInterfaces) | 149 | for (String interfaceName : this.accessorInterfaces) |
| 146 | { | 150 | { |
| 147 | - transformer.registerAccessor(interfaceName); | 151 | + transformer.registerAccessor(interfaceName, this); |
| 148 | } | 152 | } |
| 149 | } | 153 | } |
| 154 | + | ||
| 155 | + /* (non-Javadoc) | ||
| 156 | + * @see com.mumfrey.liteloader.transformers.ObfProvider#getByName(java.lang.String) | ||
| 157 | + */ | ||
| 158 | + @Override | ||
| 159 | + public Obf getByName(String name) | ||
| 160 | + { | ||
| 161 | + return this.obfuscation.getByName(name); | ||
| 162 | + } | ||
| 150 | 163 | ||
| 151 | // public String toJson() | 164 | // public String toJson() |
| 152 | // { | 165 | // { |
java/common/com/mumfrey/liteloader/transformers/event/json/JsonObfuscationTable.java
| @@ -88,13 +88,41 @@ public class JsonObfuscationTable implements Serializable | @@ -88,13 +88,41 @@ public class JsonObfuscationTable implements Serializable | ||
| 88 | 88 | ||
| 89 | return this.parseClass(token); | 89 | return this.parseClass(token); |
| 90 | } | 90 | } |
| 91 | + | ||
| 92 | + /** | ||
| 93 | + * Find an obf entry of any type by name | ||
| 94 | + * | ||
| 95 | + * @param name | ||
| 96 | + */ | ||
| 97 | + public Obf getByName(String name) | ||
| 98 | + { | ||
| 99 | + Obf classObf = this.classObfs.get(name); | ||
| 100 | + if (classObf != null) | ||
| 101 | + { | ||
| 102 | + return classObf; | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + Obf methodObf = this.methodObfs.get(name); | ||
| 106 | + if (methodObf != null) | ||
| 107 | + { | ||
| 108 | + return methodObf; | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + Obf fieldObf = this.fieldObfs.get(name); | ||
| 112 | + if (fieldObf != null) | ||
| 113 | + { | ||
| 114 | + return fieldObf; | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + return null; | ||
| 118 | + } | ||
| 91 | 119 | ||
| 92 | /** | 120 | /** |
| 93 | * @param token | 121 | * @param token |
| 94 | */ | 122 | */ |
| 95 | public Obf parseClass(String token) | 123 | public Obf parseClass(String token) |
| 96 | { | 124 | { |
| 97 | - return this.parseObf(token, this.classObfs); | 125 | + return this.parseObf(token, this.classObfs, false); |
| 98 | } | 126 | } |
| 99 | 127 | ||
| 100 | /** | 128 | /** |
| @@ -102,7 +130,7 @@ public class JsonObfuscationTable implements Serializable | @@ -102,7 +130,7 @@ public class JsonObfuscationTable implements Serializable | ||
| 102 | */ | 130 | */ |
| 103 | public Obf parseMethod(String token) | 131 | public Obf parseMethod(String token) |
| 104 | { | 132 | { |
| 105 | - return this.parseObf(token, this.methodObfs); | 133 | + return this.parseObf(token, this.methodObfs, false); |
| 106 | } | 134 | } |
| 107 | 135 | ||
| 108 | /** | 136 | /** |
| @@ -110,14 +138,15 @@ public class JsonObfuscationTable implements Serializable | @@ -110,14 +138,15 @@ public class JsonObfuscationTable implements Serializable | ||
| 110 | */ | 138 | */ |
| 111 | public Obf parseField(String token) | 139 | public Obf parseField(String token) |
| 112 | { | 140 | { |
| 113 | - return this.parseObf(token, this.fieldObfs); | 141 | + return this.parseObf(token, this.fieldObfs, false); |
| 114 | } | 142 | } |
| 115 | 143 | ||
| 116 | /** | 144 | /** |
| 117 | * @param token | 145 | * @param token |
| 118 | * @param obfs | 146 | * @param obfs |
| 147 | + * @param returnNullOnFailure return null instead of throwing an exception | ||
| 119 | */ | 148 | */ |
| 120 | - private Obf parseObf(String token, Map<String, Obf> obfs) | 149 | + private Obf parseObf(String token, Map<String, Obf> obfs, boolean returnNullOnFailure) |
| 121 | { | 150 | { |
| 122 | String key = JsonEvents.parseToken(token); | 151 | String key = JsonEvents.parseToken(token); |
| 123 | 152 | ||
| @@ -140,6 +169,11 @@ public class JsonObfuscationTable implements Serializable | @@ -140,6 +169,11 @@ public class JsonObfuscationTable implements Serializable | ||
| 140 | return packet; | 169 | return packet; |
| 141 | } | 170 | } |
| 142 | 171 | ||
| 172 | + if (returnNullOnFailure) | ||
| 173 | + { | ||
| 174 | + return null; | ||
| 175 | + } | ||
| 176 | + | ||
| 143 | throw new InvalidEventJsonException("The token " + token + " could not be resolved to a type"); | 177 | throw new InvalidEventJsonException("The token " + token + " could not be resolved to a type"); |
| 144 | } | 178 | } |
| 145 | 179 |
java/common/com/mumfrey/liteloader/transformers/event/json/ModEventInjectionTransformer.java
| @@ -3,6 +3,7 @@ package com.mumfrey.liteloader.transformers.event.json; | @@ -3,6 +3,7 @@ package com.mumfrey.liteloader.transformers.event.json; | ||
| 3 | import java.util.Map.Entry; | 3 | import java.util.Map.Entry; |
| 4 | 4 | ||
| 5 | import com.mumfrey.liteloader.transformers.ClassTransformer; | 5 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 6 | +import com.mumfrey.liteloader.transformers.ObfProvider; | ||
| 6 | import com.mumfrey.liteloader.transformers.event.Event; | 7 | import com.mumfrey.liteloader.transformers.event.Event; |
| 7 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; | 8 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
| 8 | import com.mumfrey.liteloader.transformers.event.InjectionPoint; | 9 | import com.mumfrey.liteloader.transformers.event.InjectionPoint; |
| @@ -75,8 +76,8 @@ public class ModEventInjectionTransformer extends EventInjectionTransformer | @@ -75,8 +76,8 @@ public class ModEventInjectionTransformer extends EventInjectionTransformer | ||
| 75 | return super.addEvent(event, targetMethod, injectionPoint); | 76 | return super.addEvent(event, targetMethod, injectionPoint); |
| 76 | } | 77 | } |
| 77 | 78 | ||
| 78 | - protected void registerAccessor(String interfaceName) | 79 | + protected void registerAccessor(String interfaceName, ObfProvider obfProvider) |
| 79 | { | 80 | { |
| 80 | - super.addAccessor(interfaceName); | 81 | + super.addAccessor(interfaceName, obfProvider); |
| 81 | } | 82 | } |
| 82 | } | 83 | } |