]> source.dussan.org Git - poi.git/commitdiff
XML signatures - ignore line breaks in Office 2007 .rels files
authorAndreas Beeker <kiwiwings@apache.org>
Fri, 5 Dec 2014 20:20:23 +0000 (20:20 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Fri, 5 Dec 2014 20:20:23 +0000 (20:20 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1643415 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/poifs/crypt/dsig/OOXMLURIDereferencer.java
src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java
test-data/xmldsign/office2007prettyPrintedRels.docx [new file with mode: 0644]

index dad12d2e8f0e9eed09e0ef5a96352796e7de1bc1..64eb53d6f835f23dc5d468b63dda124fd6776f07 100644 (file)
 \r
 package org.apache.poi.poifs.crypt.dsig;\r
 \r
+import java.io.ByteArrayInputStream;\r
+import java.io.ByteArrayOutputStream;\r
 import java.io.IOException;\r
+import java.io.InputStream;\r
 import java.net.URI;\r
 import java.net.URISyntaxException;\r
 \r
@@ -81,12 +84,28 @@ public class OOXMLURIDereferencer implements URIDereferencer, SignatureConfigura
             LOG.log(POILogger.DEBUG, "cannot resolve, delegating to base DOM URI dereferencer", uri);\r
             return this.baseUriDereferencer.dereference(uriReference, context);\r
         }\r
-        \r
+\r
+        InputStream dataStream;\r
         try {\r
-            return new OctetStreamData(part.getInputStream(), uri.toString(), null);\r
+            dataStream = part.getInputStream();\r
+\r
+            // workaround for office 2007 pretty-printed .rels files\r
+            if (part.getPartName().toString().endsWith(".rels")) {\r
+                // although xmlsec has an option to ignore line breaks, currently this\r
+                // only affects .rels files, so we only modify these\r
+                // http://stackoverflow.com/questions/4728300\r
+                ByteArrayOutputStream bos = new ByteArrayOutputStream();\r
+                for (int ch; (ch = dataStream.read()) != -1; ) {\r
+                    if (ch == 10 || ch == 13) continue;\r
+                    bos.write(ch);\r
+                }\r
+                dataStream = new ByteArrayInputStream(bos.toByteArray());\r
+            }\r
         } catch (IOException e) {\r
             throw new URIReferenceException("I/O error: " + e.getMessage(), e);\r
         }\r
+        \r
+        return new OctetStreamData(dataStream, uri.toString(), null);\r
     }\r
 \r
     private PackagePart findPart(URI uri) {\r
index 609a26d6b64db2c455e2de09fe5c0c2d7f2451c9..fe7a91bc024dded2fa4a59b41738640d47137fa1 100644 (file)
    ================================================================= */ \r
 package org.apache.poi.poifs.crypt;\r
 \r
-import static org.junit.Assert.*;\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertFalse;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertTrue;\r
 \r
 import java.io.File;\r
 import java.io.FileInputStream;\r
@@ -108,6 +111,17 @@ public class TestSignatureInfo {
                 additionalJar == null || additionalJar.trim().length() == 0);\r
     }\r
     \r
+    @Test\r
+    public void office2007prettyPrintedRels() throws Exception {\r
+        OPCPackage pkg = OPCPackage.open(testdata.getFile("office2007prettyPrintedRels.docx"), PackageAccess.READ);\r
+        SignatureConfig sic = new SignatureConfig();\r
+        sic.setOpcPackage(pkg);\r
+        SignatureInfo si = new SignatureInfo();\r
+        si.setSignatureConfig(sic);\r
+        boolean isValid = si.verifySignature();\r
+        assertTrue(isValid);\r
+    }\r
+    \r
     @Test\r
     public void getSignerUnsigned() throws Exception {\r
         String testFiles[] = { \r
@@ -222,7 +236,6 @@ public class TestSignatureInfo {
     public void testManipulation() throws Exception {\r
         // sign & validate\r
         String testFile = "hello-world-unsigned.xlsx";\r
-        @SuppressWarnings("resource")       // closed via XSSFWorkbook.close() below ?!\r
         OPCPackage pkg = OPCPackage.open(copy(testdata.getFile(testFile)), PackageAccess.READ_WRITE);\r
         sign(pkg, "Test", "CN=Test", 1);\r
         \r
@@ -523,14 +536,6 @@ public class TestSignatureInfo {
                 si.confirmSignature();\r
                 boolean b = si.verifySignature();\r
                 assertTrue("Signature not correctly calculated for " + ha, b);\r
-//            } catch (EncryptedDocumentException e) {\r
-//                // see http://apache-poi.1045710.n5.nabble.com/org-apache-poi-poifs-crypt-TestSignatureInfo-failing-on-trunk-on-Java-6-tp5717032.html\r
-//                Throwable cause = e.getCause();\r
-//                if (cause instanceof ArrayIndexOutOfBoundsException) {\r
-//                    LOG.log(POILogger.ERROR, "ignoring AIOOBE - hopefully a SHA2 bug ...", e);\r
-//                } else {\r
-//                    throw e;\r
-//                }\r
             } finally {\r
                 if (pkg != null) pkg.close();\r
             }\r
diff --git a/test-data/xmldsign/office2007prettyPrintedRels.docx b/test-data/xmldsign/office2007prettyPrintedRels.docx
new file mode 100644 (file)
index 0000000..ce8b940
Binary files /dev/null and b/test-data/xmldsign/office2007prettyPrintedRels.docx differ