diff --git a/src/java/org/apache/poi/poifs/filesystem/OfficeXmlFileException.java b/src/java/org/apache/poi/poifs/filesystem/OfficeXmlFileException.java new file mode 100644 index 000000000..b83ccd0f2 --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/OfficeXmlFileException.java @@ -0,0 +1,36 @@ + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.poifs.filesystem; + +/** + * This exception is thrown when we try to open a file that's actually + * an Office 2007+ XML file, rather than an OLE2 file (which is what + * POI works with) + * + * @author Nick Burch + */ + +public class OfficeXmlFileException extends IllegalArgumentException +{ + public OfficeXmlFileException(String s) { + super(s); + } +} diff --git a/src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java b/src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java index 70e1c301b..16c94e2c2 100644 --- a/src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java +++ b/src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java @@ -24,6 +24,7 @@ import java.io.*; import java.util.*; import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.apache.poi.util.IOUtils; import org.apache.poi.util.IntegerField; import org.apache.poi.util.LittleEndian; @@ -89,6 +90,13 @@ public class HeaderBlockReader if (signature.get() != _signature) { + // Is it one of the usual suspects? + if(_data[0] == 0x50 && _data[1] == 0x4b && _data[2] == 0x03 && + _data[3] == 0x04) { + throw new OfficeXmlFileException("The supplied data appears to be in the Office 2007+ XML. POI only supports OLE2 Office documents"); + } + + // Give a generic error throw new IOException("Invalid header signature; read " + signature.get() + ", expected " + _signature); diff --git a/src/testcases/org/apache/poi/hssf/data/sample.xlsx b/src/testcases/org/apache/poi/hssf/data/sample.xlsx new file mode 100644 index 000000000..2eb36ee2a Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/sample.xlsx differ diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestOffice2007XMLException.java b/src/testcases/org/apache/poi/poifs/filesystem/TestOffice2007XMLException.java new file mode 100644 index 000000000..db8607d37 --- /dev/null +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestOffice2007XMLException.java @@ -0,0 +1,50 @@ + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.poifs.filesystem; + +import junit.framework.TestCase; +import java.io.*; + +/** + * Class to test that POIFS complains when given an Office 2007 XML document + * + * @author Marc Johnson + */ + +public class TestOffice2007XMLException extends TestCase +{ + public String dirname; + + public void setUp() { + dirname = System.getProperty("HSSF.testdata.path"); + } + + public void testXMLException() throws IOException + { + FileInputStream in = new FileInputStream(dirname + "/sample.xlsx"); + + try { + new POIFSFileSystem(in); + fail(); + } catch(OfficeXmlFileException e) { + // Good + } + } +}