escape special characters on decode/encode

This commit is contained in:
REAndroid 2023-01-05 08:56:57 -05:00
parent 306b8f9260
commit aecdc77648
10 changed files with 54 additions and 16 deletions

View File

@ -229,7 +229,8 @@ import java.util.*;
String value; String value;
ResValueInt resValueInt=(ResValueInt) entryBlock.getResValue(); ResValueInt resValueInt=(ResValueInt) entryBlock.getResValue();
if(resValueInt.getValueType()== ValueType.STRING){ if(resValueInt.getValueType()== ValueType.STRING){
value=resValueInt.getValueAsString(); value=ValueDecoder.escapeSpecialCharacter(
resValueInt.getValueAsString());
}else { }else {
value= ValueDecoder.decodeEntryValue(entryStore, value= ValueDecoder.decodeEntryValue(entryStore,
entryBlock.getPackageBlock(), entryBlock.getPackageBlock(),

View File

@ -141,7 +141,8 @@ public class XMLFileEncoder {
continue; continue;
} }
if(attributeBag.isEqualType(AttributeValueType.STRING)) { if(attributeBag.isEqualType(AttributeValueType.STRING)) {
xmlAttribute.setValueAsString(valueText); xmlAttribute.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
continue; continue;
} }
} }
@ -155,7 +156,8 @@ public class XMLFileEncoder {
xmlAttribute.setValueType(encodeResult.valueType); xmlAttribute.setValueType(encodeResult.valueType);
xmlAttribute.setRawValue(encodeResult.value); xmlAttribute.setRawValue(encodeResult.value);
}else { }else {
xmlAttribute.setValueAsString(valueText); xmlAttribute.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
} }
} }
} }

View File

@ -51,10 +51,12 @@ class XMLValuesEncoderArray extends XMLValuesEncoderBag{
bagItem.setTypeAndData(encodeResult.valueType, bagItem.setTypeAndData(encodeResult.valueType,
encodeResult.value); encodeResult.value);
}else { }else {
bagItem.setValueAsString(valueText); bagItem.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
} }
}else { }else {
bagItem.setValueAsString(valueText); bagItem.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
} }
} }
} }

View File

@ -31,7 +31,8 @@ class XMLValuesEncoderCommon extends XMLValuesEncoder{
if(encodeResult!=null){ if(encodeResult!=null){
entryBlock.setValueAsRaw(encodeResult.valueType, encodeResult.value); entryBlock.setValueAsRaw(encodeResult.valueType, encodeResult.value);
}else { }else {
entryBlock.setValueAsString(value); entryBlock.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(value));
} }
} }
} }

View File

@ -52,7 +52,8 @@ class XMLValuesEncoderPlurals extends XMLValuesEncoderBag{
bagItem.setType(ValueType.NULL); bagItem.setType(ValueType.NULL);
bagItem.setData(0); bagItem.setData(0);
}else{ }else{
bagItem.setValueAsString(valueText); bagItem.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
} }
} }
} }

View File

@ -34,7 +34,7 @@ class XMLValuesEncoderString extends XMLValuesEncoder{
} }
@Override @Override
void encodeStringValue(EntryBlock entryBlock, String value){ void encodeStringValue(EntryBlock entryBlock, String value){
entryBlock.setValueAsString(value); entryBlock.setValueAsString(ValueDecoder.unEscapeSpecialCharacter(value));
} }
@Override @Override
void encodeNullValue(EntryBlock entryBlock){ void encodeNullValue(EntryBlock entryBlock){
@ -53,7 +53,7 @@ class XMLValuesEncoderString extends XMLValuesEncoder{
if(value==null || ValueDecoder.isReference(value)){ if(value==null || ValueDecoder.isReference(value)){
continue; continue;
} }
stringList.add(value); stringList.add(ValueDecoder.unEscapeSpecialCharacter(value));
} }
getMaterials().addTableStringPool(stringList); getMaterials().addTableStringPool(stringList);
} }

View File

