Commit 885da345c63da9d1cd7a462b1b10dee4f652b423

Authored by Mumfrey
1 parent fba0e0ff

allow accessor injections specified in JSON to use obfuscation entries from the JSON file

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 }