From 37609e6550510d1fc03c0c7e37eea343f3ebf1d5 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Mon, 29 Oct 2012 08:42:54 +0000 Subject: [PATCH] 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 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/openxml4j/opc/PackagingURIHelper.java | 21 ++++++++++++- .../poi/openxml4j/opc/TestRelationships.java | 29 ++++++++++++++++++ .../poi/xssf/usermodel/TestXSSFHyperlink.java | 10 ++++++ test-data/openxml4j/53282.xlsx | Bin 0 -> 11032 bytes test-data/spreadsheet/53282.xlsx | Bin 0 -> 11032 bytes 6 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 test-data/openxml4j/53282.xlsx create mode 100644 test-data/spreadsheet/53282.xlsx diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 27ec8027fb..766157603e 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 53282 - Avoid exception when parsing OPC relationships with non-breaking spaces 54016 - Avoid exception when parsing workbooks with DConRefRecord in row aggregate 54008 - Fixed Ant build to support build directories with blanks 53374 - Avoid exceptions when parsing hyperlinks of type "javascript://" diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagingURIHelper.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagingURIHelper.java index 37fdc5a58b..6385124b3f 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagingURIHelper.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagingURIHelper.java @@ -709,6 +709,25 @@ public final class PackagingURIHelper { 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()){ value += "/"; } @@ -756,7 +775,7 @@ public final class PackagingURIHelper { }; private static boolean isUnsafe(int ch) { - return ch > 0x80 || " ".indexOf(ch) >= 0; + return ch > 0x80 || Character.isWhitespace(ch) || ch == '\u00A0'; } } diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java index 738175f54d..510377a9e0 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java @@ -19,6 +19,7 @@ package org.apache.poi.openxml4j.opc; import java.io.*; import java.net.URI; +import java.util.regex.Pattern; import junit.framework.TestCase; @@ -344,4 +345,32 @@ public class TestRelationships extends TestCase { assertEquals(rel1.getTargetURI(), rel2.getTargetURI()); 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()); + + } } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java index 9a79bf3cca..fbec25c670 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java @@ -252,4 +252,14 @@ public final class TestXSSFHyperlink extends BaseTestHyperlink { link = wb.getSheetAt(0).getRow(0).getCell(0).getHyperlink(); 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()); + } } diff --git a/test-data/openxml4j/53282.xlsx b/test-data/openxml4j/53282.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6d88303489568a2a2ef82b2a691f893a00d6a29e GIT binary patch literal 11032 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/53282.xlsx b/test-data/spreadsheet/53282.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6d88303489568a2a2ef82b2a691f893a00d6a29e GIT binary patch literal 11032 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 literal 0 HcmV?d00001 -- 2.39.5