This is an automated email from the ASF dual-hosted git repository.
psxjoy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fesod.git
The following commit(s) were added to refs/heads/main by this push:
new 7fe23f0e refactor: manage password handling in Excel processing (#928)
7fe23f0e is described below
commit 7fe23f0e06c9b253f4b5d174a3220652c510c484
Author: Shuxin Pan <[email protected]>
AuthorDate: Sat Jun 6 09:16:48 2026 +0800
refactor: manage password handling in Excel processing (#928)
---
.../fesod/sheet/analysis/ExcelAnalyserImpl.java | 4 ----
.../fesod/sheet/analysis/v03/XlsSaxAnalyser.java | 24 +++++++++++++++++++++-
.../org/apache/fesod/sheet/util/WorkBookUtil.java | 8 ++++++--
.../fesod/sheet/encrypt/EncryptDataTest.java | 3 +++
.../apache/fesod/sheet/util/WorkBookUtilTest.java | 1 +
5 files changed, 33 insertions(+), 7 deletions(-)
diff --git
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/ExcelAnalyserImpl.java
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/ExcelAnalyserImpl.java
index 282f876b..ba9562d8 100644
---
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/ExcelAnalyserImpl.java
+++
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/ExcelAnalyserImpl.java
@@ -150,10 +150,6 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
poifsFileSystem.close();
}
}
- // Set the user password for processing encrypted Excel files
- if (readWorkbook.getPassword() != null) {
-
Biff8EncryptionKey.setCurrentUserPassword(readWorkbook.getPassword());
- }
XlsReadContext xlsReadContext = new
DefaultXlsReadContext(readWorkbook, ExcelTypeEnum.XLS);
xlsReadContext.xlsReadWorkbookHolder().setPoifsFileSystem(poifsFileSystem);
analysisContext = xlsReadContext;
diff --git
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/XlsSaxAnalyser.java
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/XlsSaxAnalyser.java
index c35b95a3..f2c57160 100644
---
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/XlsSaxAnalyser.java
+++
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/XlsSaxAnalyser.java
@@ -85,6 +85,7 @@ import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.hssf.record.StringRecord;
import org.apache.poi.hssf.record.TextObjectRecord;
+import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
/**
* A text extractor for Excel files.
@@ -150,7 +151,12 @@ public class XlsSaxAnalyser implements HSSFListener,
ExcelReadExecutor {
public List<ReadSheet> sheetList() {
try {
if (xlsReadContext.readWorkbookHolder().getActualSheetDataList()
== null) {
- new XlsListSheetListener(xlsReadContext).execute();
+ try {
+ setCurrentUserPassword();
+ new XlsListSheetListener(xlsReadContext).execute();
+ } finally {
+ clearCurrentUserPassword();
+ }
}
} catch (ExcelAnalysisStopException e) {
if (log.isDebugEnabled()) {
@@ -185,6 +191,7 @@ public class XlsSaxAnalyser implements HSSFListener,
ExcelReadExecutor {
HSSFRequest request = new HSSFRequest();
request.addListenerForAllRecords(xlsReadWorkbookHolder.getFormatTrackingHSSFListener());
try {
+ setCurrentUserPassword();
factory.processWorkbookEvents(request,
xlsReadWorkbookHolder.getPoifsFileSystem());
} catch (OldExcelFormatException e) {
// POI reports very old BIFF (e.g., BIFF2) formats via
OldExcelFormatException. Treat as benign:
@@ -204,12 +211,27 @@ public class XlsSaxAnalyser implements HSSFListener,
ExcelReadExecutor {
throw e;
} catch (IOException e) {
throw new ExcelAnalysisException(e);
+ } finally {
+ clearCurrentUserPassword();
}
// There are some special xls that do not have the terminator "[EOF]",
so an additional
xlsReadContext.analysisEventProcessor().endSheet(xlsReadContext);
}
+ private void setCurrentUserPassword() {
+ String password = xlsReadContext.readWorkbookHolder().getPassword();
+ if (password != null) {
+ Biff8EncryptionKey.setCurrentUserPassword(password);
+ }
+ }
+
+ private void clearCurrentUserPassword() {
+ if (xlsReadContext.readWorkbookHolder().getPassword() != null) {
+ Biff8EncryptionKey.setCurrentUserPassword(null);
+ }
+ }
+
protected boolean isOldExcelFormat(Throwable t) {
for (int i = 0; i < 6 && t != null; i++, t = t.getCause()) {
if (t instanceof OldExcelFormatException) {
diff --git
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/WorkBookUtil.java
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/WorkBookUtil.java
index 7802d103..a8e1d076 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/WorkBookUtil.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/WorkBookUtil.java
@@ -93,8 +93,12 @@ public class WorkBookUtil {
writeWorkbookHolder.setCachedWorkbook(hssfWorkbook);
writeWorkbookHolder.setWorkbook(hssfWorkbook);
if (writeWorkbookHolder.getPassword() != null) {
-
Biff8EncryptionKey.setCurrentUserPassword(writeWorkbookHolder.getPassword());
-
hssfWorkbook.writeProtectWorkbook(writeWorkbookHolder.getPassword(),
StringUtils.EMPTY);
+ try {
+
Biff8EncryptionKey.setCurrentUserPassword(writeWorkbookHolder.getPassword());
+
hssfWorkbook.writeProtectWorkbook(writeWorkbookHolder.getPassword(),
StringUtils.EMPTY);
+ } finally {
+ Biff8EncryptionKey.setCurrentUserPassword(null);
+ }
}
return;
case CSV:
diff --git
a/fesod-sheet/src/test/java/org/apache/fesod/sheet/encrypt/EncryptDataTest.java
b/fesod-sheet/src/test/java/org/apache/fesod/sheet/encrypt/EncryptDataTest.java
index a64b92c2..2bdb2b4a 100644
---
a/fesod-sheet/src/test/java/org/apache/fesod/sheet/encrypt/EncryptDataTest.java
+++
b/fesod-sheet/src/test/java/org/apache/fesod/sheet/encrypt/EncryptDataTest.java
@@ -36,6 +36,7 @@ import org.apache.fesod.sheet.simple.SimpleData;
import org.apache.fesod.sheet.support.ExcelTypeEnum;
import org.apache.fesod.sheet.util.TestFileUtil;
import org.apache.fesod.sheet.write.builder.ExcelWriterBuilder;
+import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.MethodOrderer;
@@ -126,7 +127,9 @@ public class EncryptDataTest {
}
excelWriterBuilder.sheet().doWrite(data());
+ Assertions.assertNull(Biff8EncryptionKey.getCurrentUserPassword());
List<EncryptData> dataList = readerBuilder.sheet().doReadSync();
+ Assertions.assertNull(Biff8EncryptionKey.getCurrentUserPassword());
Assertions.assertEquals(10, dataList.size());
Assertions.assertNotNull(dataList.get(0).getName());
}
diff --git
a/fesod-sheet/src/test/java/org/apache/fesod/sheet/util/WorkBookUtilTest.java
b/fesod-sheet/src/test/java/org/apache/fesod/sheet/util/WorkBookUtilTest.java
index f0d9cb23..91b1e5b7 100644
---
a/fesod-sheet/src/test/java/org/apache/fesod/sheet/util/WorkBookUtilTest.java
+++
b/fesod-sheet/src/test/java/org/apache/fesod/sheet/util/WorkBookUtilTest.java
@@ -228,6 +228,7 @@ class WorkBookUtilTest {
// Verify
Mockito.verify(writeWorkbookHolder).setWorkbook(Mockito.any(HSSFWorkbook.class));
+ Assertions.assertNull(Biff8EncryptionKey.getCurrentUserPassword());
}
@Test
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]