Added explicit RecordFormatException when a FilePass record (indicating that the workbook is encrypted) is encountered.
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@437370 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b5ad05cdd1
commit
5d8423bd13
@ -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 );
|
||||
}
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
}
|
||||
|
106
src/java/org/apache/poi/hssf/record/FilePassRecord.java
Normal file
106
src/java/org/apache/poi/hssf/record/FilePassRecord.java
Normal file
@ -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;
|
||||
}
|
||||
}
|
@ -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
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -66,6 +66,8 @@ public class UnknownRecord
|
||||
{
|
||||
sid = in.getSid();
|
||||
thedata = in.readRemainder();
|
||||
|
||||
//System.out.println("UnknownRecord: 0x"+Integer.toHexString(sid));
|
||||
}
|
||||
|
||||
/**
|
||||
|
91
src/java/org/apache/poi/hssf/record/WriteProtectRecord.java
Normal file
91
src/java/org/apache/poi/hssf/record/WriteProtectRecord.java
Normal file
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user