From 25916b25bcaec47977867ed5b526aa490c3fc18d Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 7 Mar 2008 11:36:14 +0000 Subject: [PATCH] Improved support for read-only recommended workbooks, fixing bug #44536 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@634619 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../org/apache/poi/hssf/model/Workbook.java | 11 +++++++++ .../poi/hssf/record/FileSharingRecord.java | 21 +++++++++++++++- .../poi/hssf/record/RecordInputStream.java | 2 +- .../poi/hssf/usermodel/HSSFWorkbook.java | 7 ++++++ .../poi/hssf/data/ReadOnlyRecommended.xls | Bin 0 -> 13824 bytes .../apache/poi/hssf/usermodel/TestBugs.java | 23 ++++++++++++++++++ 8 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 src/testcases/org/apache/poi/hssf/data/ReadOnlyRecommended.xls diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index bd4f7dab03..9eb163fc87 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -36,6 +36,7 @@ + 44536 - Improved support for detecting read-only recommended files 43901 - Correctly update the internal last cell number when adding and removing cells (previously sometimes off-by-one) 28231 - For apparently truncated files, which are somehow still valid, now issue a truncation warning but carry on, rather than giving an exception as before 44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 62d0a8dceb..201c4936d9 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 44536 - Improved support for detecting read-only recommended files 43901 - Correctly update the internal last cell number when adding and removing cells (previously sometimes off-by-one) 44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support 44504 - Improvements to FormulaParser - operators, precedence, error literals, quotes in string literals, range checking on IntPtg, formulas with extra un-parsed stuff at the end, improved parse error handling diff --git a/src/java/org/apache/poi/hssf/model/Workbook.java b/src/java/org/apache/poi/hssf/model/Workbook.java index 9bf1c8f475..8fa3010a4b 100644 --- a/src/java/org/apache/poi/hssf/model/Workbook.java +++ b/src/java/org/apache/poi/hssf/model/Workbook.java @@ -2300,6 +2300,17 @@ public class Workbook implements Model } return this.fileShare; } + + /** + * is the workbook protected with a password (not encrypted)? + */ + public boolean isWriteProtected() { + if (this.fileShare == null) { + return false; + } + FileSharingRecord frec = getFileSharing(); + return (frec.getReadOnly() == 1); + } /** * protect a workbook with a password (not encypted, just sets writeprotect diff --git a/src/java/org/apache/poi/hssf/record/FileSharingRecord.java b/src/java/org/apache/poi/hssf/record/FileSharingRecord.java index 17f8cda64a..2f56eb092a 100644 --- a/src/java/org/apache/poi/hssf/record/FileSharingRecord.java +++ b/src/java/org/apache/poi/hssf/record/FileSharingRecord.java @@ -19,6 +19,8 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; import org.apache.poi.util.StringUtil; /** @@ -29,6 +31,8 @@ import org.apache.poi.util.StringUtil; */ public class FileSharingRecord extends Record { + private static POILogger logger = POILogFactory.getLogger(FileSharingRecord.class); + public final static short sid = 0x5b; private short field_1_readonly; private short field_2_password; @@ -58,8 +62,23 @@ public class FileSharingRecord extends Record { field_1_readonly = in.readShort(); field_2_password = in.readShort(); field_3_username_length = in.readByte(); + + // Is this really correct? The latest docs + // seem to hint there's nothing between the + // username length and the username string field_4_unknown = in.readShort(); - field_5_username = in.readCompressedUnicode(field_3_username_length); + + // Ensure we don't try to read more data than + // there actually is + if(field_3_username_length > in.remaining()) { + logger.log(POILogger.WARN, "FileSharingRecord defined a username of length " + field_3_username_length + ", but only " + in.remaining() + " bytes were left, truncating"); + field_3_username_length = (byte)in.remaining(); + } + if(field_3_username_length > 0) { + field_5_username = in.readCompressedUnicode(field_3_username_length); + } else { + field_5_username = ""; + } } //this is the world's lamest "security". thanks to Wouter van Vugt for making me diff --git a/src/java/org/apache/poi/hssf/record/RecordInputStream.java b/src/java/org/apache/poi/hssf/record/RecordInputStream.java index 32094287fa..431558ccc8 100755 --- a/src/java/org/apache/poi/hssf/record/RecordInputStream.java +++ b/src/java/org/apache/poi/hssf/record/RecordInputStream.java @@ -267,7 +267,7 @@ public class RecordInputStream extends InputStream public String readCompressedUnicode(int length) { if ((length < 0) || ((remaining() < length) && !isContinueNext())) { - throw new IllegalArgumentException("Illegal length"); + throw new IllegalArgumentException("Illegal length " + length); } StringBuffer buf = new StringBuffer(length); diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index e112da2212..1e89d6bebd 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -1379,6 +1379,13 @@ public class HSSFWorkbook extends POIDocument } } + /** + * Is the workbook protected with a password (not encrypted)? + */ + public boolean isWriteProtected() { + return this.workbook.isWriteProtected(); + } + /** * protect a workbook with a password (not encypted, just sets writeprotect * flags and the password. diff --git a/src/testcases/org/apache/poi/hssf/data/ReadOnlyRecommended.xls b/src/testcases/org/apache/poi/hssf/data/ReadOnlyRecommended.xls new file mode 100644 index 0000000000000000000000000000000000000000..d479b94f60801ebc9fcaab0c40490a9f50dd77b2 GIT binary patch literal 13824 zcmeHOUuc_E6#pen+H~#OwB6>MEQS=RYtz|nii6oTiWPkrmJZoql{QT~T3T00t4vTA zb$gpI*@G`b88T3W{qfIy5ozD{G8AF>?y;!#}&uR^@h#<~}7AS!)$wPP?tAWAE%tSgn7Vm#DePA|zgJ~aUp5_~H zpGA`nD4KbydIM?+a(KknCDeuptSg0Kl#40V8jACYYp%Xp8u$*_sEt27G zFP73_u{F`1VB2taYPdTVN@5c_)UjkXR92V1!oC+t@Y0k!VgO5gd76^DzP^&fJJE$Z z${hN=i~jwt=C;%?k2RVO_^A-L(i8J>>2<+P|D)gZ`+Cj5>)BV+Yt-x6uVj4yah+a~ zd_2269DZJ^-&94PtfKF%qObpr{&+BiXs)K9vL#n*Wos^EWm~S!O5|YWnq0UrV$Xyl zeA1i=E6Q5zo){mW+ak@^_VrlQY?bEQx-y$>M-k#&N@5`pA@iR5Ab=~h()<$hVVfS! z6tIf7!?>xQ5=k!7brrx?^J@@jjeHByeD+3GF! zV2je(l{dcsc-QDa->~UBP2XkmdDG-*761~DJ_s>D*#UNQ7vXYI#V27!a5`PN}r+A50I1FWw zxvE3JA>a^j2si}(mk3c6vCNtTY*_r)w z@&1FE@o9@8clxdLJBKa=QtXd`^UtWR<)C~yatJsC90Cpjhk!%CA>a^j2si{B0uBL( zfI~pR{sAfxt^^2e}JqXX!eqCB9D<9$kSxy_H$(A z{ZEtEkq?u#A8?ec{egGM<@*8JOAsk{Z|-QYv2?64MN7*Voyb=E5#DcdrRvsFbsHLK zC`Z~{&>(wevQxAA5pUM|YYayY0f&G?z#-rea0oaA90Cpjhk!%CA>a^L$p|QqS8A*r zSoybJan+lX%Bl6g4(0lKgHma;a(3nKdVy1UzuH?^>NkJo`Tnb+%JsD$p!Ta|m5%