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 | } |