mirror of https://github.com/apache/poi.git
Bug #53282 - Avoid exception when parsing OPC relationships with non-breaking spaces
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1403195 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7c0f424511
commit
37609e6550
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.9-beta1" date="2012-??-??">
|
<release version="3.9-beta1" date="2012-??-??">
|
||||||
|
<action dev="poi-developers" type="fix">53282 - Avoid exception when parsing OPC relationships with non-breaking spaces</action>
|
||||||
<action dev="poi-developers" type="fix">54016 - Avoid exception when parsing workbooks with DConRefRecord in row aggregate</action>
|
<action dev="poi-developers" type="fix">54016 - Avoid exception when parsing workbooks with DConRefRecord in row aggregate</action>
|
||||||
<action dev="poi-developers" type="fix">54008 - Fixed Ant build to support build directories with blanks</action>
|
<action dev="poi-developers" type="fix">54008 - Fixed Ant build to support build directories with blanks</action>
|
||||||
<action dev="poi-developers" type="fix">53374 - Avoid exceptions when parsing hyperlinks of type "javascript://"</action>
|
<action dev="poi-developers" type="fix">53374 - Avoid exceptions when parsing hyperlinks of type "javascript://"</action>
|
||||||
|
|
|
@ -709,6 +709,25 @@ public final class PackagingURIHelper {
|
||||||
value = path + "#" + encode(fragment);
|
value = path + "#" + encode(fragment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// trailing white spaces must be url-encoded, see Bugzilla 53282
|
||||||
|
if(value.length() > 0 ){
|
||||||
|
StringBuilder b = new StringBuilder();
|
||||||
|
int idx = value.length() - 1;
|
||||||
|
for(; idx >= 0; idx--){
|
||||||
|
char c = value.charAt(idx);
|
||||||
|
if(Character.isWhitespace(c) || c == '\u00A0') {
|
||||||
|
b.append(c);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(b.length() > 0){
|
||||||
|
value = value.substring(0, idx+1) + encode(b.reverse().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MS Office can insert URIs with missing authority, e.g. "http://" or "javascript://"
|
||||||
|
// append a forward slash to avoid parse exception
|
||||||
if(missingAuthPattern.matcher(value).matches()){
|
if(missingAuthPattern.matcher(value).matches()){
|
||||||
value += "/";
|
value += "/";
|
||||||
}
|
}
|
||||||
|
@ -756,7 +775,7 @@ public final class PackagingURIHelper {
|
||||||
};
|
};
|
||||||
|
|
||||||
private static boolean isUnsafe(int ch) {
|
private static boolean isUnsafe(int ch) {
|
||||||
return ch > 0x80 || " ".indexOf(ch) >= 0;
|
return ch > 0x80 || Character.isWhitespace(ch) || ch == '\u00A0';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.poi.openxml4j.opc;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
@ -344,4 +345,32 @@ public class TestRelationships extends TestCase {
|
||||||
assertEquals(rel1.getTargetURI(), rel2.getTargetURI());
|
assertEquals(rel1.getTargetURI(), rel2.getTargetURI());
|
||||||
assertEquals(rel1.getTargetMode(), rel2.getTargetMode());
|
assertEquals(rel1.getTargetMode(), rel2.getTargetMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testTrailingSpacesInURI_53282() throws Exception {
|
||||||
|
InputStream is = OpenXML4JTestDataSamples.openSampleStream("53282.xlsx");
|
||||||
|
OPCPackage pkg = OPCPackage.open(is);
|
||||||
|
is.close();
|
||||||
|
|
||||||
|
PackageRelationshipCollection sheetRels = pkg.getPartsByName(Pattern.compile("/xl/worksheets/sheet1.xml")).get(0).getRelationships();
|
||||||
|
assertEquals(3, sheetRels.size());
|
||||||
|
PackageRelationship rId1 = sheetRels.getRelationshipByID("rId1");
|
||||||
|
assertEquals(TargetMode.EXTERNAL, rId1.getTargetMode());
|
||||||
|
URI targetUri = rId1.getTargetURI();
|
||||||
|
assertEquals("mailto:nobody@nowhere.uk%C2%A0", targetUri.toASCIIString());
|
||||||
|
assertEquals("nobody@nowhere.uk\u00A0", targetUri.getSchemeSpecificPart());
|
||||||
|
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
pkg.save(out);
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
pkg = OPCPackage.open(new ByteArrayInputStream(out.toByteArray()));
|
||||||
|
sheetRels = pkg.getPartsByName(Pattern.compile("/xl/worksheets/sheet1.xml")).get(0).getRelationships();
|
||||||
|
assertEquals(3, sheetRels.size());
|
||||||
|
rId1 = sheetRels.getRelationshipByID("rId1");
|
||||||
|
assertEquals(TargetMode.EXTERNAL, rId1.getTargetMode());
|
||||||
|
targetUri = rId1.getTargetURI();
|
||||||
|
assertEquals("mailto:nobody@nowhere.uk%C2%A0", targetUri.toASCIIString());
|
||||||
|
assertEquals("nobody@nowhere.uk\u00A0", targetUri.getSchemeSpecificPart());
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -252,4 +252,14 @@ public final class TestXSSFHyperlink extends BaseTestHyperlink {
|
||||||
link = wb.getSheetAt(0).getRow(0).getCell(0).getHyperlink();
|
link = wb.getSheetAt(0).getRow(0).getCell(0).getHyperlink();
|
||||||
assertEquals("javascript:///", link.getAddress());
|
assertEquals("javascript:///", link.getAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void test53282() {
|
||||||
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("53282.xlsx");
|
||||||
|
XSSFHyperlink link = wb.getSheetAt(0).getRow(0).getCell(14).getHyperlink();
|
||||||
|
assertEquals("mailto:nobody@nowhere.uk%C2%A0", link.getAddress());
|
||||||
|
|
||||||
|
wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
|
||||||
|
link = wb.getSheetAt(0).getRow(0).getCell(14).getHyperlink();
|
||||||
|
assertEquals("mailto:nobody@nowhere.uk%C2%A0", link.getAddress());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue