diff options
| author | 2019-11-25 17:24:22 +0000 | |
|---|---|---|
| committer | 2019-11-26 15:36:14 +0000 | |
| commit | e39fa0fd2fddf0f1a9688d136a3b074e8d77af89 (patch) | |
| tree | baed9720b47f44fcee1045d2d9599bcf4f0761eb | |
| parent | 5809a5f28644cf7adef5d2f83da62f68594e8d95 (diff) | |
Support optional rule attributes in XML parser
Bug: 143697198
Test: atest FrameworksServicesTests:RuleXmlParserTest
Change-Id: Ib7118228f325f8fcb88fa27cf88d48af0319e320
| -rw-r--r-- | services/core/java/com/android/server/integrity/parser/RuleXmlParser.java | 23 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java | 60 |
2 files changed, 53 insertions, 30 deletions
diff --git a/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java b/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java index 11a397948b14..5459a77705f2 100644 --- a/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java +++ b/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java @@ -32,6 +32,7 @@ import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * A helper class to parse rules into the {@link Rule} model from Xml representation. @@ -106,7 +107,7 @@ public final class RuleXmlParser implements RuleParser { private static Rule parseRule(XmlPullParser parser) throws IOException, XmlPullParserException { Formula formula = null; - @Rule.Effect int effect = Integer.parseInt(extractAttributeValue(parser, EFFECT_ATTRIBUTE)); + int effect = Integer.parseInt(extractAttributeValue(parser, EFFECT_ATTRIBUTE).orElse("-1")); int eventType; while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { @@ -139,8 +140,8 @@ public final class RuleXmlParser implements RuleParser { private static Formula parseOpenFormula(XmlPullParser parser) throws IOException, XmlPullParserException { - @OpenFormula.Connector int connector = Integer.parseInt( - extractAttributeValue(parser, CONNECTOR_ATTRIBUTE)); + int connector = Integer.parseInt( + extractAttributeValue(parser, CONNECTOR_ATTRIBUTE).orElse("-1")); List<Formula> formulas = new ArrayList<>(); int eventType; @@ -174,10 +175,10 @@ public final class RuleXmlParser implements RuleParser { private static Formula parseAtomicFormula(XmlPullParser parser) throws IOException, XmlPullParserException { - @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 key = Integer.parseInt(extractAttributeValue(parser, KEY_ATTRIBUTE).orElse("-1")); + int operator = Integer.parseInt( + extractAttributeValue(parser, OPERATOR_ATTRIBUTE).orElse("-1")); + String value = extractAttributeValue(parser, VALUE_ATTRIBUTE).orElse(null); int eventType; while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { @@ -205,11 +206,7 @@ public final class RuleXmlParser implements RuleParser { } } - 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)); - } - return attributeValue; + private static Optional<String> extractAttributeValue(XmlPullParser parser, String attribute) { + return Optional.ofNullable(parser.getAttributeValue(NAMESPACE, attribute)); } } diff --git a/services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java b/services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java index be6a31fa949e..eca1b8556496 100644 --- a/services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java +++ b/services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java @@ -43,7 +43,6 @@ public class RuleXmlParserTest { public void testXmlStream_validOpenFormula() throws Exception { Map<String, String> atomicFormulaAttrs = new HashMap<>(); atomicFormulaAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - atomicFormulaAttrs.put("O", String.valueOf(AtomicFormula.EQ)); atomicFormulaAttrs.put("V", "com.app.test"); String ruleXmlOpenFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -71,7 +70,6 @@ public class RuleXmlParserTest { public void testXmlString_validOpenFormula_notConnector() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); packageNameAttrs.put("V", "com.app.test"); String ruleXmlOpenFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -98,11 +96,9 @@ public class RuleXmlParserTest { public void testXmlString_validOpenFormula_andConnector() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); packageNameAttrs.put("V", "com.app.test"); Map<String, String> appCertificateAttrs = new HashMap<>(); appCertificateAttrs.put("K", String.valueOf(AtomicFormula.APP_CERTIFICATE)); - appCertificateAttrs.put("O", String.valueOf(AtomicFormula.EQ)); appCertificateAttrs.put("V", "test_cert"); String ruleXmlOpenFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -131,11 +127,9 @@ public class RuleXmlParserTest { public void testXmlString_validOpenFormula_orConnector() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); packageNameAttrs.put("V", "com.app.test"); Map<String, String> appCertificateAttrs = new HashMap<>(); appCertificateAttrs.put("K", String.valueOf(AtomicFormula.APP_CERTIFICATE)); - appCertificateAttrs.put("O", String.valueOf(AtomicFormula.EQ)); appCertificateAttrs.put("V", "test_cert"); String ruleXmlOpenFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -165,7 +159,6 @@ public class RuleXmlParserTest { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); String ruleXmlOpenFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), @@ -191,7 +184,6 @@ public class RuleXmlParserTest { public void testXmlString_invalidOpenFormula_invalidNumberOfFormulas() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); packageNameAttrs.put("V", "com.app.test"); Map<String, String> versionCodeAttrs = new HashMap<>(); versionCodeAttrs.put("K", String.valueOf(AtomicFormula.VERSION_CODE)); @@ -246,7 +238,6 @@ public class RuleXmlParserTest { public void testXmlString_invalidOpenFormula_invalidEffect() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); packageNameAttrs.put("V", "com.app.test"); String ruleXmlOpenFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -271,7 +262,6 @@ public class RuleXmlParserTest { public void testXmlString_invalidOpenFormula_invalidTags() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); packageNameAttrs.put("V", "com.app.test"); String ruleXmlOpenFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -297,7 +287,6 @@ public class RuleXmlParserTest { public void testXmlString_validAtomicFormula_stringValue() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); packageNameAttrs.put("V", "com.app.test"); String ruleXmlAtomicFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -343,7 +332,6 @@ public class RuleXmlParserTest { public void testXmlString_validAtomicFormula_booleanValue() throws Exception { Map<String, String> preInstalledAttrs = new HashMap<>(); preInstalledAttrs.put("K", String.valueOf(AtomicFormula.PRE_INSTALLED)); - preInstalledAttrs.put("O", String.valueOf(AtomicFormula.EQ)); preInstalledAttrs.put("V", "true"); String ruleXmlAtomicFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -367,7 +355,6 @@ public class RuleXmlParserTest { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); packageNameAttrs.put("V", "com.app.test"); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); String ruleXmlAtomicFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), @@ -389,7 +376,6 @@ public class RuleXmlParserTest { public void testXmlString_invalidAtomicFormula_invalidAttribute() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("BadKey", String.valueOf(AtomicFormula.PACKAGE_NAME)); - packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ)); packageNameAttrs.put("V", "com.app.test"); String ruleXmlAtomicFormula = "<RL>" + generateTagWithAttribute(/* tag= */ "R", @@ -402,11 +388,53 @@ public class RuleXmlParserTest { assertExpectException( RuleParseException.class, - /* expectedExceptionMessageRegex */ "Attribute not found: K", + /* expectedExceptionMessageRegex */ "Found unexpected key: -1", + () -> xmlParser.parse(ruleXmlAtomicFormula)); + } + + @Test + public void testXmlString_invalidRule_invalidAttribute() throws Exception { + Map<String, String> packageNameAttrs = new HashMap<>(); + packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); + packageNameAttrs.put("V", "com.app.test"); + String ruleXmlAtomicFormula = "<RL>" + + generateTagWithAttribute(/* tag= */ "R", + Collections.singletonMap("BadEffect", String.valueOf(Rule.DENY)), + /* closed= */ false) + + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + + "</R>" + + "</RL>"; + RuleParser xmlParser = new RuleXmlParser(); + assertExpectException( + RuleParseException.class, + /* expectedExceptionMessageRegex */ "Unknown effect: -1", () -> xmlParser.parse(ruleXmlAtomicFormula)); } @Test + public void testXmlString_invalidOpenFormula_invalidAttribute() throws Exception { + Map<String, String> packageNameAttrs = new HashMap<>(); + packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); + packageNameAttrs.put("V", "com.app.test"); + String ruleXmlOpenFormula = "<RL>" + + generateTagWithAttribute(/* tag= */ "R", + Collections.singletonMap("E", String.valueOf(Rule.DENY)), + /* closed= */ false) + + generateTagWithAttribute(/* tag= */ "OF", + Collections.singletonMap("BadConnector", String.valueOf(OpenFormula.NOT)), + /* closed= */ false) + + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true) + + "</OF>" + + "</R>" + + "</RL>"; + RuleParser xmlParser = new RuleXmlParser(); + assertExpectException( + RuleParseException.class, + /* expectedExceptionMessageRegex */ "Unknown connector: -1", + () -> xmlParser.parse(ruleXmlOpenFormula)); + } + + @Test public void testXmlString_invalidAtomicFormula() throws Exception { Map<String, String> packageNameAttrs = new HashMap<>(); packageNameAttrs.put("K", String.valueOf(AtomicFormula.VERSION_CODE)); @@ -431,7 +459,6 @@ public class RuleXmlParserTest { public void testXmlString_withNoRuleList() { Map<String, String> atomicFormulaAttrs = new HashMap<>(); atomicFormulaAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - atomicFormulaAttrs.put("O", String.valueOf(AtomicFormula.EQ)); atomicFormulaAttrs.put("V", "com.app.test"); String ruleXmlWithNoRuleList = generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), @@ -454,7 +481,6 @@ public class RuleXmlParserTest { public void testXmlStream_withNoRuleList() { Map<String, String> atomicFormulaAttrs = new HashMap<>(); atomicFormulaAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME)); - atomicFormulaAttrs.put("O", String.valueOf(AtomicFormula.EQ)); atomicFormulaAttrs.put("V", "com.app.test"); String ruleXmlWithNoRuleList = generateTagWithAttribute(/* tag= */ "R", Collections.singletonMap("E", String.valueOf(Rule.DENY)), |