diff options
author | Jason Height <jheight@apache.org> | 2006-08-27 12:00:36 +0000 |
---|---|---|
committer | Jason Height <jheight@apache.org> | 2006-08-27 12:00:36 +0000 |
commit | e2ecefa533b00980fe05edb7d02b8afe1e4de80b (patch) | |
tree | 47fe5382aa42e0b3562bfd1253dc2d16df0b6565 /src/java | |
parent | f68160a399d7b2ddad2faff740debfc5f95cfd9f (diff) | |
download | poi-e2ecefa533b00980fe05edb7d02b8afe1e4de80b.tar.gz poi-e2ecefa533b00980fe05edb7d02b8afe1e4de80b.zip |
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
Diffstat (limited to 'src/java')
6 files changed, 213 insertions, 3 deletions
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<P>
+ * 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.<p>
+ * REFERENCE: PG 420 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P>
+ * @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<P>
+ * Description: Indicated that the sheet/workbook is write protected.
+ * REFERENCE: PG 425 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P>
+ * @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;
+ }
+}
|