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 | 22 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 23 | 23 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; |
| 24 | 24 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 25 | +import com.mumfrey.liteloader.transformers.ObfProvider; | |
| 25 | 26 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 26 | 27 | |
| 27 | 28 | /** |
| ... | ... | @@ -49,18 +50,29 @@ public abstract class AccessorTransformer extends ClassTransformer |
| 49 | 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 | 58 | * Target class to inject into |
| 53 | 59 | */ |
| 54 | 60 | private final Obf target; |
| 55 | 61 | |
| 56 | 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 | 69 | ClassNode ifaceNode = this.loadClass(iface); |
| 59 | 70 | this.table = this.setupTable(ifaceNode); |
| 60 | 71 | this.target = this.setupTarget(ifaceNode); |
| 61 | 72 | this.iface = iface; |
| 73 | + this.obfProvider = obfProvider; | |
| 62 | 74 | } |
| 63 | - | |
| 75 | + | |
| 64 | 76 | private ClassNode loadClass(String iface) throws IOException |
| 65 | 77 | { |
| 66 | 78 | byte[] bytes = this.getClassBytes(iface); |
| ... | ... | @@ -77,7 +89,22 @@ public abstract class AccessorTransformer extends ClassTransformer |
| 77 | 89 | |
| 78 | 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 | 110 | protected Obf getTarget() |
| ... | ... | @@ -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 | 350 | public AccessorTransformer() |
| 324 | 351 | { |
| ... | ... | @@ -327,9 +354,14 @@ public abstract class AccessorTransformer extends ClassTransformer |
| 327 | 354 | |
| 328 | 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 | 362 | try |
| 331 | 363 | { |
| 332 | - this.accessors.add(new AccessorInjection(interfaceName)); | |
| 364 | + this.accessors.add(new AccessorInjection(interfaceName, obfProvider)); | |
| 333 | 365 | } |
| 334 | 366 | catch (Exception ex) |
| 335 | 367 | { | ... | ... |
java/common/com/mumfrey/liteloader/transformers/event/EventInjectionTransformer.java
| 1 | 1 | package com.mumfrey.liteloader.transformers.event; |
| 2 | 2 | |
| 3 | +import com.mumfrey.liteloader.transformers.ObfProvider; | |
| 4 | + | |
| 3 | 5 | import net.minecraft.launchwrapper.IClassTransformer; |
| 4 | 6 | |
| 5 | 7 | public abstract class EventInjectionTransformer implements IClassTransformer |
| ... | ... | @@ -85,4 +87,15 @@ public abstract class EventInjectionTransformer implements IClassTransformer |
| 85 | 87 | { |
| 86 | 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 | 19 | |
| 20 | 20 | import com.mumfrey.liteloader.transformers.ByteCodeUtilities; |
| 21 | 21 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 22 | +import com.mumfrey.liteloader.transformers.ObfProvider; | |
| 22 | 23 | import com.mumfrey.liteloader.transformers.access.AccessorTransformer; |
| 23 | 24 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 24 | 25 | |
| ... | ... | @@ -191,6 +192,11 @@ public final class EventTransformer extends ClassTransformer |
| 191 | 192 | |
| 192 | 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 | 200 | if (EventTransformer.accessorTransformer == null) |
| 195 | 201 | { |
| 196 | 202 | EventTransformer.accessorTransformer = new AccessorTransformer() |
| ... | ... | @@ -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 | 212 | @Override | ... | ... |
java/common/com/mumfrey/liteloader/transformers/event/json/JsonEvents.java
| ... | ... | @@ -10,6 +10,7 @@ import com.google.gson.Gson; |
| 10 | 10 | import com.google.gson.GsonBuilder; |
| 11 | 11 | import com.google.gson.annotations.SerializedName; |
| 12 | 12 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 13 | +import com.mumfrey.liteloader.transformers.ObfProvider; | |
| 13 | 14 | |
| 14 | 15 | /** |
| 15 | 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 | 22 | * |
| 22 | 23 | * @author Adam Mummery-Smith |
| 23 | 24 | */ |
| 24 | -public class JsonEvents implements Serializable | |
| 25 | +public class JsonEvents implements Serializable, ObfProvider | |
| 25 | 26 | { |
| 26 | 27 | private static final long serialVersionUID = 1L; |
| 27 | 28 | |
| ... | ... | @@ -71,9 +72,9 @@ public class JsonEvents implements Serializable |
| 71 | 72 | */ |
| 72 | 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 | 80 | try |
| ... | ... | @@ -84,10 +85,13 @@ public class JsonEvents implements Serializable |
| 84 | 85 | // Parse the descriptor list |
| 85 | 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 | 97 | if (this.accessors != null) |
| ... | ... | @@ -144,9 +148,18 @@ public class JsonEvents implements Serializable |
| 144 | 148 | |
| 145 | 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 | 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 | 88 | |
| 89 | 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 | 121 | * @param token |
| 94 | 122 | */ |
| 95 | 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 | 130 | */ |
| 103 | 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 | 138 | */ |
| 111 | 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 | 145 | * @param token |
| 118 | 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 | 151 | String key = JsonEvents.parseToken(token); |
| 123 | 152 | |
| ... | ... | @@ -140,6 +169,11 @@ public class JsonObfuscationTable implements Serializable |
| 140 | 169 | return packet; |
| 141 | 170 | } |
| 142 | 171 | |
| 172 | + if (returnNullOnFailure) | |
| 173 | + { | |
| 174 | + return null; | |
| 175 | + } | |
| 176 | + | |
| 143 | 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 | 3 | import java.util.Map.Entry; |
| 4 | 4 | |
| 5 | 5 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
| 6 | +import com.mumfrey.liteloader.transformers.ObfProvider; | |
| 6 | 7 | import com.mumfrey.liteloader.transformers.event.Event; |
| 7 | 8 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
| 8 | 9 | import com.mumfrey.liteloader.transformers.event.InjectionPoint; |
| ... | ... | @@ -75,8 +76,8 @@ public class ModEventInjectionTransformer extends EventInjectionTransformer |
| 75 | 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 | } | ... | ... |