Loading services/core/java/com/android/server/integrity/parser/RuleXmlParser.java +18 −50 Original line number Diff line number Diff line Loading @@ -40,16 +40,16 @@ public final class RuleXmlParser implements RuleParser { public static final String TAG = "RuleXmlParser"; // TODO: Use XML attributes private static final String NAMESPACE = ""; private static final String RULE_LIST_TAG = "RL"; private static final String RULE_TAG = "R"; private static final String OPEN_FORMULA_TAG = "OF"; private static final String ATOMIC_FORMULA_TAG = "AF"; private static final String EFFECT_TAG = "E"; private static final String KEY_TAG = "K"; private static final String OPERATOR_TAG = "O"; private static final String VALUE_TAG = "V"; private static final String CONNECTOR_TAG = "C"; private static final String EFFECT_ATTRIBUTE = "E"; private static final String KEY_ATTRIBUTE = "K"; private static final String OPERATOR_ATTRIBUTE = "O"; private static final String VALUE_ATTRIBUTE = "V"; private static final String CONNECTOR_ATTRIBUTE = "C"; @Override public List<Rule> parse(String ruleText) throws RuleParseException { Loading Loading @@ -106,7 +106,7 @@ public final class RuleXmlParser implements RuleParser { private static Rule parseRule(XmlPullParser parser) throws IOException, XmlPullParserException { Formula formula = null; @Rule.Effect int effect = 0; @Rule.Effect int effect = Integer.parseInt(extractAttributeValue(parser, EFFECT_ATTRIBUTE)); int eventType; while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { Loading @@ -124,9 +124,6 @@ public final class RuleXmlParser implements RuleParser { case ATOMIC_FORMULA_TAG: formula = parseAtomicFormula(parser); break; case EFFECT_TAG: effect = Integer.parseInt(extractValue(parser)); break; default: throw new RuntimeException( String.format("Found unexpected tag: %s", nodeName)); Loading @@ -142,7 +139,8 @@ public final class RuleXmlParser implements RuleParser { private static Formula parseOpenFormula(XmlPullParser parser) throws IOException, XmlPullParserException { @OpenFormula.Connector int connector = 0; @OpenFormula.Connector int connector = Integer.parseInt( extractAttributeValue(parser, CONNECTOR_ATTRIBUTE)); List<Formula> formulas = new ArrayList<>(); int eventType; Loading @@ -155,9 +153,6 @@ public final class RuleXmlParser implements RuleParser { if (eventType == XmlPullParser.START_TAG) { switch (nodeName) { case CONNECTOR_TAG: connector = Integer.parseInt(extractValue(parser)); break; case ATOMIC_FORMULA_TAG: formulas.add(parseAtomicFormula(parser)); break; Loading @@ -179,37 +174,16 @@ public final class RuleXmlParser implements RuleParser { private static Formula parseAtomicFormula(XmlPullParser parser) throws IOException, XmlPullParserException { @AtomicFormula.Key int key = 0; @AtomicFormula.Operator int operator = 0; String value = null; @AtomicFormula.Key int key = Integer.parseInt(extractAttributeValue(parser, KEY_ATTRIBUTE)); @AtomicFormula.Operator int operator = Integer.parseInt( extractAttributeValue(parser, OPERATOR_ATTRIBUTE)); String value = extractAttributeValue(parser, VALUE_ATTRIBUTE); int eventType; while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { String nodeName = parser.getName(); if (eventType == XmlPullParser.END_TAG && parser.getName().equals(ATOMIC_FORMULA_TAG)) { break; } if (eventType == XmlPullParser.START_TAG) { switch (nodeName) { case KEY_TAG: key = Integer.parseInt(extractValue(parser)); break; case OPERATOR_TAG: operator = Integer.parseInt(extractValue(parser)); break; case VALUE_TAG: value = extractValue(parser); break; default: throw new RuntimeException( String.format("Found unexpected tag: %s", nodeName)); } } else { throw new RuntimeException( String.format("Found unexpected event type: %d", eventType)); } } return constructAtomicFormulaBasedOnKey(key, operator, value); } Loading @@ -231,17 +205,11 @@ public final class RuleXmlParser implements RuleParser { } } private static String extractValue(XmlPullParser parser) throws IOException, XmlPullParserException { String value; int eventType = parser.next(); if (eventType == XmlPullParser.TEXT) { value = parser.getText(); eventType = parser.next(); if (eventType == XmlPullParser.END_TAG) { return value; } private static String extractAttributeValue(XmlPullParser parser, String attribute) { String attributeValue = parser.getAttributeValue(NAMESPACE, attribute); if (attributeValue == null) { throw new RuntimeException(String.format("Attribute not found: %s", attribute)); } throw new RuntimeException(String.format("Found unexpected event type: %d", eventType)); return attributeValue; } } services/core/java/com/android/server/integrity/serializer/RuleXmlSerializer.java +17 −16 Original line number Diff line number Diff line Loading @@ -43,11 +43,11 @@ public class RuleXmlSerializer implements RuleSerializer { private static final String RULE_TAG = "R"; private static final String OPEN_FORMULA_TAG = "OF"; private static final String ATOMIC_FORMULA_TAG = "AF"; private static final String EFFECT_TAG = "E"; private static final String KEY_TAG = "K"; private static final String OPERATOR_TAG = "O"; private static final String VALUE_TAG = "V"; private static final String CONNECTOR_TAG = "C"; private static final String EFFECT_ATTRIBUTE = "E"; private static final String KEY_ATTRIBUTE = "K"; private static final String OPERATOR_ATTRIBUTE = "O"; private static final String VALUE_ATTRIBUTE = "V"; private static final String CONNECTOR_ATTRIBUTE = "C"; @Override public void serialize(List<Rule> rules, OutputStream outputStream) Loading Loading @@ -88,8 +88,8 @@ public class RuleXmlSerializer implements RuleSerializer { return; } xmlSerializer.startTag(NAMESPACE, RULE_TAG); serializeAttributeValue(EFFECT_ATTRIBUTE, String.valueOf(rule.getEffect()), xmlSerializer); serializeFormula(rule.getFormula(), xmlSerializer); serializeValue(EFFECT_TAG, String.valueOf(rule.getEffect()), xmlSerializer); xmlSerializer.endTag(NAMESPACE, RULE_TAG); } Loading @@ -110,7 +110,8 @@ public class RuleXmlSerializer implements RuleSerializer { return; } xmlSerializer.startTag(NAMESPACE, OPEN_FORMULA_TAG); serializeValue(CONNECTOR_TAG, String.valueOf(openFormula.getConnector()), xmlSerializer); serializeAttributeValue(CONNECTOR_ATTRIBUTE, String.valueOf(openFormula.getConnector()), xmlSerializer); for (Formula formula : openFormula.getFormulas()) { serializeFormula(formula, xmlSerializer); } Loading @@ -123,19 +124,20 @@ public class RuleXmlSerializer implements RuleSerializer { return; } xmlSerializer.startTag(NAMESPACE, ATOMIC_FORMULA_TAG); serializeValue(KEY_TAG, String.valueOf(atomicFormula.getKey()), xmlSerializer); serializeAttributeValue(KEY_ATTRIBUTE, String.valueOf(atomicFormula.getKey()), xmlSerializer); if (atomicFormula instanceof AtomicFormula.StringAtomicFormula) { serializeValue(VALUE_TAG, serializeAttributeValue(VALUE_ATTRIBUTE, ((AtomicFormula.StringAtomicFormula) atomicFormula).getValue(), xmlSerializer); } else if (atomicFormula instanceof AtomicFormula.IntAtomicFormula) { serializeValue(OPERATOR_TAG, serializeAttributeValue(OPERATOR_ATTRIBUTE, String.valueOf(((AtomicFormula.IntAtomicFormula) atomicFormula).getOperator()), xmlSerializer); serializeValue(VALUE_TAG, serializeAttributeValue(VALUE_ATTRIBUTE, String.valueOf(((AtomicFormula.IntAtomicFormula) atomicFormula).getValue()), xmlSerializer); } else if (atomicFormula instanceof AtomicFormula.BooleanAtomicFormula) { serializeValue(VALUE_TAG, serializeAttributeValue(VALUE_ATTRIBUTE, String.valueOf(((AtomicFormula.BooleanAtomicFormula) atomicFormula).getValue()), xmlSerializer); } else { Loading @@ -145,13 +147,12 @@ public class RuleXmlSerializer implements RuleSerializer { xmlSerializer.endTag(NAMESPACE, ATOMIC_FORMULA_TAG); } private void serializeValue(String tag, String value, XmlSerializer xmlSerializer) private void serializeAttributeValue(String attribute, String value, XmlSerializer xmlSerializer) throws IOException { if (value == null) { return; } xmlSerializer.startTag(NAMESPACE, tag); xmlSerializer.text(value); xmlSerializer.endTag(NAMESPACE, tag); xmlSerializer.attribute(NAMESPACE, attribute, value); } } services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java +206 −160 File changed.Preview size limit exceeded, changes collapsed. Show changes services/tests/servicestests/src/com/android/server/integrity/serializer/RuleXmlSerializerTest.java +94 −65 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; @RunWith(JUnit4.class) public class RuleXmlSerializerTest { Loading @@ -58,13 +60,14 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.PACKAGE_NAME, "com.app.test"), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); String expectedRules = "<RL>" + "<R>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + "<E>" + Rule.DENY + "</E>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + "</R>" + "</RL>"; Loading @@ -81,16 +84,18 @@ public class RuleXmlSerializerTest { "com.app.test"))), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); OutputStream outputStream = new ByteArrayOutputStream(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); String expectedRules = "<RL>" + "<R>" + "<OF>" + "<C>" + OpenFormula.NOT + "</C>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "OF", Collections.singletonMap("C", String.valueOf(OpenFormula.NOT)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + "</OF>" + "<E>" + Rule.DENY + "</E>" + "</R>" + "</RL>"; Loading @@ -107,16 +112,18 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.PACKAGE_NAME, "com.app.test"))), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); String expectedRules = "<RL>" + "<R>" + "<OF>" + "<C>" + OpenFormula.NOT + "</C>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "OF", Collections.singletonMap("C", String.valueOf(OpenFormula.NOT)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + "</OF>" + "<E>" + Rule.DENY + "</E>" + "</R>" + "</RL>"; Loading @@ -133,20 +140,22 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.APP_CERTIFICATE, "test_cert"))), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); Map<String, String> appCertificateAttrs = new LinkedHashMap<>(); appCertificateAttrs.put("K", String.valueOf(AtomicFormula.APP_CERTIFICATE)); appCertificateAttrs.put("V", "test_cert"); String expectedRules = "<RL>" + "<R>" + "<OF>" + "<C>" + OpenFormula.AND + "</C>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + "<AF>" + "<K>" + AtomicFormula.APP_CERTIFICATE + "</K>" + "<V>test_cert</V>" + "</AF>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "OF", Collections.singletonMap("C", String.valueOf(OpenFormula.AND)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + generateTagWithAttribute(/* tag= */ "AF", appCertificateAttrs, /* closed= */ true) + "</OF>" + "<E>" + Rule.DENY + "</E>" + "</R>" + "</RL>"; Loading @@ -163,20 +172,22 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.APP_CERTIFICATE, "test_cert"))), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); Map<String, String> appCertificateAttrs = new LinkedHashMap<>(); appCertificateAttrs.put("K", String.valueOf(AtomicFormula.APP_CERTIFICATE)); appCertificateAttrs.put("V", "test_cert"); String expectedRules = "<RL>" + "<R>" + "<OF>" + "<C>" + OpenFormula.OR + "</C>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + "<AF>" + "<K>" + AtomicFormula.APP_CERTIFICATE + "</K>" + "<V>test_cert</V>" + "</AF>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "OF", Collections.singletonMap("C", String.valueOf(OpenFormula.OR)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + generateTagWithAttribute(/* tag= */ "AF", appCertificateAttrs, /* closed= */ true) + "</OF>" + "<E>" + Rule.DENY + "</E>" + "</R>" + "</RL>"; Loading @@ -191,13 +202,14 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.PACKAGE_NAME, "com.app.test"), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); String expectedRules = "<RL>" + "<R>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + "<E>" + Rule.DENY + "</E>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + "</R>" + "</RL>"; Loading @@ -212,14 +224,15 @@ public class RuleXmlSerializerTest { new AtomicFormula.IntAtomicFormula(AtomicFormula.VERSION_CODE, AtomicFormula.EQ, 1), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> versionCodeAttrs = new LinkedHashMap<>(); versionCodeAttrs.put("K", String.valueOf(AtomicFormula.VERSION_CODE)); versionCodeAttrs.put("O", String.valueOf(AtomicFormula.EQ)); versionCodeAttrs.put("V", "1"); String expectedRules = "<RL>" + "<R>" + "<AF>" + "<K>" + AtomicFormula.VERSION_CODE + "</K>" + "<O>" + AtomicFormula.EQ + "</O>" + "<V>1</V>" + "</AF>" + "<E>" + Rule.DENY + "</E>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", versionCodeAttrs, /* closed= */ true) + "</R>" + "</RL>"; Loading @@ -234,13 +247,14 @@ public class RuleXmlSerializerTest { new AtomicFormula.BooleanAtomicFormula(AtomicFormula.PRE_INSTALLED, true), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> preInstalledAttrs = new LinkedHashMap<>(); preInstalledAttrs.put("K", String.valueOf(AtomicFormula.PRE_INSTALLED)); preInstalledAttrs.put("V", "true"); String expectedRules = "<RL>" + "<R>" + "<AF>" + "<K>" + AtomicFormula.PRE_INSTALLED + "</K>" + "<V>true</V>" + "</AF>" + "<E>" + Rule.DENY + "</E>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", preInstalledAttrs, /* closed= */ true) + "</R>" + "</RL>"; Loading @@ -261,6 +275,21 @@ public class RuleXmlSerializerTest { () -> xmlSerializer.serialize(Collections.singletonList(rule))); } private String generateTagWithAttribute(String tag, Map<String, String> attributeValues, boolean closed) { StringBuilder res = new StringBuilder("<"); res.append(tag); for (String attribute : attributeValues.keySet()) { res.append(" "); res.append(attribute); res.append("=\""); res.append(attributeValues.get(attribute)); res.append("\""); } res.append(closed ? " />" : ">"); return res.toString(); } private Formula getInvalidFormula() { return new Formula() { @Override Loading Loading
services/core/java/com/android/server/integrity/parser/RuleXmlParser.java +18 −50 Original line number Diff line number Diff line Loading @@ -40,16 +40,16 @@ public final class RuleXmlParser implements RuleParser { public static final String TAG = "RuleXmlParser"; // TODO: Use XML attributes private static final String NAMESPACE = ""; private static final String RULE_LIST_TAG = "RL"; private static final String RULE_TAG = "R"; private static final String OPEN_FORMULA_TAG = "OF"; private static final String ATOMIC_FORMULA_TAG = "AF"; private static final String EFFECT_TAG = "E"; private static final String KEY_TAG = "K"; private static final String OPERATOR_TAG = "O"; private static final String VALUE_TAG = "V"; private static final String CONNECTOR_TAG = "C"; private static final String EFFECT_ATTRIBUTE = "E"; private static final String KEY_ATTRIBUTE = "K"; private static final String OPERATOR_ATTRIBUTE = "O"; private static final String VALUE_ATTRIBUTE = "V"; private static final String CONNECTOR_ATTRIBUTE = "C"; @Override public List<Rule> parse(String ruleText) throws RuleParseException { Loading Loading @@ -106,7 +106,7 @@ public final class RuleXmlParser implements RuleParser { private static Rule parseRule(XmlPullParser parser) throws IOException, XmlPullParserException { Formula formula = null; @Rule.Effect int effect = 0; @Rule.Effect int effect = Integer.parseInt(extractAttributeValue(parser, EFFECT_ATTRIBUTE)); int eventType; while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { Loading @@ -124,9 +124,6 @@ public final class RuleXmlParser implements RuleParser { case ATOMIC_FORMULA_TAG: formula = parseAtomicFormula(parser); break; case EFFECT_TAG: effect = Integer.parseInt(extractValue(parser)); break; default: throw new RuntimeException( String.format("Found unexpected tag: %s", nodeName)); Loading @@ -142,7 +139,8 @@ public final class RuleXmlParser implements RuleParser { private static Formula parseOpenFormula(XmlPullParser parser) throws IOException, XmlPullParserException { @OpenFormula.Connector int connector = 0; @OpenFormula.Connector int connector = Integer.parseInt( extractAttributeValue(parser, CONNECTOR_ATTRIBUTE)); List<Formula> formulas = new ArrayList<>(); int eventType; Loading @@ -155,9 +153,6 @@ public final class RuleXmlParser implements RuleParser { if (eventType == XmlPullParser.START_TAG) { switch (nodeName) { case CONNECTOR_TAG: connector = Integer.parseInt(extractValue(parser)); break; case ATOMIC_FORMULA_TAG: formulas.add(parseAtomicFormula(parser)); break; Loading @@ -179,37 +174,16 @@ public final class RuleXmlParser implements RuleParser { private static Formula parseAtomicFormula(XmlPullParser parser) throws IOException, XmlPullParserException { @AtomicFormula.Key int key = 0; @AtomicFormula.Operator int operator = 0; String value = null; @AtomicFormula.Key int key = Integer.parseInt(extractAttributeValue(parser, KEY_ATTRIBUTE)); @AtomicFormula.Operator int operator = Integer.parseInt( extractAttributeValue(parser, OPERATOR_ATTRIBUTE)); String value = extractAttributeValue(parser, VALUE_ATTRIBUTE); int eventType; while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { String nodeName = parser.getName(); if (eventType == XmlPullParser.END_TAG && parser.getName().equals(ATOMIC_FORMULA_TAG)) { break; } if (eventType == XmlPullParser.START_TAG) { switch (nodeName) { case KEY_TAG: key = Integer.parseInt(extractValue(parser)); break; case OPERATOR_TAG: operator = Integer.parseInt(extractValue(parser)); break; case VALUE_TAG: value = extractValue(parser); break; default: throw new RuntimeException( String.format("Found unexpected tag: %s", nodeName)); } } else { throw new RuntimeException( String.format("Found unexpected event type: %d", eventType)); } } return constructAtomicFormulaBasedOnKey(key, operator, value); } Loading @@ -231,17 +205,11 @@ public final class RuleXmlParser implements RuleParser { } } private static String extractValue(XmlPullParser parser) throws IOException, XmlPullParserException { String value; int eventType = parser.next(); if (eventType == XmlPullParser.TEXT) { value = parser.getText(); eventType = parser.next(); if (eventType == XmlPullParser.END_TAG) { return value; } private static String extractAttributeValue(XmlPullParser parser, String attribute) { String attributeValue = parser.getAttributeValue(NAMESPACE, attribute); if (attributeValue == null) { throw new RuntimeException(String.format("Attribute not found: %s", attribute)); } throw new RuntimeException(String.format("Found unexpected event type: %d", eventType)); return attributeValue; } }
services/core/java/com/android/server/integrity/serializer/RuleXmlSerializer.java +17 −16 Original line number Diff line number Diff line Loading @@ -43,11 +43,11 @@ public class RuleXmlSerializer implements RuleSerializer { private static final String RULE_TAG = "R"; private static final String OPEN_FORMULA_TAG = "OF"; private static final String ATOMIC_FORMULA_TAG = "AF"; private static final String EFFECT_TAG = "E"; private static final String KEY_TAG = "K"; private static final String OPERATOR_TAG = "O"; private static final String VALUE_TAG = "V"; private static final String CONNECTOR_TAG = "C"; private static final String EFFECT_ATTRIBUTE = "E"; private static final String KEY_ATTRIBUTE = "K"; private static final String OPERATOR_ATTRIBUTE = "O"; private static final String VALUE_ATTRIBUTE = "V"; private static final String CONNECTOR_ATTRIBUTE = "C"; @Override public void serialize(List<Rule> rules, OutputStream outputStream) Loading Loading @@ -88,8 +88,8 @@ public class RuleXmlSerializer implements RuleSerializer { return; } xmlSerializer.startTag(NAMESPACE, RULE_TAG); serializeAttributeValue(EFFECT_ATTRIBUTE, String.valueOf(rule.getEffect()), xmlSerializer); serializeFormula(rule.getFormula(), xmlSerializer); serializeValue(EFFECT_TAG, String.valueOf(rule.getEffect()), xmlSerializer); xmlSerializer.endTag(NAMESPACE, RULE_TAG); } Loading @@ -110,7 +110,8 @@ public class RuleXmlSerializer implements RuleSerializer { return; } xmlSerializer.startTag(NAMESPACE, OPEN_FORMULA_TAG); serializeValue(CONNECTOR_TAG, String.valueOf(openFormula.getConnector()), xmlSerializer); serializeAttributeValue(CONNECTOR_ATTRIBUTE, String.valueOf(openFormula.getConnector()), xmlSerializer); for (Formula formula : openFormula.getFormulas()) { serializeFormula(formula, xmlSerializer); } Loading @@ -123,19 +124,20 @@ public class RuleXmlSerializer implements RuleSerializer { return; } xmlSerializer.startTag(NAMESPACE, ATOMIC_FORMULA_TAG); serializeValue(KEY_TAG, String.valueOf(atomicFormula.getKey()), xmlSerializer); serializeAttributeValue(KEY_ATTRIBUTE, String.valueOf(atomicFormula.getKey()), xmlSerializer); if (atomicFormula instanceof AtomicFormula.StringAtomicFormula) { serializeValue(VALUE_TAG, serializeAttributeValue(VALUE_ATTRIBUTE, ((AtomicFormula.StringAtomicFormula) atomicFormula).getValue(), xmlSerializer); } else if (atomicFormula instanceof AtomicFormula.IntAtomicFormula) { serializeValue(OPERATOR_TAG, serializeAttributeValue(OPERATOR_ATTRIBUTE, String.valueOf(((AtomicFormula.IntAtomicFormula) atomicFormula).getOperator()), xmlSerializer); serializeValue(VALUE_TAG, serializeAttributeValue(VALUE_ATTRIBUTE, String.valueOf(((AtomicFormula.IntAtomicFormula) atomicFormula).getValue()), xmlSerializer); } else if (atomicFormula instanceof AtomicFormula.BooleanAtomicFormula) { serializeValue(VALUE_TAG, serializeAttributeValue(VALUE_ATTRIBUTE, String.valueOf(((AtomicFormula.BooleanAtomicFormula) atomicFormula).getValue()), xmlSerializer); } else { Loading @@ -145,13 +147,12 @@ public class RuleXmlSerializer implements RuleSerializer { xmlSerializer.endTag(NAMESPACE, ATOMIC_FORMULA_TAG); } private void serializeValue(String tag, String value, XmlSerializer xmlSerializer) private void serializeAttributeValue(String attribute, String value, XmlSerializer xmlSerializer) throws IOException { if (value == null) { return; } xmlSerializer.startTag(NAMESPACE, tag); xmlSerializer.text(value); xmlSerializer.endTag(NAMESPACE, tag); xmlSerializer.attribute(NAMESPACE, attribute, value); } }
services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java +206 −160 File changed.Preview size limit exceeded, changes collapsed. Show changes
services/tests/servicestests/src/com/android/server/integrity/serializer/RuleXmlSerializerTest.java +94 −65 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; @RunWith(JUnit4.class) public class RuleXmlSerializerTest { Loading @@ -58,13 +60,14 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.PACKAGE_NAME, "com.app.test"), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); String expectedRules = "<RL>" + "<R>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + "<E>" + Rule.DENY + "</E>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + "</R>" + "</RL>"; Loading @@ -81,16 +84,18 @@ public class RuleXmlSerializerTest { "com.app.test"))), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); OutputStream outputStream = new ByteArrayOutputStream(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); String expectedRules = "<RL>" + "<R>" + "<OF>" + "<C>" + OpenFormula.NOT + "</C>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "OF", Collections.singletonMap("C", String.valueOf(OpenFormula.NOT)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + "</OF>" + "<E>" + Rule.DENY + "</E>" + "</R>" + "</RL>"; Loading @@ -107,16 +112,18 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.PACKAGE_NAME, "com.app.test"))), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); String expectedRules = "<RL>" + "<R>" + "<OF>" + "<C>" + OpenFormula.NOT + "</C>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "OF", Collections.singletonMap("C", String.valueOf(OpenFormula.NOT)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + "</OF>" + "<E>" + Rule.DENY + "</E>" + "</R>" + "</RL>"; Loading @@ -133,20 +140,22 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.APP_CERTIFICATE, "test_cert"))), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); Map<String, String> appCertificateAttrs = new LinkedHashMap<>(); appCertificateAttrs.put("K", String.valueOf(AtomicFormula.APP_CERTIFICATE)); appCertificateAttrs.put("V", "test_cert"); String expectedRules = "<RL>" + "<R>" + "<OF>" + "<C>" + OpenFormula.AND + "</C>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + "<AF>" + "<K>" + AtomicFormula.APP_CERTIFICATE + "</K>" + "<V>test_cert</V>" + "</AF>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "OF", Collections.singletonMap("C", String.valueOf(OpenFormula.AND)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + generateTagWithAttribute(/* tag= */ "AF", appCertificateAttrs, /* closed= */ true) + "</OF>" + "<E>" + Rule.DENY + "</E>" + "</R>" + "</RL>"; Loading @@ -163,20 +172,22 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.APP_CERTIFICATE, "test_cert"))), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); Map<String, String> appCertificateAttrs = new LinkedHashMap<>(); appCertificateAttrs.put("K", String.valueOf(AtomicFormula.APP_CERTIFICATE)); appCertificateAttrs.put("V", "test_cert"); String expectedRules = "<RL>" + "<R>" + "<OF>" + "<C>" + OpenFormula.OR + "</C>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + "<AF>" + "<K>" + AtomicFormula.APP_CERTIFICATE + "</K>" + "<V>test_cert</V>" + "</AF>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "OF", Collections.singletonMap("C", String.valueOf(OpenFormula.OR)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + generateTagWithAttribute(/* tag= */ "AF", appCertificateAttrs, /* closed= */ true) + "</OF>" + "<E>" + Rule.DENY + "</E>" + "</R>" + "</RL>"; Loading @@ -191,13 +202,14 @@ public class RuleXmlSerializerTest { new AtomicFormula.StringAtomicFormula(AtomicFormula.PACKAGE_NAME, "com.app.test"), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> packageNameAttrs = new LinkedHashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); String expectedRules = "<RL>" + "<R>" + "<AF>" + "<K>" + AtomicFormula.PACKAGE_NAME + "</K>" + "<V>com.app.test</V>" + "</AF>" + "<E>" + Rule.DENY + "</E>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + "</R>" + "</RL>"; Loading @@ -212,14 +224,15 @@ public class RuleXmlSerializerTest { new AtomicFormula.IntAtomicFormula(AtomicFormula.VERSION_CODE, AtomicFormula.EQ, 1), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> versionCodeAttrs = new LinkedHashMap<>(); versionCodeAttrs.put("K", String.valueOf(AtomicFormula.VERSION_CODE)); versionCodeAttrs.put("O", String.valueOf(AtomicFormula.EQ)); versionCodeAttrs.put("V", "1"); String expectedRules = "<RL>" + "<R>" + "<AF>" + "<K>" + AtomicFormula.VERSION_CODE + "</K>" + "<O>" + AtomicFormula.EQ + "</O>" + "<V>1</V>" + "</AF>" + "<E>" + Rule.DENY + "</E>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", versionCodeAttrs, /* closed= */ true) + "</R>" + "</RL>"; Loading @@ -234,13 +247,14 @@ public class RuleXmlSerializerTest { new AtomicFormula.BooleanAtomicFormula(AtomicFormula.PRE_INSTALLED, true), Rule.DENY); RuleSerializer xmlSerializer = new RuleXmlSerializer(); Map<String, String> preInstalledAttrs = new LinkedHashMap<>(); preInstalledAttrs.put("K", String.valueOf(AtomicFormula.PRE_INSTALLED)); preInstalledAttrs.put("V", "true"); String expectedRules = "<RL>" + "<R>" + "<AF>" + "<K>" + AtomicFormula.PRE_INSTALLED + "</K>" + "<V>true</V>" + "</AF>" + "<E>" + Rule.DENY + "</E>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), /* closed= */ false) + generateTagWithAttribute(/* tag= */ "AF", preInstalledAttrs, /* closed= */ true) + "</R>" + "</RL>"; Loading @@ -261,6 +275,21 @@ public class RuleXmlSerializerTest { () -> xmlSerializer.serialize(Collections.singletonList(rule))); } private String generateTagWithAttribute(String tag, Map<String, String> attributeValues, boolean closed) { StringBuilder res = new StringBuilder("<"); res.append(tag); for (String attribute : attributeValues.keySet()) { res.append(" "); res.append(attribute); res.append("=\""); res.append(attributeValues.get(attribute)); res.append("\""); } res.append(closed ? " />" : ">"); return res.toString(); } private Formula getInvalidFormula() { return new Formula() { @Override Loading