@ -66,7 +66,8 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{
} }
bagItem.setData(getMaterials().resolveReference(valueText)); bagItem.setData(getMaterials().resolveReference(valueText));
}else if(attributeBag.isEqualType(AttributeValueType.STRING)) { }else if(attributeBag.isEqualType(AttributeValueType.STRING)) {
bagItem.setValueAsString(valueText); bagItem.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
}else if(EncodeUtil.isEmpty(valueText)) { }else if(EncodeUtil.isEmpty(valueText)) {
bagItem.setTypeAndData(ValueType.NULL, 0); bagItem.setTypeAndData(ValueType.NULL, 0);
}else{ }else{
@ -75,7 +76,7 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{
bagItem.setTypeAndData(encodeResult.valueType, bagItem.setTypeAndData(encodeResult.valueType,
encodeResult.value); encodeResult.value);
}else { }else {
bagItem.setValueAsString(valueText); bagItem.setValueAsString(ValueDecoder.unEscapeSpecialCharacter(valueText));
} }
} }
} }

View File

@ -468,7 +468,7 @@ import java.util.Set;
int raw=getRawValue(); int raw=getRawValue();
String value; String value;
if(valueType==ValueType.STRING){ if(valueType==ValueType.STRING){
value = getValueAsString(); value = ValueDecoder.escapeSpecialCharacter(getValueAsString());
}else { }else {
value = ValueDecoder.decode(entryStore, value = ValueDecoder.decode(entryStore,
currentPackageId, currentPackageId,

View File

@ -20,6 +20,7 @@ import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.container.BlockList; import com.reandroid.lib.arsc.container.BlockList;
import com.reandroid.lib.arsc.container.FixedBlockContainer; import com.reandroid.lib.arsc.container.FixedBlockContainer;
import com.reandroid.lib.arsc.container.SingleBlockContainer; import com.reandroid.lib.arsc.container.SingleBlockContainer;
import com.reandroid.lib.arsc.decoder.ValueDecoder;
import com.reandroid.lib.arsc.header.HeaderBlock; import com.reandroid.lib.arsc.header.HeaderBlock;
import com.reandroid.lib.arsc.io.BlockReader; import com.reandroid.lib.arsc.io.BlockReader;
import com.reandroid.lib.arsc.item.ResXmlString; import com.reandroid.lib.arsc.item.ResXmlString;
@ -759,7 +760,8 @@ import java.util.*;
} }
ResXmlText resXmlText = getResXmlText(); ResXmlText resXmlText = getResXmlText();
if(resXmlText!=null){ if(resXmlText!=null){
xmlElement.setTextContent(resXmlText.getText()); xmlElement.setTextContent(
ValueDecoder.escapeSpecialCharacter(resXmlText.getText()));
} }
return xmlElement; return xmlElement;
} }

View File

@ -31,6 +31,34 @@ import java.util.regex.Pattern;
public class ValueDecoder { public class ValueDecoder {
public static String escapeSpecialCharacter(String text){
if(text==null || text.length()==0){
return text;
}
if(isSpecialCharacter(text.charAt(0))){
return '\\' +text;
}
return text;
}
public static String unEscapeSpecialCharacter(String text){
if(text==null || text.length()<2){
return text;
}
if(text.charAt(0)!='\\' || !isSpecialCharacter(text.charAt(1))){
return text;
}
return text.substring(1);
}
private static boolean isSpecialCharacter(char ch){
switch (ch){
case '@':
case '?':
case '#':
return true;
default:
return false;
}
}
public static EncodeResult encodeGuessAny(String txt){ public static EncodeResult encodeGuessAny(String txt){
if(txt==null){ if(txt==null){
return null; return null;
@ -574,7 +602,7 @@ import java.util.regex.Pattern;
if(tableString==null){ if(tableString==null){
return null; return null;
} }
return tableString.getHtml(); return escapeSpecialCharacter(tableString.getHtml());
} }
private static String decodeString(EntryStore entryStore, int packageOrResourceId, int stringRef){ private static String decodeString(EntryStore entryStore, int packageOrResourceId, int stringRef){
if(entryStore==null||packageOrResourceId==0){ if(entryStore==null||packageOrResourceId==0){
@ -606,7 +634,7 @@ import java.util.regex.Pattern;
} }
} }
if(tableString!=null){ if(tableString!=null){
return tableString.getHtml(); return escapeSpecialCharacter(tableString.getHtml());
} }
return null; return null;
} }
@ -623,7 +651,7 @@ import java.util.regex.Pattern;
if(tableString==null){ if(tableString==null){
return null; return null;
} }
return tableString.getHtml(); return escapeSpecialCharacter(tableString.getHtml());
} }
private static String decodeHex(int rawVal){ private static String decodeHex(int rawVal){