From e2ecefa533b00980fe05edb7d02b8afe1e4de80b Mon Sep 17 00:00:00 2001 From: Jason Height Date: Sun, 27 Aug 2006 12:00:36 +0000 Subject: [PATCH] Added explicit RecordFormatException when a FilePass record (indicating that the workbook is encrypted) is encountered. (due to bug 27548) git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@437370 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/hssf/dev/BiffViewer.java | 6 + .../hssf/eventmodel/EventRecordFactory.java | 5 +- .../poi/hssf/record/FilePassRecord.java | 106 ++++++++++++++++++ .../apache/poi/hssf/record/RecordFactory.java | 6 +- .../apache/poi/hssf/record/UnknownRecord.java | 2 + .../poi/hssf/record/WriteProtectRecord.java | 91 +++++++++++++++ 6 files changed, 213 insertions(+), 3 deletions(-) create mode 100644 src/java/org/apache/poi/hssf/record/FilePassRecord.java create mode 100644 src/java/org/apache/poi/hssf/record/WriteProtectRecord.java diff --git a/src/java/org/apache/poi/hssf/dev/BiffViewer.java b/src/java/org/apache/poi/hssf/dev/BiffViewer.java index df62f7c6dc..4867ad5686 100644 --- a/src/java/org/apache/poi/hssf/dev/BiffViewer.java +++ b/src/java/org/apache/poi/hssf/dev/BiffViewer.java @@ -502,6 +502,12 @@ public class BiffViewer { case VerticalPageBreakRecord.sid: retval = new VerticalPageBreakRecord( in); break; + case WriteProtectRecord.sid: + retval = new WriteProtectRecord( in); + break; + case FilePassRecord.sid: + retval = new FilePassRecord(in); + break; default: retval = new UnknownRecord( in ); } diff --git a/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java b/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java index 2532ad72fb..526b8b8ffc 100644 --- a/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java +++ b/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java @@ -103,6 +103,8 @@ import org.apache.poi.hssf.record.WindowOneRecord; import org.apache.poi.hssf.record.WindowProtectRecord; import org.apache.poi.hssf.record.WindowTwoRecord; import org.apache.poi.hssf.record.WriteAccessRecord; +import org.apache.poi.hssf.record.WriteProtectRecord; +import org.apache.poi.hssf.record.FilePassRecord; /** @@ -153,7 +155,8 @@ public class EventRecordFactory BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class, TopMarginRecord.class, BottomMarginRecord.class, - PaletteRecord.class, StringRecord.class, SharedFormulaRecord.class + PaletteRecord.class, StringRecord.class, SharedFormulaRecord.class, + WriteProtectRecord.class, FilePassRecord.class }; } diff --git a/src/java/org/apache/poi/hssf/record/FilePassRecord.java b/src/java/org/apache/poi/hssf/record/FilePassRecord.java new file mode 100644 index 0000000000..b4ac4d0830 --- /dev/null +++ b/src/java/org/apache/poi/hssf/record/FilePassRecord.java @@ -0,0 +1,106 @@ + +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + + +package org.apache.poi.hssf.record; + +import org.apache.poi.util.LittleEndian; + +/** + * Title: File Pass Record

+ * Description: Indicates that the record after this record are encrypted. HSSF does not support encrypted excel workbooks + * and the presence of this record will cause processing to be aborted.

+ * REFERENCE: PG 420 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)

+ * @author Jason Height (jheight at chariot dot net dot au) + * @version 3.0-pre + */ + +public class FilePassRecord + extends Record +{ + public final static short sid = 0x2F; + private int field_1_encryptedpassword; + + public FilePassRecord() + { + } + + /** + * Constructs a FILEPASS record and sets its fields appropriately. + * + * @param id id must be 0x84 or an exception will be throw upon validation + * @param size the size of the data area of the record + * @param data data of the record (should not contain sid/len) + */ + + public FilePassRecord(RecordInputStream in) + { + super(in); + } + + protected void validateSid(short id) + { + if (id != sid) + { + throw new RecordFormatException("NOT A FILEPASS RECORD"); + } + } + + protected void fillFields(RecordInputStream in) + { + field_1_encryptedpassword = in.readInt(); + + //Whilst i have read in the password, HSSF currently has no plans to support/decrypt the remainder + //of this workbook + throw new RecordFormatException("HSSF does not currently support encrypted workbooks"); + } + + public String toString() + { + StringBuffer buffer = new StringBuffer(); + + buffer.append("[FILEPASS]\n"); + buffer.append(" .password = ").append(field_1_encryptedpassword) + .append("\n"); + buffer.append("[/FILEPASS]\n"); + return buffer.toString(); + } + + public int serialize(int offset, byte [] data) + { + LittleEndian.putShort(data, 0 + offset, sid); + LittleEndian.putShort(data, 2 + offset, ( short ) 0x4); + LittleEndian.putInt(data, 4 + offset, ( short ) field_1_encryptedpassword); + return getRecordSize(); + } + + public int getRecordSize() + { + return 8; + } + + public short getSid() + { + return sid; + } + + public Object clone() { + FilePassRecord rec = new FilePassRecord(); + rec.field_1_encryptedpassword = field_1_encryptedpassword; + return rec; + } +} diff --git a/src/java/org/apache/poi/hssf/record/RecordFactory.java b/src/java/org/apache/poi/hssf/record/RecordFactory.java index 9f5901c050..5224f3bbc9 100644 --- a/src/java/org/apache/poi/hssf/record/RecordFactory.java +++ b/src/java/org/apache/poi/hssf/record/RecordFactory.java @@ -72,7 +72,8 @@ public class RecordFactory DrawingRecord.class, DrawingGroupRecord.class, DrawingSelectionRecord.class, ObjRecord.class, TextObjectRecord.class, PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class, - HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class + HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class, + WriteProtectRecord.class, FilePassRecord.class }; } else { records = new Class[] @@ -106,7 +107,8 @@ public class RecordFactory PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class, DrawingRecord.class, DrawingGroupRecord.class, DrawingSelectionRecord.class, ObjRecord.class, TextObjectRecord.class, - HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class + HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class, + WriteProtectRecord.class, FilePassRecord.class }; } diff --git a/src/java/org/apache/poi/hssf/record/UnknownRecord.java b/src/java/org/apache/poi/hssf/record/UnknownRecord.java index e61bc76e32..37b2f9646b 100644 --- a/src/java/org/apache/poi/hssf/record/UnknownRecord.java +++ b/src/java/org/apache/poi/hssf/record/UnknownRecord.java @@ -66,6 +66,8 @@ public class UnknownRecord { sid = in.getSid(); thedata = in.readRemainder(); + + //System.out.println("UnknownRecord: 0x"+Integer.toHexString(sid)); } /** diff --git a/src/java/org/apache/poi/hssf/record/WriteProtectRecord.java b/src/java/org/apache/poi/hssf/record/WriteProtectRecord.java new file mode 100644 index 0000000000..4830e39ae9 --- /dev/null +++ b/src/java/org/apache/poi/hssf/record/WriteProtectRecord.java @@ -0,0 +1,91 @@ + +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + + +package org.apache.poi.hssf.record; + +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.StringUtil; + +/** + * Title: Write Protect Record

+ * Description: Indicated that the sheet/workbook is write protected. + * REFERENCE: PG 425 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)

+ * @version 3.0-pre + */ + +public class WriteProtectRecord + extends Record +{ + public final static short sid = 0x86; + + public WriteProtectRecord() + { + } + + /** + * Constructs a WriteAccess record and sets its fields appropriately. + * + * @param id id must be 0x5c or an exception will be throw upon validation + * @param size the size of the data area of the record + * @param data data of the record (should not contain sid/len) + */ + + public WriteProtectRecord(RecordInputStream in) + { + super(in); + } + + protected void validateSid(short id) + { + if (id != sid) + { + throw new RecordFormatException("NOT A WRITEPROTECT RECORD"); + } + } + + protected void fillFields(RecordInputStream in) + { + } + + public String toString() + { + StringBuffer buffer = new StringBuffer(); + + buffer.append("[WRITEPROTECT]\n"); + buffer.append("[/WRITEPROTECT]\n"); + return buffer.toString(); + } + + public int serialize(int offset, byte [] data) + { + LittleEndian.putShort(data, 0 + offset, sid); + LittleEndian.putShort(data, 2 + offset, (short)0); + + return getRecordSize(); + } + + public int getRecordSize() + { + return 4; + } + + public short getSid() + { + return sid; + } +} -- 2.39.5