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:
parent
32b370fb67
commit
83eb0ca821
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -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"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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));
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user