diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/xml/ResXmlPatcher.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/xml/ResXmlPatcher.java index 5d91e433..4b5036a3 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/xml/ResXmlPatcher.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/xml/ResXmlPatcher.java @@ -246,6 +246,8 @@ public final class ResXmlPatcher { throws IOException, SAXException, ParserConfigurationException { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + docFactory.setFeature(FEATURE_DISABLE_DOCTYPE_DECL, true); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); return docBuilder.parse(file); } @@ -264,10 +266,10 @@ public final class ResXmlPatcher { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty(OutputKeys.STANDALONE,"yes"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(file); transformer.transform(source, result); } + + private static final String FEATURE_DISABLE_DOCTYPE_DECL = "http://apache.org/xml/features/disallow-doctype-decl"; } diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/ExternalEntityTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/ExternalEntityTest.java new file mode 100644 index 00000000..4fb56f43 --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/ExternalEntityTest.java @@ -0,0 +1,76 @@ +/** + * Copyright 2014 Ryszard Wiśniewski + * Copyright 2016 Connor Tumbleson + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package brut.androlib; + +import brut.directory.ExtFile; +import brut.common.BrutException; +import brut.util.OS; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.logging.Logger; + +import static org.junit.Assert.assertEquals; + +/** + * @author Connor Tumbleson + */ +public class ExternalEntityTest { + + @BeforeClass + public static void beforeClass() throws Exception { + sOrigDir = new ExtFile(OS.createTempDirectory()); + TestUtils.copyResourceDir(ExternalEntityTest.class, "brut/apktool/doctype/", sOrigDir); + + LOGGER.info("Building doctype.apk..."); + File testApk = new File(sOrigDir, "doctype.apk"); + new Androlib().build(sOrigDir, testApk); + + LOGGER.info("Decoding doctype.apk..."); + ApkDecoder apkDecoder = new ApkDecoder(testApk); + apkDecoder.setOutDir(new File(sOrigDir + File.separator + "output")); + apkDecoder.decode(); + } + + @AfterClass + public static void afterClass() throws BrutException { + OS.rmdir(sOrigDir); + } + + @Test + public void doctypeTest() throws BrutException, IOException { + + String expected = TestUtils.replaceNewlines("\n" + + "\n" + + " \n" + + ""); + + byte[] encoded = Files.readAllBytes(Paths.get(sOrigDir + File.separator + "output" + File.separator + "AndroidManifest.xml")); + String obtained = TestUtils.replaceNewlines(new String(encoded)); + assertEquals(expected, obtained); + } + + private static ExtFile sOrigDir; + + private final static Logger LOGGER = Logger.getLogger(ExternalEntityTest.class.getName()); +} \ No newline at end of file diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/doctype/AndroidManifest.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/doctype/AndroidManifest.xml new file mode 100644 index 00000000..0d8c43fa --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/doctype/AndroidManifest.xml @@ -0,0 +1,6 @@ + +]> + + &e1; + + \ No newline at end of file diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/doctype/apktool.yml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/doctype/apktool.yml new file mode 100644 index 00000000..f8744a9b --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/doctype/apktool.yml @@ -0,0 +1,12 @@ +version: 2.0.0 +apkFileName: doctype.apk +isFrameworkApk: false +usesFramework: + ids: + - 1 +packageInfo: + forced-package-id: '127' +versionInfo: + versionCode: '1' + versionName: '1.0' +compressionType: false \ No newline at end of file