Cleanup Biff8EncryptionKey usage and use HPSF constants instead of duplicated strings

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1830705 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2018-05-01 18:22:00 +00:00
parent 32b370fb67
commit 83eb0ca821
18 changed files with 265 additions and 295 deletions

View File

@ -46,8 +46,7 @@ public class ReadTitle
{ {
final String filename = args[0]; final String filename = args[0];
POIFSReader r = new POIFSReader(); POIFSReader r = new POIFSReader();
r.registerListener(new MyPOIFSReaderListener(), r.registerListener(new MyPOIFSReaderListener(), SummaryInformation.DEFAULT_STREAM_NAME);
"\005SummaryInformation");
r.read(new FileInputStream(filename)); r.read(new FileInputStream(filename));
} }

View File

@ -52,11 +52,6 @@ import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class) @RunWith(Parameterized.class)
public class TestHxxFEncryption { public class TestHxxFEncryption {
@AfterClass
public static void clearPass() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
@Parameter(value = 0) @Parameter(value = 0)
public POIDataSamples sampleDir; public POIDataSamples sampleDir;
@ -99,12 +94,14 @@ public class TestHxxFEncryption {
@Test @Test
public void extract() throws IOException, OpenXML4JException, XmlException { public void extract() throws IOException, OpenXML4JException, XmlException {
Biff8EncryptionKey.setCurrentUserPassword(password);
File f = sampleDir.getFile(file); File f = sampleDir.getFile(file);
POITextExtractor te = ExtractorFactory.createExtractor(f); Biff8EncryptionKey.setCurrentUserPassword(password);
String actual = te.getText().trim(); try (POITextExtractor te = ExtractorFactory.createExtractor(f)) {
assertEquals(expected, actual); String actual = te.getText().trim();
te.close(); assertEquals(expected, actual);
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
} }
@Test @Test
@ -118,70 +115,72 @@ public class TestHxxFEncryption {
} }
public void newPassword(String newPass) throws IOException, OpenXML4JException, XmlException { public void newPassword(String newPass) throws IOException, OpenXML4JException, XmlException {
Biff8EncryptionKey.setCurrentUserPassword(password);
File f = sampleDir.getFile(file); File f = sampleDir.getFile(file);
POITextExtractor te1 = ExtractorFactory.createExtractor(f); Biff8EncryptionKey.setCurrentUserPassword(password);
Biff8EncryptionKey.setCurrentUserPassword(newPass); try (POITextExtractor te1 = ExtractorFactory.createExtractor(f)) {
ByteArrayOutputStream bos = new ByteArrayOutputStream(); Biff8EncryptionKey.setCurrentUserPassword(newPass);
POIDocument doc = (POIDocument)te1.getDocument(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
doc.write(bos); try (POIDocument doc = (POIDocument) te1.getDocument()) {
doc.close(); doc.write(bos);
te1.close(); }
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
POITextExtractor te2 = ExtractorFactory.createExtractor(bis); try (POITextExtractor te2 = ExtractorFactory.createExtractor(bis)) {
String actual = te2.getText().trim(); String actual = te2.getText().trim();
assertEquals(expected, actual); assertEquals(expected, actual);
te2.close(); }
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
} }
/** changing the encryption mode and key size in poor mans style - see comments below */ /** changing the encryption mode and key size in poor mans style - see comments below */
@Test @Test
public void changeEncryption() throws IOException, OpenXML4JException, XmlException { public void changeEncryption() throws IOException, OpenXML4JException, XmlException {
File f = sampleDir.getFile(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
Biff8EncryptionKey.setCurrentUserPassword(password); Biff8EncryptionKey.setCurrentUserPassword(password);
File f = sampleDir.getFile(file); try (POITextExtractor te1 = ExtractorFactory.createExtractor(f)) {
POITextExtractor te1 = ExtractorFactory.createExtractor(f); // first remove encryption
// first remove encryption Biff8EncryptionKey.setCurrentUserPassword(null);
Biff8EncryptionKey.setCurrentUserPassword(null); try (POIDocument doc = (POIDocument) te1.getDocument()) {
POIDocument doc = (POIDocument)te1.getDocument(); doc.write(bos);
doc.write(bos); }
doc.close(); // then use default setting, which is cryptoapi
te1.close(); String newPass = "newPass";
// then use default setting, which is cryptoapi try (POITextExtractor te2 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray()))) {
String newPass = "newPass"; Biff8EncryptionKey.setCurrentUserPassword(newPass);
POITextExtractor te2 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray())); try (POIDocument doc = (POIDocument) te2.getDocument()) {
Biff8EncryptionKey.setCurrentUserPassword(newPass); bos.reset();
doc = (POIDocument)te2.getDocument(); doc.write(bos);
bos.reset(); }
doc.write(bos); }
doc.close(); // and finally update cryptoapi setting
te2.close(); try (POITextExtractor te3 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray()));
// and finally update cryptoapi setting POIDocument doc = (POIDocument) te3.getDocument()) {
POITextExtractor te3 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray())); // need to cache data (i.e. read all data) before changing the key size
doc = (POIDocument)te3.getDocument(); if (doc instanceof HSLFSlideShowImpl) {
// need to cache data (i.e. read all data) before changing the key size HSLFSlideShowImpl hss = (HSLFSlideShowImpl) doc;
if (doc instanceof HSLFSlideShowImpl) { hss.getPictureData();
HSLFSlideShowImpl hss = (HSLFSlideShowImpl)doc; hss.getDocumentSummaryInformation();
hss.getPictureData(); }
hss.getDocumentSummaryInformation(); EncryptionInfo ei = doc.getEncryptionInfo();
assertNotNull(ei);
assertTrue(ei.getHeader() instanceof CryptoAPIEncryptionHeader);
assertEquals(0x28, ei.getHeader().getKeySize());
ei.getHeader().setKeySize(0x78);
bos.reset();
doc.write(bos);
}
// check the setting
try (POITextExtractor te4 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray()));
POIDocument doc = (POIDocument) te4.getDocument()) {
EncryptionInfo ei = doc.getEncryptionInfo();
assertNotNull(ei);
assertTrue(ei.getHeader() instanceof CryptoAPIEncryptionHeader);
assertEquals(0x78, ei.getHeader().getKeySize());
}
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
} }
EncryptionInfo ei = doc.getEncryptionInfo();
assertNotNull(ei);
assertTrue(ei.getHeader() instanceof CryptoAPIEncryptionHeader);
assertEquals(0x28, ei.getHeader().getKeySize());
ei.getHeader().setKeySize(0x78);
bos.reset();
doc.write(bos);
doc.close();
te3.close();
// check the setting
POITextExtractor te4 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray()));
doc = (POIDocument)te4.getDocument();
ei = doc.getEncryptionInfo();
assertNotNull(ei);
assertTrue(ei.getHeader() instanceof CryptoAPIEncryptionHeader);
assertEquals(0x78, ei.getHeader().getKeySize());
doc.close();
te4.close();
} }
} }

