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:
|
case VerticalPageBreakRecord.sid:
|
||||||
retval = new VerticalPageBreakRecord( in);
|
retval = new VerticalPageBreakRecord( in);
|
||||||
break;
|
break;
|
||||||
|
case WriteProtectRecord.sid:
|
||||||
|
retval = new WriteProtectRecord( in);
|
||||||
|
break;
|
||||||
|
case FilePassRecord.sid:
|
||||||
|
retval = new FilePassRecord(in);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
retval = new UnknownRecord( in );
|
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.WindowProtectRecord;
|
||||||
import org.apache.poi.hssf.record.WindowTwoRecord;
|
import org.apache.poi.hssf.record.WindowTwoRecord;
|
||||||
import org.apache.poi.hssf.record.WriteAccessRecord;
|
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,
|
BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class,
|
||||||
LeftMarginRecord.class, RightMarginRecord.class,
|
LeftMarginRecord.class, RightMarginRecord.class,
|
||||||
TopMarginRecord.class, BottomMarginRecord.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,
|
DrawingRecord.class, DrawingGroupRecord.class, DrawingSelectionRecord.class,
|
||||||
ObjRecord.class, TextObjectRecord.class,
|
ObjRecord.class, TextObjectRecord.class,
|
||||||
PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class,
|
PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class,
|
||||||
HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class
|
HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class,
|
||||||
|
WriteProtectRecord.class, FilePassRecord.class
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
records = new Class[]
|
records = new Class[]
|
||||||
@ -106,7 +107,8 @@ public class RecordFactory
|
|||||||
PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class,
|
PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class,
|
||||||
DrawingRecord.class, DrawingGroupRecord.class, DrawingSelectionRecord.class,
|
DrawingRecord.class, DrawingGroupRecord.class, DrawingSelectionRecord.class,
|
||||||
ObjRecord.class, TextObjectRecord.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();
|
sid = in.getSid();
|
||||||
thedata = in.readRemainder();
|
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