未验证 提交 8fdb473d 编写于 作者: S skylot 提交者: GitHub

Merge pull request #280 from skylot/xml_tag_attr_name_validator

res: Copy XMLChar class from Apache Xerces library. Replaces all invalid (obfuscated) XML tag and attribute names to random ones
...@@ -6,6 +6,7 @@ import java.lang.reflect.Field; ...@@ -6,6 +6,7 @@ import java.lang.reflect.Field;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Random;
import java.util.Set; import java.util.Set;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -43,6 +44,7 @@ public class BinaryXMLParser extends CommonBinaryParser { ...@@ -43,6 +44,7 @@ public class BinaryXMLParser extends CommonBinaryParser {
private final Map<Integer, String> resNames; private final Map<Integer, String> resNames;
private final Map<String, String> nsMap = new HashMap<>(); private final Map<String, String> nsMap = new HashMap<>();
private Set<String> nsMapGenerated; private Set<String> nsMapGenerated;
private final Map<String, String> tagAttrDeobfNames = new HashMap<>();
private CodeWriter writer; private CodeWriter writer;
private String[] strings; private String[] strings;
...@@ -245,7 +247,7 @@ public class BinaryXMLParser extends CommonBinaryParser { ...@@ -245,7 +247,7 @@ public class BinaryXMLParser extends CommonBinaryParser {
} }
isOneLine = true; isOneLine = true;
isLastEnd = false; isLastEnd = false;
currentTag = getString(startNSName); currentTag = getValidTagAttributeName(getString(startNSName));
writer.startLine("<").add(currentTag); writer.startLine("<").add(currentTag);
writer.attachSourceLine(elementBegLineNumber); writer.attachSourceLine(elementBegLineNumber);
int attributeStart = is.readInt16(); int attributeStart = is.readInt16();
...@@ -299,7 +301,7 @@ public class BinaryXMLParser extends CommonBinaryParser { ...@@ -299,7 +301,7 @@ public class BinaryXMLParser extends CommonBinaryParser {
if (attributeNS != -1) { if (attributeNS != -1) {
writer.add(getAttributeNS(attributeNS)).add(':'); writer.add(getAttributeNS(attributeNS)).add(':');
} }
String attrName = getAttributeName(attributeName); String attrName = getValidTagAttributeName(getAttributeName(attributeName));
writer.add(attrName).add("=\""); writer.add(attrName).add("=\"");
String decodedAttr = ManifestAttributes.getInstance().decode(attrName, attrValData); String decodedAttr = ManifestAttributes.getInstance().decode(attrName, attrValData);
if (decodedAttr != null) { if (decodedAttr != null) {
...@@ -421,7 +423,7 @@ public class BinaryXMLParser extends CommonBinaryParser { ...@@ -421,7 +423,7 @@ public class BinaryXMLParser extends CommonBinaryParser {
int comment = is.readInt32(); int comment = is.readInt32();
int elementNS = is.readInt32(); int elementNS = is.readInt32();
int elementNameId = is.readInt32(); int elementNameId = is.readInt32();
String elemName = getString(elementNameId); String elemName = getValidTagAttributeName(getString(elementNameId));
if (currentTag.equals(elemName) && isOneLine && !isLastEnd) { if (currentTag.equals(elemName) && isOneLine && !isLastEnd) {
writer.add("/>"); writer.add("/>");
} else { } else {
...@@ -437,4 +439,30 @@ public class BinaryXMLParser extends CommonBinaryParser { ...@@ -437,4 +439,30 @@ public class BinaryXMLParser extends CommonBinaryParser {
writer.decIndent(); writer.decIndent();
} }
} }
private String getValidTagAttributeName(String originalName) {
if(XMLChar.isValidName(originalName)) {
return originalName;
}
if(tagAttrDeobfNames.containsKey(originalName)) {
return tagAttrDeobfNames.get(originalName);
}
String generated;
do {
generated = generateTagAttrName();
}
while(tagAttrDeobfNames.containsValue(generated));
tagAttrDeobfNames.put(originalName, generated);
return generated;
}
private static String generateTagAttrName() {
final int length = 6;
Random r = new Random();
StringBuilder sb = new StringBuilder();
for(int i = 1; i <= length; i++) {
sb.append((char)(r.nextInt(26) + 'a'));
}
return sb.toString();
}
} }
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册