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
This commit is contained in:
parent
e2dd40f66c
commit
96198ae3d1
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
<!-- Don't forget to update status.xml too! -->
|
<!-- Don't forget to update status.xml too! -->
|
||||||
<release version="3.1-beta1" date="2008-??-??">
|
<release version="3.1-beta1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="add">44536 - Improved support for detecting read-only recommended files</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">43901 - Correctly update the internal last cell number when adding and removing cells (previously sometimes off-by-one)</action>
|
<action dev="POI-DEVELOPERS" type="fix">43901 - Correctly update the internal last cell number when adding and removing cells (previously sometimes off-by-one)</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">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</action>
|
<action dev="POI-DEVELOPERS" type="fix">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</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support</action>
|
<action dev="POI-DEVELOPERS" type="fix">44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support</action>
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
<!-- Don't forget to update changes.xml too! -->
|
<!-- Don't forget to update changes.xml too! -->
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.1-beta1" date="2008-??-??">
|
<release version="3.1-beta1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="add">44536 - Improved support for detecting read-only recommended files</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">43901 - Correctly update the internal last cell number when adding and removing cells (previously sometimes off-by-one)</action>
|
<action dev="POI-DEVELOPERS" type="fix">43901 - Correctly update the internal last cell number when adding and removing cells (previously sometimes off-by-one)</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support</action>
|
<action dev="POI-DEVELOPERS" type="fix">44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">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</action>
|
<action dev="POI-DEVELOPERS" type="fix">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</action>
|
||||||
|
@ -2300,6 +2300,17 @@ public class Workbook implements Model
|
|||||||
}
|
}
|
||||||
return this.fileShare;
|
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
|
* protect a workbook with a password (not encypted, just sets writeprotect
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
package org.apache.poi.hssf.record;
|
package org.apache.poi.hssf.record;
|
||||||
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.util.StringUtil;
|
import org.apache.poi.util.StringUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,6 +31,8 @@ import org.apache.poi.util.StringUtil;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class FileSharingRecord extends Record {
|
public class FileSharingRecord extends Record {
|
||||||
|
private static POILogger logger = POILogFactory.getLogger(FileSharingRecord.class);
|
||||||
|
|
||||||
public final static short sid = 0x5b;
|
public final static short sid = 0x5b;
|
||||||
private short field_1_readonly;
|
private short field_1_readonly;
|
||||||
private short field_2_password;
|
private short field_2_password;
|
||||||
@ -58,8 +62,23 @@ public class FileSharingRecord extends Record {
|
|||||||
field_1_readonly = in.readShort();
|
field_1_readonly = in.readShort();
|
||||||
field_2_password = in.readShort();
|
field_2_password = in.readShort();
|
||||||
field_3_username_length = in.readByte();
|
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_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
|
//this is the world's lamest "security". thanks to Wouter van Vugt for making me
|
||||||
|
@ -267,7 +267,7 @@ public class RecordInputStream extends InputStream
|
|||||||
|
|
||||||
public String readCompressedUnicode(int length) {
|
public String readCompressedUnicode(int length) {
|
||||||
if ((length < 0) || ((remaining() < length) && !isContinueNext())) {
|
if ((length < 0) || ((remaining() < length) && !isContinueNext())) {
|
||||||
throw new IllegalArgumentException("Illegal length");
|
throw new IllegalArgumentException("Illegal length " + length);
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuffer buf = new StringBuffer(length);
|
StringBuffer buf = new StringBuffer(length);
|
||||||
|
@ -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
|
* protect a workbook with a password (not encypted, just sets writeprotect
|
||||||
* flags and the password.
|
* flags and the password.
|
||||||
|
BIN
src/testcases/org/apache/poi/hssf/data/ReadOnlyRecommended.xls
Normal file
BIN
src/testcases/org/apache/poi/hssf/data/ReadOnlyRecommended.xls
Normal file
Binary file not shown.
@ -1104,6 +1104,29 @@ extends TestCase {
|
|||||||
|
|
||||||
assertEquals(1, wb.getNumberOfSheets());
|
assertEquals(1, wb.getNumberOfSheets());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Files with "read only recommended" were giving
|
||||||
|
* grief on the FileSharingRecord
|
||||||
|
*/
|
||||||
|
public void test44536() throws Exception {
|
||||||
|
FileInputStream in = new FileInputStream(new File(cwd, "ReadOnlyRecommended.xls"));
|
||||||
|
|
||||||
|
// Used to blow up with an IllegalArgumentException
|
||||||
|
// when creating a FileSharingRecord
|
||||||
|
HSSFWorkbook wb = new HSSFWorkbook(in);
|
||||||
|
in.close();
|
||||||
|
|
||||||
|
// Check read only advised
|
||||||
|
assertEquals(3, wb.getNumberOfSheets());
|
||||||
|
assertTrue(wb.isWriteProtected());
|
||||||
|
|
||||||
|
// But also check that another wb isn't
|
||||||
|
in = new FileInputStream(new File(cwd, "SimpleWithChoose.xls"));
|
||||||
|
wb = new HSSFWorkbook(in);
|
||||||
|
in.close();
|
||||||
|
assertFalse(wb.isWriteProtected());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user