You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2013/11/07 22:29:15 UTC
svn commit: r1539828 - in /poi/trunk: src/java/org/apache/poi/poifs/crypt/
src/ooxml/testcases/org/apache/poi/xwpf/ test-data/document/
Author: nick
Date: Thu Nov 7 21:29:14 2013
New Revision: 1539828
URL: http://svn.apache.org/r1539828
Log:
Patch from Andreas Beeker from bug #53475 - CSPName may not always be present on OOXML encrypted documents, plus test
Added:
poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java
poi/trunk/test-data/document/bug53475-password-is-solrcell.docx (with props)
Modified:
poi/trunk/src/java/org/apache/poi/poifs/crypt/EncryptionHeader.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java
Modified: poi/trunk/src/java/org/apache/poi/poifs/crypt/EncryptionHeader.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/crypt/EncryptionHeader.java?rev=1539828&r1=1539827&r2=1539828&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/crypt/EncryptionHeader.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/crypt/EncryptionHeader.java Thu Nov 7 21:29:14 2013
@@ -16,15 +16,16 @@
==================================================================== */
package org.apache.poi.poifs.crypt;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.poi.poifs.filesystem.DocumentInputStream;
-
-import java.io.IOException;
import java.io.ByteArrayInputStream;
+import java.io.IOException;
-import org.w3c.dom.NamedNodeMap;
import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.commons.codec.binary.Base64;
import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.poifs.filesystem.DocumentInputStream;
+import org.apache.poi.util.LittleEndianConsts;
+import org.w3c.dom.NamedNodeMap;
/**
* Reads and processes OOXML Encryption Headers
@@ -69,18 +70,24 @@ public class EncryptionHeader {
is.readLong(); // skip reserved
- StringBuilder builder = new StringBuilder();
-
- while (true) {
- char c = (char) is.readShort();
-
- if (c == 0) {
- break;
+ // CSPName may not always be specified
+ // In some cases, the sale value of the EncryptionVerifier has the details
+ is.mark(LittleEndianConsts.INT_SIZE+1);
+ int checkForSalt = is.readInt();
+ is.reset();
+
+ if (checkForSalt == 16) {
+ cspName = "";
+ } else {
+ StringBuilder builder = new StringBuilder();
+ while (true) {
+ char c = (char) is.readShort();
+ if (c == 0) break;
+ builder.append(c);
}
-
- builder.append(c);
+ cspName = builder.toString();
}
- cspName = builder.toString();
+
cipherMode = MODE_ECB;
keySalt = null;
}
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java?rev=1539828&r1=1539827&r2=1539828&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java Thu Nov 7 21:29:14 2013
@@ -41,6 +41,7 @@ public final class AllXWPFTests {
public static Test suite() {
TestSuite result = new TestSuite(AllXWPFTests.class.getName());
+ result.addTestSuite(TestXWPFBugs.class);
result.addTestSuite(TestXWPFDocument.class);
result.addTestSuite(TestXWPFWordExtractor.class);
result.addTestSuite(TestXWPFHeaderFooterPolicy.class);
Added: poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java?rev=1539828&view=auto
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java (added)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java Thu Nov 7 21:29:14 2013
@@ -0,0 +1,52 @@
+package org.apache.poi.xwpf;
+
+import java.io.File;
+import java.io.InputStream;
+
+import junit.framework.TestCase;
+
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.poifs.crypt.Decryptor;
+import org.apache.poi.poifs.crypt.EncryptionHeader;
+import org.apache.poi.poifs.crypt.EncryptionInfo;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+
+public class TestXWPFBugs extends TestCase {
+ /**
+ * A word document that's encrypted with non-standard
+ * Encryption options, and no cspname section. See bug 53475
+ */
+ public void test53475() throws Exception {
+ try {
+ Biff8EncryptionKey.setCurrentUserPassword("solrcell");
+ File file = POIDataSamples.getDocumentInstance().getFile("bug53475-password-is-solrcell.docx");
+ NPOIFSFileSystem filesystem = new NPOIFSFileSystem(file, true);
+
+ // Check the encryption details
+ EncryptionInfo info = new EncryptionInfo(filesystem);
+ assertEquals(128, info.getHeader().getKeySize());
+ assertEquals(EncryptionHeader.ALGORITHM_AES_128, info.getHeader().getAlgorithm());
+ assertEquals(EncryptionHeader.HASH_SHA1, info.getHeader().getHashAlgorithm());
+
+ // Check it can be decoded
+ Decryptor d = Decryptor.getInstance(info);
+ assertTrue("Unable to process: document is encrypted", d.verifyPassword("solrcell"));
+
+ // Check we can read the word document in that
+ InputStream dataStream = d.getDataStream(filesystem);
+ OPCPackage opc = OPCPackage.open(dataStream);
+ XWPFDocument doc = new XWPFDocument(opc);
+ XWPFWordExtractor ex = new XWPFWordExtractor(doc);
+ String text = ex.getText();
+ assertNotNull(text);
+ assertEquals("This is password protected Word document.", text.trim());
+ ex.close();
+ } finally {
+ Biff8EncryptionKey.setCurrentUserPassword(null);
+ }
+ }
+}
Added: poi/trunk/test-data/document/bug53475-password-is-solrcell.docx
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/document/bug53475-password-is-solrcell.docx?rev=1539828&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/test-data/document/bug53475-password-is-solrcell.docx
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org