\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
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
================================================================= */ \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
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
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
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