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 e73282a9e8
commit 28e662c5a7
18 changed files with 265 additions and 295 deletions

View File

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

View File

@ -52,11 +52,6 @@ import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class TestHxxFEncryption {
@AfterClass
public static void clearPass() {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
@Parameter(value = 0)
public POIDataSamples sampleDir;
@ -99,12 +94,14 @@ public class TestHxxFEncryption {
@Test
public void extract() throws IOException, OpenXML4JException, XmlException {
Biff8EncryptionKey.setCurrentUserPassword(password);
File f = sampleDir.getFile(file);
POITextExtractor te = ExtractorFactory.createExtractor(f);
String actual = te.getText().trim();
assertEquals(expected, actual);
te.close();
Biff8EncryptionKey.setCurrentUserPassword(password);
try (POITextExtractor te = ExtractorFactory.createExtractor(f)) {
String actual = te.getText().trim();
assertEquals(expected, actual);
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
}
@Test
@ -118,70 +115,72 @@ public class TestHxxFEncryption {
}
public void newPassword(String newPass) throws IOException, OpenXML4JException, XmlException {
Biff8EncryptionKey.setCurrentUserPassword(password);
File f = sampleDir.getFile(file);
POITextExtractor te1 = ExtractorFactory.createExtractor(f);
Biff8EncryptionKey.setCurrentUserPassword(newPass);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
POIDocument doc = (POIDocument)te1.getDocument();
doc.write(bos);
doc.close();
te1.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
POITextExtractor te2 = ExtractorFactory.createExtractor(bis);
String actual = te2.getText().trim();
assertEquals(expected, actual);
te2.close();
Biff8EncryptionKey.setCurrentUserPassword(password);
try (POITextExtractor te1 = ExtractorFactory.createExtractor(f)) {
Biff8EncryptionKey.setCurrentUserPassword(newPass);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try (POIDocument doc = (POIDocument) te1.getDocument()) {
doc.write(bos);
}
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
try (POITextExtractor te2 = ExtractorFactory.createExtractor(bis)) {
String actual = te2.getText().trim();
assertEquals(expected, actual);
}
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
}
/** changing the encryption mode and key size in poor mans style - see comments below */
@Test
public void changeEncryption() throws IOException, OpenXML4JException, XmlException {
File f = sampleDir.getFile(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Biff8EncryptionKey.setCurrentUserPassword(password);
File f = sampleDir.getFile(file);
POITextExtractor te1 = ExtractorFactory.createExtractor(f);
// first remove encryption
Biff8EncryptionKey.setCurrentUserPassword(null);
POIDocument doc = (POIDocument)te1.getDocument();
doc.write(bos);
doc.close();
te1.close();
// then use default setting, which is cryptoapi
String newPass = "newPass";
POITextExtractor te2 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray()));
Biff8EncryptionKey.setCurrentUserPassword(newPass);
doc = (POIDocument)te2.getDocument();
bos.reset();
doc.write(bos);
doc.close();
te2.close();
// and finally update cryptoapi setting
POITextExtractor te3 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray()));
doc = (POIDocument)te3.getDocument();
// need to cache data (i.e. read all data) before changing the key size
if (doc instanceof HSLFSlideShowImpl) {
HSLFSlideShowImpl hss = (HSLFSlideShowImpl)doc;
hss.getPictureData();
hss.getDocumentSummaryInformation();
try (POITextExtractor te1 = ExtractorFactory.createExtractor(f)) {
// first remove encryption
Biff8EncryptionKey.setCurrentUserPassword(null);
try (POIDocument doc = (POIDocument) te1.getDocument()) {
doc.write(bos);
}
// then use default setting, which is cryptoapi
String newPass = "newPass";
try (POITextExtractor te2 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray()))) {
Biff8EncryptionKey.setCurrentUserPassword(newPass);
try (POIDocument doc = (POIDocument) te2.getDocument()) {
bos.reset();
doc.write(bos);
}
}
// and finally update cryptoapi setting
try (POITextExtractor te3 = ExtractorFactory.createExtractor(new ByteArrayInputStream(bos.toByteArray()));
POIDocument doc = (POIDocument) te3.getDocument()) {
// need to cache data (i.e. read all data) before changing the key size
if (doc instanceof HSLFSlideShowImpl) {
HSLFSlideShowImpl hss = (HSLFSlideShowImpl) doc;
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.IOException;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.HPSFPropertiesOnlyDocument;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
import org.apache.poi.hwpf.HWPFTestDataSamples;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
@ -91,8 +93,8 @@ public final class TestPOIDocumentScratchpad {
doc.writeProperties(outFS);
// Should now hold them
assertNotNull(outFS.createDocumentInputStream("\005SummaryInformation"));
assertNotNull(outFS.createDocumentInputStream("\005DocumentSummaryInformation"));
assertNotNull(outFS.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME));
assertNotNull(outFS.createDocumentInputStream(DocumentSummaryInformation.DEFAULT_STREAM_NAME));
outFS.close();
}

View File

@ -59,94 +59,90 @@ import org.junit.Test;
public class TestDocumentEncryption {
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
public void cryptoAPIDecryptionOther() throws Exception {
Biff8EncryptionKey.setCurrentUserPassword("hello");
String encPpts[] = {
"Password_Protected-56-hello.ppt",
"Password_Protected-hello.ppt",
"Password_Protected-np-hello.ppt",
};
for (String pptFile : encPpts) {
try {
NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs);
new HSLFSlideShow(hss).close();
fs.close();
} catch (EncryptedPowerPointFileException e) {
fail(pptFile+" can't be decrypted");
Biff8EncryptionKey.setCurrentUserPassword("hello");
try {
for (String pptFile : encPpts) {
try (NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
HSLFSlideShow ppt = new HSLFSlideShow(fs)) {
assertTrue(ppt.getSlides().size() > 0);
} catch (EncryptedPowerPointFileException e) {
fail(pptFile + " can't be decrypted");
}
}
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
// password is reset in @After
}
@Test
public void cryptoAPIChangeKeySize() throws Exception {
String pptFile = "cryptoapi-proc2356.ppt";
Biff8EncryptionKey.setCurrentUserPassword("crypto");
NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs);
// need to cache data (i.e. read all data) before changing the key size
List<HSLFPictureData> picsExpected = hss.getPictureData();
hss.getDocumentSummaryInformation();
DocumentEncryptionAtom documentEncryptionAtom = hss.getDocumentEncryptionAtom();
assertNotNull(documentEncryptionAtom);
EncryptionInfo ei = documentEncryptionAtom.getEncryptionInfo();
((CryptoAPIEncryptionHeader) ei.getHeader()).setKeySize(0x78);
try (NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs)) {
// need to cache data (i.e. read all data) before changing the key size
List<HSLFPictureData> picsExpected = hss.getPictureData();
hss.getDocumentSummaryInformation();
DocumentEncryptionAtom documentEncryptionAtom = hss.getDocumentEncryptionAtom();
assertNotNull(documentEncryptionAtom);
EncryptionInfo ei = documentEncryptionAtom.getEncryptionInfo();
((CryptoAPIEncryptionHeader) ei.getHeader()).setKeySize(0x78);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
hss.write(bos);
hss.close();
fs.close();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
hss.write(bos);
fs = new NPOIFSFileSystem(new ByteArrayInputStream(bos.toByteArray()));
hss = new HSLFSlideShowImpl(fs);
List<HSLFPictureData> picsActual = hss.getPictureData();
try (NPOIFSFileSystem fs2 = new NPOIFSFileSystem(new ByteArrayInputStream(bos.toByteArray()));
HSLFSlideShowImpl hss2 = new HSLFSlideShowImpl(fs2)) {
List<HSLFPictureData> picsActual = hss2.getPictureData();
assertEquals(picsExpected.size(), picsActual.size());
for (int i = 0; i < picsExpected.size(); i++) {
assertArrayEquals(picsExpected.get(i).getRawData(), picsActual.get(i).getRawData());
assertEquals(picsExpected.size(), picsActual.size());
for (int i = 0; i < picsExpected.size(); i++) {
assertArrayEquals(picsExpected.get(i).getRawData(), picsActual.get(i).getRawData());
}
}
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
hss.close();
fs.close();
// password is reset in @After
}
@Test
public void cryptoAPIEncryption() throws Exception {
/* documents with multiple edits need to be normalized for encryption */
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();
hss.write(encrypted);
hss.close();
fs.close();
// decrypted
ByteArrayInputStream bis = new ByteArrayInputStream(encrypted.toByteArray());
fs = new NPOIFSFileSystem(bis);
hss = new HSLFSlideShowImpl(fs);
Biff8EncryptionKey.setCurrentUserPassword(null);
ByteArrayOutputStream expected = new ByteArrayOutputStream();
ByteArrayOutputStream actual = new ByteArrayOutputStream();
hss.write(actual);
hss.close();
fs.close();
try {
try (NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);
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());
}
@ -156,49 +152,49 @@ public class TestDocumentEncryption {
// taken from a msdn blog:
// http://blogs.msdn.com/b/openspecification/archive/2009/05/08/dominic-salemno.aspx
Biff8EncryptionKey.setCurrentUserPassword("crypto");
NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile("cryptoapi-proc2356.ppt"));
HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs);
HSLFSlideShow ss = new HSLFSlideShow(hss);
try (NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile("cryptoapi-proc2356.ppt"));
HSLFSlideShow ss = new HSLFSlideShow(fs)) {
HSLFSlide slide = ss.getSlides().get(0);
String rawText = HSLFTextParagraph.getRawText(slide.getTextParagraphs().get(0));
assertEquals("Dominic Salemno", rawText);
HSLFSlide slide = ss.getSlides().get(0);
String rawText = HSLFTextParagraph.getRawText(slide.getTextParagraphs().get(0));
assertEquals("Dominic Salemno", rawText);
String picCmp[][] = {
{"0", "nKsDTKqxTCR8LFkVVWlP9GSTvZ0="},
{"95163", "SuNOR+9V1UVYZIoeD65l3VTaLoc="},
{"100864", "Ql3IGrr4bNq07ZTp5iPg7b+pva8="},
{"714114", "8pdst9NjBGSfWezSZE8+aVhIRe0="},
{"723752", "go6xqW7lvkCtlOO5tYLiMfb4oxw="},
{"770128", "gZUM8YqRNL5kGNfyyYvEEernvCc="},
{"957958", "CNU2iiqUFAnk3TDXsXV1ihH9eRM="},
};
String picCmp[][] = {
{"0", "nKsDTKqxTCR8LFkVVWlP9GSTvZ0="},
{"95163", "SuNOR+9V1UVYZIoeD65l3VTaLoc="},
{"100864", "Ql3IGrr4bNq07ZTp5iPg7b+pva8="},
{"714114", "8pdst9NjBGSfWezSZE8+aVhIRe0="},
{"723752", "go6xqW7lvkCtlOO5tYLiMfb4oxw="},
{"770128", "gZUM8YqRNL5kGNfyyYvEEernvCc="},
{"957958", "CNU2iiqUFAnk3TDXsXV1ihH9eRM="},
};
MessageDigest md = CryptoFunctions.getMessageDigest(HashAlgorithm.sha1);
List<HSLFPictureData> pd = hss.getPictureData();
int i = 0;
for (HSLFPictureData p : pd) {
byte hash[] = md.digest(p.getData());
assertEquals(Integer.parseInt(picCmp[i][0]), p.getOffset());
assertEquals(picCmp[i][1], Base64.encodeBase64String(hash));
i++;
MessageDigest md = CryptoFunctions.getMessageDigest(HashAlgorithm.sha1);
List<HSLFPictureData> pd = ss.getSlideShowImpl().getPictureData();
int i = 0;
for (HSLFPictureData p : pd) {
byte hash[] = md.digest(p.getData());
assertEquals(Integer.parseInt(picCmp[i][0]), p.getOffset());
assertEquals(picCmp[i][1], Base64.encodeBase64String(hash));
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.IOException;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.HPSFPropertiesOnlyDocument;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
@ -89,10 +91,10 @@ public final class TestPOIDocumentMain {
// Should now hold them
assertNotNull(
outFS.createDocumentInputStream("\005SummaryInformation")
outFS.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)
);
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 String[] POI_FILES = {
"\005SummaryInformation",
"\005DocumentSummaryInformation",
SummaryInformation.DEFAULT_STREAM_NAME,
DocumentSummaryInformation.DEFAULT_STREAM_NAME,
"WordDocument",
"\001CompObj",
"1Table"

View File

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

View File

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

View File

@ -90,9 +90,6 @@ public abstract class BaseXLSIteratingTest {
@Test
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();
if (EXCLUDED.containsKey(fileName)) {
thrown.expect(EXCLUDED.get(fileName));

View File

@ -46,12 +46,6 @@ public final class TestHSSFEventFactory extends TestCase {
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 {
HSSFRequest req = new HSSFRequest();
@ -156,7 +150,6 @@ public final class TestHSSFEventFactory extends TestCase {
req.addListenerForAllRecords(mockListen);
// Without a password, can't be read
Biff8EncryptionKey.setCurrentUserPassword(null);
POIFSFileSystem fs = new POIFSFileSystem(openSample("xor-encryption-abc.xls"));
HSSFEventFactory factory = new HSSFEventFactory();
@ -168,44 +161,47 @@ public final class TestHSSFEventFactory extends TestCase {
// With the password, is properly processed
Biff8EncryptionKey.setCurrentUserPassword("abc");
try {
req = new HSSFRequest();
mockListen = new MockHSSFListener();
req.addListenerForAllRecords(mockListen);
factory.processWorkbookEvents(req, fs);
req = new HSSFRequest();
mockListen = new MockHSSFListener();
req.addListenerForAllRecords(mockListen);
factory.processWorkbookEvents(req, fs);
// Check we got the sheet and the contents
Record[] recs = mockListen.getRecords();
assertTrue(recs.length > 50);
// Check we got the sheet and the contents
Record[] recs = mockListen.getRecords();
assertTrue( recs.length > 50 );
// Has one sheet, with values 1,2,3 in column A rows 1-3
boolean hasSheet=false, hasA1=false, hasA2=false, hasA3=false;
for (Record r : recs) {
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;
// Has one sheet, with values 1,2,3 in column A rows 1-3
boolean hasSheet = false, hasA1 = false, hasA2 = false, hasA3 = false;
for (Record r : recs) {
if (r instanceof BoundSheetRecord) {
BoundSheetRecord bsr = (BoundSheetRecord) r;
assertEquals("Sheet1", bsr.getSheetname());
hasSheet = 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;
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) {
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 {
// 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 {
File file = HSSFTestDataSamples.getSampleFile(sampleFileName);
POIFSFileSystem fs = new POIFSFileSystem(file);
@ -355,9 +349,10 @@ public final class TestExcelExtractor {
Biff8EncryptionKey.setCurrentUserPassword("password");
try (ExcelExtractor extractor = createExtractor("password.xls")) {
String text = extractor.getText();
assertContains(text, "ZIP");
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
assertContains(text, "ZIP");
}
}

View File

@ -36,12 +36,6 @@ import org.junit.rules.ExpectedException;
* @author Josh Micich
*/
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.
* A 16 byte saltHash should be added to complete the second record
@ -82,7 +76,6 @@ public final class TestRecordFactoryInputStream {
+ SAMPLE_WINDOW1_ENCR1
);
Biff8EncryptionKey.setCurrentUserPassword(null);
expectedEx.expect(EncryptedDocumentException.class);
expectedEx.expectMessage("Default password is invalid for salt/verifier/verifierHash");
createRFIS(dataWrongDefault);
@ -100,7 +93,6 @@ public final class TestRecordFactoryInputStream {
+ SAMPLE_WINDOW1_ENCR1
);
Biff8EncryptionKey.setCurrentUserPassword(null);
RecordFactoryInputStream rfis = createRFIS(dataCorrectDefault);
confirmReadInitialRecords(rfis);
}
@ -121,12 +113,15 @@ public final class TestRecordFactoryInputStream {
+ SAMPLE_WINDOW1_ENCR2
);
expectedEx.expect(EncryptedDocumentException.class);
expectedEx.expectMessage("Supplied password is invalid for salt/verifier/verifierHash");
Biff8EncryptionKey.setCurrentUserPassword("passw0rd");
expectedEx.expect(EncryptedDocumentException.class);
expectedEx.expectMessage("Supplied password is invalid for salt/verifier/verifierHash");
createRFIS(dataWrongDefault);
try {
createRFIS(dataWrongDefault);
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
}
@Test
@ -135,18 +130,19 @@ public final class TestRecordFactoryInputStream {
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";
Biff8EncryptionKey.setCurrentUserPassword("passw0rd");
byte[] dataCorrectDefault = HexRead.readFromString(""
+ COMMON_HEX_DATA
+ "C728659A C38E35E0 568A338F C3FC9D70" // correct saltHash for supplied password (and docId/saltHash)
+ SAMPLE_WINDOW1_ENCR2
);
RecordFactoryInputStream rfis = createRFIS(dataCorrectDefault);
Biff8EncryptionKey.setCurrentUserPassword(null);
confirmReadInitialRecords(rfis);
Biff8EncryptionKey.setCurrentUserPassword("passw0rd");
try {
RecordFactoryInputStream rfis = createRFIS(dataCorrectDefault);
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>
*/
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() {
super(HSSFITestDataProvider.instance);
}
@ -2207,8 +2201,6 @@ public final class TestBugs extends BaseTestBugzillaIssues {
*/
@Test
public void bug50833() throws Exception {
Biff8EncryptionKey.setCurrentUserPassword(null);
HSSFWorkbook wb1 = openSample("50833.xls");
HSSFSheet s = wb1.getSheetAt(0);
assertEquals("Sheet1", s.getSheetName());
@ -2602,8 +2594,8 @@ public final class TestBugs extends BaseTestBugzillaIssues {
@Test(expected = EncryptedDocumentException.class)
public void bug35897() throws Exception {
// password is abc
Biff8EncryptionKey.setCurrentUserPassword("abc");
try {
Biff8EncryptionKey.setCurrentUserPassword("abc");
openSample("xor-encryption-abc.xls").close();
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);

View File

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

View File

@ -23,8 +23,12 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.hpsf.SummaryInformation;
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.Entry;
import org.junit.BeforeClass;
import org.junit.Test;
/**
@ -49,7 +53,7 @@ public final class TestNonStandardWorkbookStreamNames {
// Ensure that we have a WORKBOOK entry and a summary
assertTrue(root.hasEntry("WORKBOOK"));
assertTrue(root.hasEntry("\005SummaryInformation"));
assertTrue(root.hasEntry(SummaryInformation.DEFAULT_STREAM_NAME));
// But not a Workbook one
assertFalse(root.hasEntry("Workbook"));
@ -73,7 +77,7 @@ public final class TestNonStandardWorkbookStreamNames {
// But not a Workbook one and not a Summary one
assertFalse(root.hasEntry("Workbook"));
assertFalse(root.hasEntry("\\005SummaryInformation"));
assertFalse(root.hasEntry(SummaryInformation.DEFAULT_STREAM_NAME));
wb.close();
}
@ -127,7 +131,7 @@ public final class TestNonStandardWorkbookStreamNames {
assertFalse(root.hasEntry("WORKBOOK"));
// As we preserved, should also have a few other streams
assertTrue(root.hasEntry("\005SummaryInformation"));
assertTrue(root.hasEntry(SummaryInformation.DEFAULT_STREAM_NAME));
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.assertThat;
import java.io.File;
import java.io.IOException;
import org.apache.poi.hssf.HSSFTestDataSamples;
@ -36,12 +37,6 @@ public class TestXorEncryption {
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
public void testXorEncryption() throws IOException {
// Xor-Password: abc
@ -61,15 +56,16 @@ public class TestXorEncryption {
@SuppressWarnings("static-access")
@Test
public void testUserFile() throws IOException {
File f = samples.getSampleFile("xor-encryption-abc.xls");
Biff8EncryptionKey.setCurrentUserPassword("abc");
NPOIFSFileSystem fs = new NPOIFSFileSystem(samples.getSampleFile("xor-encryption-abc.xls"), true);
HSSFWorkbook hwb = new HSSFWorkbook(fs.getRoot(), true);
HSSFSheet sh = hwb.getSheetAt(0);
assertEquals(1.0, sh.getRow(0).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);
hwb.close();
fs.close();
try (NPOIFSFileSystem fs = new NPOIFSFileSystem(f, true);
HSSFWorkbook hwb = new HSSFWorkbook(fs.getRoot(), true)) {
HSSFSheet sh = hwb.getSheetAt(0);
assertEquals(1.0, sh.getRow(0).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);
} finally {
Biff8EncryptionKey.setCurrentUserPassword(null);
}
}
}

View File

@ -20,6 +20,8 @@ package org.apache.poi.poifs.property;
import java.io.ByteArrayOutputStream;
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.util.LocaleUtil;
@ -68,8 +70,8 @@ public final class TestDocumentProperty extends TestCase {
byte[] input = RawDataUtil.decode(hexData);
verifyReadingProperty(1, input, 128, "Workbook");
verifyReadingProperty(2, input, 256, "\005SummaryInformation");
verifyReadingProperty(3, input, 384, "\005DocumentSummaryInformation");
verifyReadingProperty(2, input, 256, SummaryInformation.DEFAULT_STREAM_NAME);
verifyReadingProperty(3, input, 384, DocumentSummaryInformation.DEFAULT_STREAM_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.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.storage.BlockAllocationTableReader;
import org.apache.poi.poifs.storage.HeaderBlock;
@ -79,11 +81,10 @@ public final class TestPropertyTable {
DocumentProperty workbook = new DocumentProperty("Workbook", 0x00046777);
workbook.setStartBlock(0);
DocumentProperty summary1 = new DocumentProperty("\005SummaryInformation", 0x00001000);
DocumentProperty summary1 = new DocumentProperty(SummaryInformation.DEFAULT_STREAM_NAME, 0x00001000);
summary1.setStartBlock(0x00000234);
DocumentProperty summary2 = new DocumentProperty("\005DocumentSummaryInformation",
0x00001000);
DocumentProperty summary2 = new DocumentProperty(DocumentSummaryInformation.DEFAULT_STREAM_NAME, 0x00001000);
summary2.setStartBlock(0x0000023C);
table.addProperty(workbook);