View File

@ -28,7 +28,9 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.HPSFPropertiesOnlyDocument; import org.apache.poi.hpsf.HPSFPropertiesOnlyDocument;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
import org.apache.poi.hwpf.HWPFTestDataSamples; import org.apache.poi.hwpf.HWPFTestDataSamples;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
@ -91,8 +93,8 @@ public final class TestPOIDocumentScratchpad {
doc.writeProperties(outFS); doc.writeProperties(outFS);
// Should now hold them // Should now hold them
assertNotNull(outFS.createDocumentInputStream("\005SummaryInformation")); assertNotNull(outFS.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME));
assertNotNull(outFS.createDocumentInputStream("\005DocumentSummaryInformation")); assertNotNull(outFS.createDocumentInputStream(DocumentSummaryInformation.DEFAULT_STREAM_NAME));
outFS.close(); outFS.close();
} }

View File

@ -59,94 +59,90 @@ import org.junit.Test;
public class TestDocumentEncryption { public class TestDocumentEncryption {
POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
@Before
@After // also afterwards to not affect other tests running in the same JVM
public void resetPassword() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
@Test @Test
public void cryptoAPIDecryptionOther() throws Exception { public void cryptoAPIDecryptionOther() throws Exception {
Biff8EncryptionKey.setCurrentUserPassword("hello");
String encPpts[] = { String encPpts[] = {
"Password_Protected-56-hello.ppt", "Password_Protected-56-hello.ppt",
"Password_Protected-hello.ppt", "Password_Protected-hello.ppt",
"Password_Protected-np-hello.ppt", "Password_Protected-np-hello.ppt",
}; };
for (String pptFile : encPpts) { Biff8EncryptionKey.setCurrentUserPassword("hello");
try { try {
NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true); for (String pptFile : encPpts) {
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs); try (NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
new HSLFSlideShow(hss).close(); HSLFSlideShow ppt = new HSLFSlideShow(fs)) {
fs.close(); assertTrue(ppt.getSlides().size() > 0);
} catch (EncryptedPowerPointFileException e) { } catch (EncryptedPowerPointFileException e) {
fail(pptFile+" can't be decrypted"); fail(pptFile + " can't be decrypted");
}
} }
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
} }
// password is reset in @After
} }
@Test @Test
public void cryptoAPIChangeKeySize() throws Exception { public void cryptoAPIChangeKeySize() throws Exception {
String pptFile = "cryptoapi-proc2356.ppt"; String pptFile = "cryptoapi-proc2356.ppt";
Biff8EncryptionKey.setCurrentUserPassword("crypto"); Biff8EncryptionKey.setCurrentUserPassword("crypto");
NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true); try (NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs); HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs)) {
// need to cache data (i.e. read all data) before changing the key size // need to cache data (i.e. read all data) before changing the key size
List<HSLFPictureData> picsExpected = hss.getPictureData(); List<HSLFPictureData> picsExpected = hss.getPictureData();
hss.getDocumentSummaryInformation(); hss.getDocumentSummaryInformation();
DocumentEncryptionAtom documentEncryptionAtom = hss.getDocumentEncryptionAtom(); DocumentEncryptionAtom documentEncryptionAtom = hss.getDocumentEncryptionAtom();
assertNotNull(documentEncryptionAtom); assertNotNull(documentEncryptionAtom);
EncryptionInfo ei = documentEncryptionAtom.getEncryptionInfo(); EncryptionInfo ei = documentEncryptionAtom.getEncryptionInfo();
((CryptoAPIEncryptionHeader) ei.getHeader()).setKeySize(0x78); ((CryptoAPIEncryptionHeader) ei.getHeader()).setKeySize(0x78);
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
hss.write(bos); hss.write(bos);
hss.close();
fs.close();
fs = new NPOIFSFileSystem(new ByteArrayInputStream(bos.toByteArray())); try (NPOIFSFileSystem fs2 = new NPOIFSFileSystem(new ByteArrayInputStream(bos.toByteArray()));
hss = new HSLFSlideShowImpl(fs); HSLFSlideShowImpl hss2 = new HSLFSlideShowImpl(fs2)) {
List<HSLFPictureData> picsActual = hss.getPictureData(); List<HSLFPictureData> picsActual = hss2.getPictureData();
assertEquals(picsExpected.size(), picsActual.size()); assertEquals(picsExpected.size(), picsActual.size());
for (int i = 0; i < picsExpected.size(); i++) { for (int i = 0; i < picsExpected.size(); i++) {
assertArrayEquals(picsExpected.get(i).getRawData(), picsActual.get(i).getRawData()); assertArrayEquals(picsExpected.get(i).getRawData(), picsActual.get(i).getRawData());
}
}
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
} }
hss.close();
fs.close();
// password is reset in @After
} }
@Test @Test
public void cryptoAPIEncryption() throws Exception { public void cryptoAPIEncryption() throws Exception {
/* documents with multiple edits need to be normalized for encryption */ /* documents with multiple edits need to be normalized for encryption */
String pptFile = "57272_corrupted_usereditatom.ppt"; String pptFile = "57272_corrupted_usereditatom.ppt";
NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs);
hss.normalizeRecords();
// normalized ppt
ByteArrayOutputStream expected = new ByteArrayOutputStream();
hss.write(expected);
// encrypted
Biff8EncryptionKey.setCurrentUserPassword("hello");
ByteArrayOutputStream encrypted = new ByteArrayOutputStream(); ByteArrayOutputStream encrypted = new ByteArrayOutputStream();
hss.write(encrypted); ByteArrayOutputStream expected = new ByteArrayOutputStream();
hss.close();
fs.close();
// decrypted
ByteArrayInputStream bis = new ByteArrayInputStream(encrypted.toByteArray());
fs = new NPOIFSFileSystem(bis);
hss = new HSLFSlideShowImpl(fs);
Biff8EncryptionKey.setCurrentUserPassword(null);
ByteArrayOutputStream actual = new ByteArrayOutputStream(); ByteArrayOutputStream actual = new ByteArrayOutputStream();
hss.write(actual); try {
hss.close(); try (NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
fs.close(); HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs)) {
hss.normalizeRecords();
// normalized ppt
hss.write(expected);
// encrypted
Biff8EncryptionKey.setCurrentUserPassword("hello");
hss.write(encrypted);
}
// decrypted
ByteArrayInputStream bis = new ByteArrayInputStream(encrypted.toByteArray());
try (NPOIFSFileSystem fs = new NPOIFSFileSystem(bis);
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs)) {
Biff8EncryptionKey.setCurrentUserPassword(null);
hss.write(actual);
}
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
assertArrayEquals(expected.toByteArray(), actual.toByteArray()); assertArrayEquals(expected.toByteArray(), actual.toByteArray());
} }
@ -156,49 +152,49 @@ public class TestDocumentEncryption {
// taken from a msdn blog: // taken from a msdn blog:
// http://blogs.msdn.com/b/openspecification/archive/2009/05/08/dominic-salemno.aspx // http://blogs.msdn.com/b/openspecification/archive/2009/05/08/dominic-salemno.aspx
Biff8EncryptionKey.setCurrentUserPassword("crypto"); Biff8EncryptionKey.setCurrentUserPassword("crypto");
NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile("cryptoapi-proc2356.ppt")); try (NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile("cryptoapi-proc2356.ppt"));
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs); HSLFSlideShow ss = new HSLFSlideShow(fs)) {
HSLFSlideShow ss = new HSLFSlideShow(hss);
HSLFSlide slide = ss.getSlides().get(0); HSLFSlide slide = ss.getSlides().get(0);
String rawText = HSLFTextParagraph.getRawText(slide.getTextParagraphs().get(0)); String rawText = HSLFTextParagraph.getRawText(slide.getTextParagraphs().get(0));
assertEquals("Dominic Salemno", rawText); assertEquals("Dominic Salemno", rawText);
String picCmp[][] = { String picCmp[][] = {
{"0", "nKsDTKqxTCR8LFkVVWlP9GSTvZ0="}, {"0", "nKsDTKqxTCR8LFkVVWlP9GSTvZ0="},
{"95163", "SuNOR+9V1UVYZIoeD65l3VTaLoc="}, {"95163", "SuNOR+9V1UVYZIoeD65l3VTaLoc="},
{"100864", "Ql3IGrr4bNq07ZTp5iPg7b+pva8="}, {"100864", "Ql3IGrr4bNq07ZTp5iPg7b+pva8="},
{"714114", "8pdst9NjBGSfWezSZE8+aVhIRe0="}, {"714114", "8pdst9NjBGSfWezSZE8+aVhIRe0="},
{"723752", "go6xqW7lvkCtlOO5tYLiMfb4oxw="}, {"723752", "go6xqW7lvkCtlOO5tYLiMfb4oxw="},
{"770128", "gZUM8YqRNL5kGNfyyYvEEernvCc="}, {"770128", "gZUM8YqRNL5kGNfyyYvEEernvCc="},
{"957958", "CNU2iiqUFAnk3TDXsXV1ihH9eRM="}, {"957958", "CNU2iiqUFAnk3TDXsXV1ihH9eRM="},
}; };
MessageDigest md = CryptoFunctions.getMessageDigest(HashAlgorithm.sha1); MessageDigest md = CryptoFunctions.getMessageDigest(HashAlgorithm.sha1);
List<HSLFPictureData> pd = hss.getPictureData(); List<HSLFPictureData> pd = ss.getSlideShowImpl().getPictureData();
int i = 0; int i = 0;
for (HSLFPictureData p : pd) { for (HSLFPictureData p : pd) {
byte hash[] = md.digest(p.getData()); byte hash[] = md.digest(p.getData());
assertEquals(Integer.parseInt(picCmp[i][0]), p.getOffset()); assertEquals(Integer.parseInt(picCmp[i][0]), p.getOffset());
assertEquals(picCmp[i][1], Base64.encodeBase64String(hash)); assertEquals(picCmp[i][1], Base64.encodeBase64String(hash));
i++; i++;
}
DocumentEncryptionAtom dea = ss.getSlideShowImpl().getDocumentEncryptionAtom();
assertNotNull(dea);
CryptoAPIDecryptor dec = (CryptoAPIDecryptor) dea.getEncryptionInfo().getDecryptor();
try (POIFSFileSystem fs2 = dec.getSummaryEntries(fs.getRoot(), "EncryptedSummary")) {
PropertySet ps = PropertySetFactory.create(fs2.getRoot(), SummaryInformation.DEFAULT_STREAM_NAME);
assertNotNull(ps);
assertTrue(ps.isSummaryInformation());
assertEquals("RC4 CryptoAPI Encryption", ps.getProperties()[1].getValue());
ps = PropertySetFactory.create(fs2.getRoot(), DocumentSummaryInformation.DEFAULT_STREAM_NAME);
assertNotNull(ps);
assertTrue(ps.isDocumentSummaryInformation());
assertEquals("On-screen Show (4:3)", ps.getProperties()[1].getValue());
}
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
} }
DocumentEncryptionAtom dea = hss.getDocumentEncryptionAtom();
assertNotNull(dea);
POIFSFileSystem fs2 = ((CryptoAPIDecryptor) dea.getEncryptionInfo().getDecryptor()).getSummaryEntries(fs.getRoot(), "EncryptedSummary");
PropertySet ps = PropertySetFactory.create(fs2.getRoot(), SummaryInformation.DEFAULT_STREAM_NAME);
assertNotNull(ps);
assertTrue(ps.isSummaryInformation());
assertEquals("RC4 CryptoAPI Encryption", ps.getProperties()[1].getValue());
ps = PropertySetFactory.create(fs2.getRoot(), DocumentSummaryInformation.DEFAULT_STREAM_NAME);
assertNotNull(ps);
assertTrue(ps.isDocumentSummaryInformation());
assertEquals("On-screen Show (4:3)", ps.getProperties()[1].getValue());
ss.close();
fs.close();
fs2.close();
// password is reset in @After
} }
} }

