diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java index cc6f7ca83..b9517ba2e 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java @@ -237,14 +237,9 @@ public final class TestOPCComplianceCoreProperties extends TestCase { */ public void testNoCoreProperties_saveNew() throws Exception { String sampleFileName = "OPCCompliance_NoCoreProperties.xlsx"; - OPCPackage pkg = null; - try { - pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath()); - } catch (Exception e) { - throw new RuntimeException(e); - } + OPCPackage pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath()); - // Empty properties + // Verify it has empty properties assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size()); assertNotNull(pkg.getPackageProperties()); assertNotNull(pkg.getPackageProperties().getLanguageProperty()); @@ -262,6 +257,22 @@ public final class TestOPCComplianceCoreProperties extends TestCase { assertNotNull(pkg.getPackageProperties()); assertNotNull(pkg.getPackageProperties().getLanguageProperty()); assertNull(pkg.getPackageProperties().getLanguageProperty().getValue()); + + + // Open a new copy of it + pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath()); + + // Save and re-load, without having touched the properties yet + baos = new ByteArrayOutputStream(); + pkg.save(baos); + bais = new ByteArrayInputStream(baos.toByteArray()); + pkg = OPCPackage.open(bais); + + // Check that this too added empty properties without error + assertEquals(1, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size()); + assertNotNull(pkg.getPackageProperties()); + assertNotNull(pkg.getPackageProperties().getLanguageProperty()); + assertNull(pkg.getPackageProperties().getLanguageProperty().getValue()); } /** diff --git a/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java b/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java index 37deba5e8..2cd9889bd 100644 --- a/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java +++ b/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java @@ -18,6 +18,8 @@ package org.apache.poi.poifs.crypt; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; @@ -32,6 +34,8 @@ import java.util.Iterator; import javax.crypto.Cipher; import org.apache.poi.POIDataSamples; +import org.apache.poi.openxml4j.opc.ContentTypes; +import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.poifs.crypt.agile.AgileEncryptionHeader; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DocumentNode; @@ -266,6 +270,55 @@ public class TestEncryptor { assertArrayEquals(payloadExpected, payloadActual); } + /** + * Ensure we can encrypt a package that is missing the Core + * Properties, eg one from dodgy versions of Jasper Reports + * See https://github.com/nestoru/xlsxenc/ and + * http://stackoverflow.com/questions/28593223 + */ + @Test + public void encryptPackageWithoutCoreProperties() throws Exception { + // Open our file without core properties + File inp = POIDataSamples.getOpenXML4JInstance().getFile("OPCCompliance_NoCoreProperties.xlsx"); + OPCPackage pkg = OPCPackage.open(inp.getPath()); + + // It doesn't have any core properties yet + assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size()); + assertNotNull(pkg.getPackageProperties()); + assertNotNull(pkg.getPackageProperties().getLanguageProperty()); + assertNull(pkg.getPackageProperties().getLanguageProperty().getValue()); + + // Encrypt it + EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile); + NPOIFSFileSystem fs = new NPOIFSFileSystem(); + + Encryptor enc = info.getEncryptor(); + enc.confirmPassword("password"); + OutputStream os = enc.getDataStream(fs); + pkg.save(os); + pkg.revert(); + + // Save the resulting OLE2 document, and re-open it + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + fs.writeFilesystem(baos); + + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + NPOIFSFileSystem inpFS = new NPOIFSFileSystem(bais); + + // Check we can decrypt it + info = new EncryptionInfo(inpFS); + Decryptor d = Decryptor.getInstance(info); + assertEquals(true, d.verifyPassword("password")); + + OPCPackage inpPkg = OPCPackage.open(d.getDataStream(inpFS)); + + // Check it now has empty core properties + assertEquals(1, inpPkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size()); + assertNotNull(inpPkg.getPackageProperties()); + assertNotNull(inpPkg.getPackageProperties().getLanguageProperty()); + assertNull(inpPkg.getPackageProperties().getLanguageProperty().getValue()); + } + @Test @Ignore public void inPlaceRewrite() throws Exception {