View File

@ -25,7 +25,9 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.HPSFPropertiesOnlyDocument; import org.apache.poi.hpsf.HPSFPropertiesOnlyDocument;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
@ -89,10 +91,10 @@ public final class TestPOIDocumentMain {
// Should now hold them // Should now hold them
assertNotNull( assertNotNull(
outFS.createDocumentInputStream("\005SummaryInformation") outFS.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)
); );
assertNotNull( assertNotNull(
outFS.createDocumentInputStream("\005DocumentSummaryInformation") outFS.createDocumentInputStream(DocumentSummaryInformation.DEFAULT_STREAM_NAME)
); );
} }

View File

@ -53,8 +53,8 @@ public final class TestBasic {
private static final POIDataSamples samples = POIDataSamples.getHPSFInstance(); private static final POIDataSamples samples = POIDataSamples.getHPSFInstance();
private static final String[] POI_FILES = { private static final String[] POI_FILES = {
"\005SummaryInformation", SummaryInformation.DEFAULT_STREAM_NAME,
"\005DocumentSummaryInformation", DocumentSummaryInformation.DEFAULT_STREAM_NAME,
"WordDocument", "WordDocument",
"\001CompObj", "\001CompObj",
"1Table" "1Table"

View File

@ -56,7 +56,7 @@ public final class TestEmptyProperties {
private static final String[] POI_FILES = { private static final String[] POI_FILES = {
"PerfectOffice_MAIN", "PerfectOffice_MAIN",
"\005SummaryInformation", SummaryInformation.DEFAULT_STREAM_NAME,
"Main" "Main"
}; };

View File

@ -43,7 +43,7 @@ public class TestUnicode {
static final String POI_FS = "TestUnicode.xls"; static final String POI_FS = "TestUnicode.xls";
static final String[] POI_FILES = { static final String[] POI_FILES = {
"\005DocumentSummaryInformation", DocumentSummaryInformation.DEFAULT_STREAM_NAME,
}; };
File data; File data;
POIFile[] poiFiles; POIFile[] poiFiles;

View File

@ -90,9 +90,6 @@ public abstract class BaseXLSIteratingTest {
@Test @Test
public void testMain() throws Exception { public void testMain() throws Exception {
// we had intermittent problems when this was set differently somehow, let's try to set it here so it always is set correctly for these tests
Biff8EncryptionKey.setCurrentUserPassword(null);
String fileName = file.getName(); String fileName = file.getName();
if (EXCLUDED.containsKey(fileName)) { if (EXCLUDED.containsKey(fileName)) {
thrown.expect(EXCLUDED.get(fileName)); thrown.expect(EXCLUDED.get(fileName));

View File

@ -46,12 +46,6 @@ public final class TestHSSFEventFactory extends TestCase {
return HSSFTestDataSamples.openSampleFileStream(sampleFileName); return HSSFTestDataSamples.openSampleFileStream(sampleFileName);
} }
// to not affect other tests running in the same JVM
@After
public void resetPassword() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
public void testWithMissingRecords() throws Exception { public void testWithMissingRecords() throws Exception {
HSSFRequest req = new HSSFRequest(); HSSFRequest req = new HSSFRequest();
@ -156,7 +150,6 @@ public final class TestHSSFEventFactory extends TestCase {
req.addListenerForAllRecords(mockListen); req.addListenerForAllRecords(mockListen);
// Without a password, can't be read // Without a password, can't be read
Biff8EncryptionKey.setCurrentUserPassword(null);
POIFSFileSystem fs = new POIFSFileSystem(openSample("xor-encryption-abc.xls")); POIFSFileSystem fs = new POIFSFileSystem(openSample("xor-encryption-abc.xls"));
HSSFEventFactory factory = new HSSFEventFactory(); HSSFEventFactory factory = new HSSFEventFactory();
@ -168,44 +161,47 @@ public final class TestHSSFEventFactory extends TestCase {
// With the password, is properly processed // With the password, is properly processed
Biff8EncryptionKey.setCurrentUserPassword("abc"); Biff8EncryptionKey.setCurrentUserPassword("abc");
try {
req = new HSSFRequest();
mockListen = new MockHSSFListener();
req.addListenerForAllRecords(mockListen);
factory.processWorkbookEvents(req, fs);
req = new HSSFRequest(); // Check we got the sheet and the contents
mockListen = new MockHSSFListener(); Record[] recs = mockListen.getRecords();
req.addListenerForAllRecords(mockListen); assertTrue(recs.length > 50);
factory.processWorkbookEvents(req, fs);
// Check we got the sheet and the contents // Has one sheet, with values 1,2,3 in column A rows 1-3
Record[] recs = mockListen.getRecords(); boolean hasSheet = false, hasA1 = false, hasA2 = false, hasA3 = false;
assertTrue( recs.length > 50 ); for (Record r : recs) {
if (r instanceof BoundSheetRecord) {
// Has one sheet, with values 1,2,3 in column A rows 1-3 BoundSheetRecord bsr = (BoundSheetRecord) r;
boolean hasSheet=false, hasA1=false, hasA2=false, hasA3=false; assertEquals("Sheet1", bsr.getSheetname());
for (Record r : recs) { hasSheet = true;
if (r instanceof BoundSheetRecord) {
BoundSheetRecord bsr = (BoundSheetRecord)r;
assertEquals("Sheet1", bsr.getSheetname());
hasSheet = true;
}
if (r instanceof NumberRecord) {
NumberRecord nr = (NumberRecord)r;
if (nr.getColumn() == 0 && nr.getRow() == 0) {
assertEquals(1, (int)nr.getValue());
hasA1 = true;
} }
if (nr.getColumn() == 0 && nr.getRow() == 1) { if (r instanceof NumberRecord) {
assertEquals(2, (int)nr.getValue()); NumberRecord nr = (NumberRecord) r;
hasA2 = true; if (nr.getColumn() == 0 && nr.getRow() == 0) {
} assertEquals(1, (int) nr.getValue());
if (nr.getColumn() == 0 && nr.getRow() == 2) { hasA1 = true;
assertEquals(3, (int)nr.getValue()); }
hasA3 = true; if (nr.getColumn() == 0 && nr.getRow() == 1) {
assertEquals(2, (int) nr.getValue());
hasA2 = true;
}
if (nr.getColumn() == 0 && nr.getRow() == 2) {
assertEquals(3, (int) nr.getValue());
hasA3 = true;
}
} }
} }
assertTrue("Sheet record not found", hasSheet);
assertTrue("Numeric record for A1 not found", hasA1);
assertTrue("Numeric record for A2 not found", hasA2);
assertTrue("Numeric record for A3 not found", hasA3);
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
} }
assertTrue("Sheet record not found", hasSheet);
assertTrue("Numeric record for A1 not found", hasA1);
assertTrue("Numeric record for A2 not found", hasA2);
assertTrue("Numeric record for A3 not found", hasA3);
} }
} }

View File

@ -41,12 +41,6 @@ import org.junit.Test;
* *
*/ */
public final class TestExcelExtractor { public final class TestExcelExtractor {
// to not affect other tests running in the same JVM
@After
public void resetPassword() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
private static ExcelExtractor createExtractor(String sampleFileName) throws IOException { private static ExcelExtractor createExtractor(String sampleFileName) throws IOException {
File file = HSSFTestDataSamples.getSampleFile(sampleFileName); File file = HSSFTestDataSamples.getSampleFile(sampleFileName);
POIFSFileSystem fs = new POIFSFileSystem(file); POIFSFileSystem fs = new POIFSFileSystem(file);
@ -355,9 +349,10 @@ public final class TestExcelExtractor {
Biff8EncryptionKey.setCurrentUserPassword("password"); Biff8EncryptionKey.setCurrentUserPassword("password");
try (ExcelExtractor extractor = createExtractor("password.xls")) { try (ExcelExtractor extractor = createExtractor("password.xls")) {
String text = extractor.getText(); String text = extractor.getText();
assertContains(text, "ZIP");
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null); Biff8EncryptionKey.setCurrentUserPassword(null);
assertContains(text, "ZIP");
} }
} }

View File

@ -36,12 +36,6 @@ import org.junit.rules.ExpectedException;
* @author Josh Micich * @author Josh Micich
*/ */
public final class TestRecordFactoryInputStream { public final class TestRecordFactoryInputStream {
// to not affect other tests running in the same JVM
@After
public void resetPassword() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
/** /**
* Hex dump of a BOF record and most of a FILEPASS record. * Hex dump of a BOF record and most of a FILEPASS record.
* A 16 byte saltHash should be added to complete the second record * A 16 byte saltHash should be added to complete the second record
@ -82,7 +76,6 @@ public final class TestRecordFactoryInputStream {
+ SAMPLE_WINDOW1_ENCR1 + SAMPLE_WINDOW1_ENCR1
); );
Biff8EncryptionKey.setCurrentUserPassword(null);
expectedEx.expect(EncryptedDocumentException.class); expectedEx.expect(EncryptedDocumentException.class);
expectedEx.expectMessage("Default password is invalid for salt/verifier/verifierHash"); expectedEx.expectMessage("Default password is invalid for salt/verifier/verifierHash");
createRFIS(dataWrongDefault); createRFIS(dataWrongDefault);
@ -100,7 +93,6 @@ public final class TestRecordFactoryInputStream {
+ SAMPLE_WINDOW1_ENCR1 + SAMPLE_WINDOW1_ENCR1
); );
Biff8EncryptionKey.setCurrentUserPassword(null);
RecordFactoryInputStream rfis = createRFIS(dataCorrectDefault); RecordFactoryInputStream rfis = createRFIS(dataCorrectDefault);
confirmReadInitialRecords(rfis); confirmReadInitialRecords(rfis);
} }
@ -121,12 +113,15 @@ public final class TestRecordFactoryInputStream {
+ SAMPLE_WINDOW1_ENCR2 + SAMPLE_WINDOW1_ENCR2
); );
expectedEx.expect(EncryptedDocumentException.class);
expectedEx.expectMessage("Supplied password is invalid for salt/verifier/verifierHash");
Biff8EncryptionKey.setCurrentUserPassword("passw0rd"); Biff8EncryptionKey.setCurrentUserPassword("passw0rd");
try {
expectedEx.expect(EncryptedDocumentException.class); createRFIS(dataWrongDefault);
expectedEx.expectMessage("Supplied password is invalid for salt/verifier/verifierHash"); } finally {
createRFIS(dataWrongDefault); Biff8EncryptionKey.setCurrentUserPassword(null);
}
} }
@Test @Test
@ -135,18 +130,19 @@ public final class TestRecordFactoryInputStream {
final String SAMPLE_WINDOW1_ENCR2 = "3D 00 12 00" final String SAMPLE_WINDOW1_ENCR2 = "3D 00 12 00"
+ "45, B9, 90, FE, B6, C6, EC, 73, EE, 3F, 52, 45, 97, DB, E3, C1, D6, FE"; + "45, B9, 90, FE, B6, C6, EC, 73, EE, 3F, 52, 45, 97, DB, E3, C1, D6, FE";
Biff8EncryptionKey.setCurrentUserPassword("passw0rd");
byte[] dataCorrectDefault = HexRead.readFromString("" byte[] dataCorrectDefault = HexRead.readFromString(""
+ COMMON_HEX_DATA + COMMON_HEX_DATA
+ "C728659A C38E35E0 568A338F C3FC9D70" // correct saltHash for supplied password (and docId/saltHash) + "C728659A C38E35E0 568A338F C3FC9D70" // correct saltHash for supplied password (and docId/saltHash)
+ SAMPLE_WINDOW1_ENCR2 + SAMPLE_WINDOW1_ENCR2
); );
RecordFactoryInputStream rfis = createRFIS(dataCorrectDefault); Biff8EncryptionKey.setCurrentUserPassword("passw0rd");
Biff8EncryptionKey.setCurrentUserPassword(null); try {
RecordFactoryInputStream rfis = createRFIS(dataCorrectDefault);
confirmReadInitialRecords(rfis); confirmReadInitialRecords(rfis);
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
} }

View File

@ -102,12 +102,6 @@ import org.junit.Test;
* define the test in the base class {@link BaseTestBugzillaIssues}</b> * define the test in the base class {@link BaseTestBugzillaIssues}</b>
*/ */
public final class TestBugs extends BaseTestBugzillaIssues { public final class TestBugs extends BaseTestBugzillaIssues {
// to not affect other tests running in the same JVM
@After
public void resetPassword() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
public TestBugs() { public TestBugs() {
super(HSSFITestDataProvider.instance); super(HSSFITestDataProvider.instance);
} }
@ -2207,8 +2201,6 @@ public final class TestBugs extends BaseTestBugzillaIssues {
*/ */
@Test @Test
public void bug50833() throws Exception { public void bug50833() throws Exception {
Biff8EncryptionKey.setCurrentUserPassword(null);
HSSFWorkbook wb1 = openSample("50833.xls"); HSSFWorkbook wb1 = openSample("50833.xls");
HSSFSheet s = wb1.getSheetAt(0); HSSFSheet s = wb1.getSheetAt(0);
assertEquals("Sheet1", s.getSheetName()); assertEquals("Sheet1", s.getSheetName());
@ -2602,8 +2594,8 @@ public final class TestBugs extends BaseTestBugzillaIssues {
@Test(expected = EncryptedDocumentException.class) @Test(expected = EncryptedDocumentException.class)
public void bug35897() throws Exception { public void bug35897() throws Exception {
// password is abc // password is abc
Biff8EncryptionKey.setCurrentUserPassword("abc");
try { try {
Biff8EncryptionKey.setCurrentUserPassword("abc");
openSample("xor-encryption-abc.xls").close(); openSample("xor-encryption-abc.xls").close();
} finally { } finally {
Biff8EncryptionKey.setCurrentUserPassword(null); Biff8EncryptionKey.setCurrentUserPassword(null);

View File

@ -30,11 +30,6 @@ import org.junit.Test;
public class TestCryptoAPI { public class TestCryptoAPI {
final HSSFITestDataProvider ssTests = HSSFITestDataProvider.instance; final HSSFITestDataProvider ssTests = HSSFITestDataProvider.instance;
@AfterClass
public static void resetPW() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
@Test @Test
public void bug59857() throws IOException { public void bug59857() throws IOException {
// XOR-Obfuscation // XOR-Obfuscation
@ -52,19 +47,17 @@ public class TestCryptoAPI {
private void validateContent(String wbFile, String password, String textExpected) throws IOException { private void validateContent(String wbFile, String password, String textExpected) throws IOException {
Biff8EncryptionKey.setCurrentUserPassword(password); Biff8EncryptionKey.setCurrentUserPassword(password);
HSSFWorkbook wb = ssTests.openSampleWorkbook(wbFile); try (HSSFWorkbook wb = ssTests.openSampleWorkbook(wbFile);
ExcelExtractor ee1 = new ExcelExtractor(wb); ExcelExtractor ee1 = new ExcelExtractor(wb)
String textActual = ee1.getText(); ) {
assertContains(textActual, textExpected); Biff8EncryptionKey.setCurrentUserPassword("bla");
try (HSSFWorkbook wbBla = ssTests.writeOutAndReadBack(wb);
Biff8EncryptionKey.setCurrentUserPassword("bla"); ExcelExtractor ee2 = new ExcelExtractor(wbBla)) {
HSSFWorkbook wbBla = ssTests.writeOutAndReadBack(wb); assertContains(ee1.getText(), textExpected);
ExcelExtractor ee2 = new ExcelExtractor(wbBla); assertContains(ee2.getText(), textExpected);
textActual = ee2.getText(); }
assertContains(textActual, textExpected); } finally {
ee2.close(); Biff8EncryptionKey.setCurrentUserPassword(null);
ee1.close(); }
wbBla.close();
wb.close();
} }
} }

View File

@ -23,8 +23,12 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DirectoryNode;
import org.apache.poi.poifs.filesystem.Entry;
import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
/** /**
@ -49,7 +53,7 @@ public final class TestNonStandardWorkbookStreamNames {
// Ensure that we have a WORKBOOK entry and a summary // Ensure that we have a WORKBOOK entry and a summary
assertTrue(root.hasEntry("WORKBOOK")); assertTrue(root.hasEntry("WORKBOOK"));
assertTrue(root.hasEntry("\005SummaryInformation")); assertTrue(root.hasEntry(SummaryInformation.DEFAULT_STREAM_NAME));
// But not a Workbook one // But not a Workbook one
assertFalse(root.hasEntry("Workbook")); assertFalse(root.hasEntry("Workbook"));
@ -73,7 +77,7 @@ public final class TestNonStandardWorkbookStreamNames {
// But not a Workbook one and not a Summary one // But not a Workbook one and not a Summary one
assertFalse(root.hasEntry("Workbook")); assertFalse(root.hasEntry("Workbook"));
assertFalse(root.hasEntry("\\005SummaryInformation")); assertFalse(root.hasEntry(SummaryInformation.DEFAULT_STREAM_NAME));
wb.close(); wb.close();
} }
@ -127,7 +131,7 @@ public final class TestNonStandardWorkbookStreamNames {
assertFalse(root.hasEntry("WORKBOOK")); assertFalse(root.hasEntry("WORKBOOK"));
// As we preserved, should also have a few other streams // As we preserved, should also have a few other streams
assertTrue(root.hasEntry("\005SummaryInformation")); assertTrue(root.hasEntry(SummaryInformation.DEFAULT_STREAM_NAME));
wb2.close(); wb2.close();
} }
} }

View File

@ -21,6 +21,7 @@ import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples;
@ -36,12 +37,6 @@ public class TestXorEncryption {
private static final HSSFTestDataSamples samples = new HSSFTestDataSamples(); private static final HSSFTestDataSamples samples = new HSSFTestDataSamples();
// to not affect other tests running in the same JVM
@After
public void resetPassword() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
@Test @Test
public void testXorEncryption() throws IOException { public void testXorEncryption() throws IOException {
// Xor-Password: abc // Xor-Password: abc
@ -61,15 +56,16 @@ public class TestXorEncryption {
@SuppressWarnings("static-access") @SuppressWarnings("static-access")
@Test @Test
public void testUserFile() throws IOException { public void testUserFile() throws IOException {
File f = samples.getSampleFile("xor-encryption-abc.xls");
Biff8EncryptionKey.setCurrentUserPassword("abc"); Biff8EncryptionKey.setCurrentUserPassword("abc");
NPOIFSFileSystem fs = new NPOIFSFileSystem(samples.getSampleFile("xor-encryption-abc.xls"), true); try (NPOIFSFileSystem fs = new NPOIFSFileSystem(f, true);
HSSFWorkbook hwb = new HSSFWorkbook(fs.getRoot(), true); HSSFWorkbook hwb = new HSSFWorkbook(fs.getRoot(), true)) {
HSSFSheet sh = hwb.getSheetAt(0);
HSSFSheet sh = hwb.getSheetAt(0); assertEquals(1.0, sh.getRow(0).getCell(0).getNumericCellValue(), 0.0);
assertEquals(1.0, sh.getRow(0).getCell(0).getNumericCellValue(), 0.0); assertEquals(2.0, sh.getRow(1).getCell(0).getNumericCellValue(), 0.0);
assertEquals(2.0, sh.getRow(1).getCell(0).getNumericCellValue(), 0.0); assertEquals(3.0, sh.getRow(2).getCell(0).getNumericCellValue(), 0.0);
assertEquals(3.0, sh.getRow(2).getCell(0).getNumericCellValue(), 0.0); } finally {
hwb.close(); Biff8EncryptionKey.setCurrentUserPassword(null);
fs.close(); }
} }
} }

View File

@ -20,6 +20,8 @@ package org.apache.poi.poifs.property;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.poifs.storage.RawDataUtil; import org.apache.poi.poifs.storage.RawDataUtil;
import org.apache.poi.util.LocaleUtil; import org.apache.poi.util.LocaleUtil;
@ -68,8 +70,8 @@ public final class TestDocumentProperty extends TestCase {
byte[] input = RawDataUtil.decode(hexData); byte[] input = RawDataUtil.decode(hexData);
verifyReadingProperty(1, input, 128, "Workbook"); verifyReadingProperty(1, input, 128, "Workbook");
verifyReadingProperty(2, input, 256, "\005SummaryInformation"); verifyReadingProperty(2, input, 256, SummaryInformation.DEFAULT_STREAM_NAME);
verifyReadingProperty(3, input, 384, "\005DocumentSummaryInformation"); verifyReadingProperty(3, input, 384, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
} }
private void verifyReadingProperty(int index, byte[] input, int offset, String name) private void verifyReadingProperty(int index, byte[] input, int offset, String name)

View File

@ -25,6 +25,8 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.storage.BlockAllocationTableReader; import org.apache.poi.poifs.storage.BlockAllocationTableReader;
import org.apache.poi.poifs.storage.HeaderBlock; import org.apache.poi.poifs.storage.HeaderBlock;
@ -79,11 +81,10 @@ public final class TestPropertyTable {
DocumentProperty workbook = new DocumentProperty("Workbook", 0x00046777); DocumentProperty workbook = new DocumentProperty("Workbook", 0x00046777);
workbook.setStartBlock(0); workbook.setStartBlock(0);
DocumentProperty summary1 = new DocumentProperty("\005SummaryInformation", 0x00001000); DocumentProperty summary1 = new DocumentProperty(SummaryInformation.DEFAULT_STREAM_NAME, 0x00001000);
summary1.setStartBlock(0x00000234); summary1.setStartBlock(0x00000234);
DocumentProperty summary2 = new DocumentProperty("\005DocumentSummaryInformation", DocumentProperty summary2 = new DocumentProperty(DocumentSummaryInformation.DEFAULT_STREAM_NAME, 0x00001000);
0x00001000);
summary2.setStartBlock(0x0000023C); summary2.setStartBlock(0x0000023C);
table.addProperty(workbook); table.addProperty(workbook);