From 910c91900ac71c7b376ff632e79f36b7debde2cc Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sun, 17 Sep 2017 22:45:03 +0000 Subject: [PATCH] #60499 - Deleting a picture that is used twice on a slide corrupt the slide git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1808661 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/POIXMLDocumentPart.java | 83 ++++++++++++++++-- .../apache/poi/xslf/usermodel/XSLFSheet.java | 3 +- .../apache/poi/xslf/usermodel/XSLFSlide.java | 2 +- .../org/apache/poi/TestPOIXMLDocument.java | 2 +- .../org/apache/poi/xslf/TestXSLFBugs.java | 53 +++++++++++ test-data/slideshow/bug60499.pptx | Bin 0 -> 40792 bytes 6 files changed, 130 insertions(+), 13 deletions(-) create mode 100644 test-data/slideshow/bug60499.pptx diff --git a/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java b/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java index c5afb15446..5b6add51ab 100644 --- a/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java +++ b/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java @@ -231,15 +231,35 @@ public class POIXMLDocumentPart { * @return the target part of the relation, or null, if none exists */ public final POIXMLDocumentPart getRelationById(String id) { - RelationPart rp = relations.get(id); + RelationPart rp = getRelationPartById(id); return (rp == null) ? null : rp.getDocumentPart(); } /** - * Returns the {@link PackageRelationship#getId()} of the + * Returns the target {@link RelationPart}, where a + * {@link PackageRelationship} is set from the {@link PackagePart} of this + * {@link POIXMLDocumentPart} to the {@link PackagePart} of the target + * {@link POIXMLDocumentPart} with a {@link PackageRelationship#getId()} + * matching the given parameter value. + * + * @param id + * The relation id to look for + * @return the target relation part, or null, if none exists + * + * @since 4.0.0 + */ + public final RelationPart getRelationPartById(String id) { + return relations.get(id); + } + + /** + * Returns the first {@link PackageRelationship#getId()} of the * {@link PackageRelationship}, that sources from the {@link PackagePart} of * this {@link POIXMLDocumentPart} to the {@link PackagePart} of the given - * parameter value. + * parameter value.

+ * + * There can be multiple references to the given {@link POIXMLDocumentPart} + * and only the first in the order of creation is returned. * * @param part * The {@link POIXMLDocumentPart} for which the according @@ -292,7 +312,11 @@ public class POIXMLDocumentPart { /** * Remove the relation to the specified part in this package and remove the - * part, if it is no longer needed. + * part, if it is no longer needed.

+ * + * If there are multiple relationships to the same part, this will only + * remove the first relationship in the order of creation. The removal + * via the part id ({@link #removeRelation(String)} is preferred. * * @param part the part which relation is to be removed from this document */ @@ -302,7 +326,11 @@ public class POIXMLDocumentPart { /** * Remove the relation to the specified part in this package and remove the - * part, if it is no longer needed and flag is set to true. + * part, if it is no longer needed and flag is set to true.

+ * + * If there are multiple relationships to the same part, this will only + * remove the first relationship in the order of creation. The removal + * via the part id ({@link #removeRelation(String,boolean)} is preferred. * * @param part * The related part, to which the relation shall be removed. @@ -311,18 +339,53 @@ public class POIXMLDocumentPart { * needed any longer. * @return true, if the relation was removed */ - protected final boolean removeRelation(POIXMLDocumentPart part, boolean removeUnusedParts){ + protected final boolean removeRelation(POIXMLDocumentPart part, boolean removeUnusedParts) { String id = getRelationId(part); - if (id == null) { + return removeRelation(id, removeUnusedParts); + } + + /** + * Remove the relation to the specified part in this package and remove the + * part, if it is no longer needed.

+ * + * If there are multiple relationships to the same part, this will only + * remove the first relationship in the order of creation. The removal + * via the part id ({@link #removeRelation(String)} is preferred. + * + * @param partId the part id which relation is to be removed from this document + * + * @since 4.0.0 + */ + protected final void removeRelation(String partId) { + removeRelation(partId, true); + } + + /** + * Remove the relation to the specified part in this package and remove the + * part, if it is no longer needed and flag is set to true.

+ * + * @param partId + * The related part id, to which the relation shall be removed. + * @param removeUnusedParts + * true, if the part shall be removed from the package if not + * needed any longer. + * @return true, if the relation was removed + * + * @since 4.0.0 + */ + private final boolean removeRelation(String partId, boolean removeUnusedParts) { + RelationPart rp = relations.get(partId); + if (rp == null) { // part is not related with this POIXMLDocumentPart return false; } + POIXMLDocumentPart part = rp.getDocumentPart(); /* decrement usage counter */ part.decrementRelationCounter(); /* remove packagepart relationship */ - getPackagePart().removeRelationship(id); + getPackagePart().removeRelationship(partId); /* remove POIXMLDocument from relations */ - relations.remove(id); + relations.remove(partId); if (removeUnusedParts) { /* if last relation to target part was removed, delete according target part */ @@ -338,6 +401,8 @@ public class POIXMLDocumentPart { return true; } + + /** * Returns the parent POIXMLDocumentPart. All parts except root have not-null parent. * diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index aed2ff7c49..148f5cd6a7 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -612,7 +612,6 @@ implements XSLFShapeContainer, Sheet { * @param pictureShape the picture shapes whose relation is to be removed */ void removePictureRelation(XSLFPictureShape pictureShape) { - POIXMLDocumentPart pd = getRelationById(pictureShape.getBlipId()); - removeRelation(pd); + removeRelation(pictureShape.getBlipId()); } } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index e443fa3106..cfa5873cc5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -243,7 +243,7 @@ implements Slide { if (bgThis != null) { if (bgThis.isSetBgPr() && bgThis.getBgPr().isSetBlipFill()) { String oldId = bgThis.getBgPr().getBlipFill().getBlip().getEmbed(); - removeRelation(getRelationById(oldId)); + removeRelation(oldId); } _slide.getCSld().unsetBg(); } diff --git a/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java b/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java index 90e13aecd4..21c003c297 100644 --- a/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java +++ b/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java @@ -280,7 +280,7 @@ public final class TestPOIXMLDocument { assertNull(part.getRelationById(null)); assertNull(part.getRelationId(null)); assertFalse(part.removeRelation(null, true)); - part.removeRelation(null); + part.removeRelation((POIXMLDocumentPart)null); assertEquals("",part.toString()); part.onDocumentCreate(); //part.getTargetPart(null); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java index 6f8fd2121c..5a5c7bfa77 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java @@ -20,6 +20,7 @@ import static org.apache.poi.POITestCase.assertContains; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -30,17 +31,24 @@ import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.util.Collection; +import java.util.Optional; +import java.util.stream.Collectors; import javax.imageio.ImageIO; import org.apache.poi.POIDataSamples; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart.RelationPart; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackagePartName; +import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.sl.draw.DrawPaint; import org.apache.poi.sl.usermodel.PaintStyle; import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; @@ -49,6 +57,7 @@ import org.apache.poi.sl.usermodel.PictureData; import org.apache.poi.sl.usermodel.PictureData.PictureType; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.sl.usermodel.VerticalAlignment; +import org.apache.poi.util.IOUtils; import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor; import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XSLFAutoShape; @@ -76,6 +85,50 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; public class TestXSLFBugs { private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); + @Test + public void bug60499() throws IOException, InvalidFormatException { + InputStream is = slTests.openResourceAsStream("bug60499.pptx"); + byte buf[] = IOUtils.toByteArray(is); + is.close(); + + PackagePartName ppn = PackagingURIHelper.createPartName("/ppt/media/image1.png"); + + XMLSlideShow ppt1 = new XMLSlideShow(new ByteArrayInputStream(buf)); + XSLFSlide slide1 = ppt1.getSlides().get(0); + + Optional shapeToDelete1 = + slide1.getShapes().stream().filter(s -> s instanceof XSLFPictureShape).findFirst(); + + assertTrue(shapeToDelete1.isPresent()); + slide1.removeShape(shapeToDelete1.get()); + slide1.getRelationParts().stream() + .allMatch(rp -> "rId1,rId3".contains(rp.getRelationship().getId()) ); + + assertNotNull(ppt1.getPackage().getPart(ppn)); + ppt1.close(); + + XMLSlideShow ppt2 = new XMLSlideShow(new ByteArrayInputStream(buf)); + XSLFSlide slide2 = ppt2.getSlides().get(0); + + Optional shapeToDelete2 = + slide2.getShapes().stream().filter(s -> s instanceof XSLFPictureShape).skip(1).findFirst(); + assertTrue(shapeToDelete2.isPresent()); + slide2.removeShape(shapeToDelete2.get()); + slide2.getRelationParts().stream() + .allMatch(rp -> "rId1,rId2".contains(rp.getRelationship().getId()) ); + assertNotNull(ppt2.getPackage().getPart(ppn)); + ppt2.close(); + + XMLSlideShow ppt3 = new XMLSlideShow(new ByteArrayInputStream(buf)); + XSLFSlide slide3 = ppt3.getSlides().get(0); + slide3.getShapes().stream() + .filter(s -> s instanceof XSLFPictureShape) + .collect(Collectors.toList()) + .forEach(s -> slide3.removeShape(s)); + assertNull(ppt3.getPackage().getPart(ppn)); + ppt3.close(); + } + @Test public void bug51187() throws Exception { XMLSlideShow ss1 = XSLFTestDataSamples.openSampleDocument("51187.pptx"); diff --git a/test-data/slideshow/bug60499.pptx b/test-data/slideshow/bug60499.pptx new file mode 100644 index 0000000000000000000000000000000000000000..300873dde05845f04c5f7328b1b99657e32769be GIT binary patch literal 40792 zcmeFZ1ymeewl>_*G!UFXaDuxAhv4oSG`Kqif@^RM!QI^Qij6d3C-jv@AwzarbNNX|CBIS|Xb@J0d86p|hstr7w8Z-k?i@?c-yB9NIC%9)G$Z zqo*~!xjQQhBetXn=dM~FlOa;;vaR0bj5$ms0}@Wz+M^Uq+6XZoe6WD1{HMmcfwr9B zwZ3lINp-kPBVn^iuU8mJ8t*tUb@jVn%MKA`nehR7Dka@0d z%idgeftimdP@etyd{NlTpI%onxGZ@~@V>lYX`NBVCEUW)fX17&T(4LiW5emu(mt!i zh46hb{zB6?_qq@rhKDmk#rz8}mK=(nD?C*niaZKT<|wh1=64EvY6FIYj*Bmw4SrPG z)LhMxs#&*cJKEn{ol_2LQL!vLv|i{C6y2e)l;W1YwCy2nirUSVGUi#M+UG@%QJS?C`&s68=H-vY2IQ z;5)RSQ_vd8h!^KFE$NiCo#=l0zyrXDr3HV5K(b(}y)Ap)z<|N8Ep1vr?_%7&#wFLa zFwW)-Awd<{uN9^LLAT5Cv8oXijoa4s&Q;ky3n_K?!thy?%mH`EKT;F(P39Y zGB}5%QnbNDY3vvgMuP(r(dQt(K~~I~La;Vig99w_k;jm2fZ9p2 zHl+9)Mg0y#PTvd$9kY-?!e@Tx4}o~wyb}klg1kpR!zJF2WqHn)%u7Do2@ZDv11oA$ zPW)H7FL;go(wse6`vzDjhfI#lAB%~a`Ki#3lUqp~m)IiCV% z24XQEVE_O$06dhjospu0oxLNIfxZ1-9V-;Xu|n+XfA^C2q3i23#IcZ_qpC4>8l={L zfLFCuD^)9fOZ~BUafi1zw!gcYVL3pjJ&5d)@cCW8RE?ZLAC!apr75qQw^6Fz>UD}?Bq%gP3Go

WyD| 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 _Sy~OQ+n^u)m58 zK#x!c;Jy8xe8!PUiLDxoy^)*<=Z#$YSz=&A>eg6Gm-5s}3`6w6M@+r$dp(esq)a>T zY~IpQvlUviSk4|l>S$W>1%pEx-X$S+k@5n8bS}d+w;K>a*d(s1@~QT*Nr*QD@48WO z^NGS{izcjCxul5`Fn`G9CP=bvr))?p zVIjaZSBv%}@o+7;<9}J&@x{@Z?f!|GgKt=$F@Y`QC{mi*p`KE%GZ^BxRM}mY6Uf2X z5cGC5fg@NmhvC*vo*9F>3@QWC?-8u51w8n}C>A_LaxCBSicMFOW(4~CDPe{#;6cy) zE1gUEZZ?W&R7WbHFNzyPUhAB_79=*-(${c}8NK3wUCkti4kxXlpUxpOJ;Zm9LY<7n z+1b_oqBwM#>!!|QqNk%+eJ^OZ`Y2qr_rD|5Alig_l2|QdrH+se@2*?bXDfZD_~XL90B7UJAsLC z=yKwsQ*O!yPKDgP0gm)9#zCa9qlKA9RI;nFdW3QK{Ir~2!z88AJt%uLjR*z(D>e+2 zz(X!c>M}#1EcQq{iFgla0sxwKZ5s$dpO(v zb6UDX8#{CUf`>Ky{Ypl(w29nMd3RyX;E`^K+LzL$D-*Z2nMK z>LXpn07sj;dIK7>mZ_n@H?;39VEu&!6S{g4ratOD<#m}}Qw6TdiF)E$Q29l}r(y)a z30;vayW(r(AFX3xk#U;&i^o?Nj%tuu*Ll{ot;;m5dvq;mRM*`8O7DB0%J?ZGJ{;Zr zaHK1${AfWz(ce_IkQ`R}+&{uT;%A%kBS>%mP3PpY-8`?cM5>nYP$RO=)y8(QzuvR>4D>v2XrG-eJP5K;27`ZTmG3dpW$Ba`p){bt-I|n!j z9SIYRFnJilRflgH0%a`6;CaD;eQGHNPsi9ZzAsM4k`8Un-Af$ZUc2B zLgvy%_=nkrj{o|e=%tL3UQH`}gBoA)hF%I0V)H1O`$Rn%>gUJ8?-mvR13J zd5ufv5e{RuHj_ZXYfyQw9{CV|ecMu}<-7D=`(V2Z2^Dvf6BAuM$?qZsk z!QJsvypuYdwo8&nAUZsTH(?GF*P5BYMiwD->}b&iMGKRj+`y5-haa;mPq%<@>mS}1 zFbEAmEEOE!fBg==GIK?u9Rc1nSHNcX-(#u29-4x-Hco&9kh)54cE*m{zeiSbl79u5 z-8$uf0RWo-KLy~X{OKSCIDCJkk$g@Y`MRJ}RFNkrppYiuWdNC&xwaoy+?+@F{kp##k_&=o$Z5@nXivP|s`1>FLdSet&_AD6-kc|b1 z0Q~9T0_^wwpW;qtAFK^*^v$i_Ti6+!zWxvXnm6-L3?O@gKSrhhkVW$k*h`CECrf<6 z4HEqUd!0J*b#q?J{Js$6x&I*iMfCS|@z-LyFU2W&UW)%Y8|Z7oYdzE#LNVVTglDhy zU#O%06ZyBo=*#hi|6h?`^hWN0|DJpx_HW29YJLBnd?EgC z$S?YL|DOCy;@^;86y;u%U#qgce5Bt<{SEm~#{O(0uW_%%lU{J8a{mSQY|gKFuXS5q zcs@%1h4;7Zd#&;C!pm3tXWp~nzHZ*@jpr{o9j$-HJzMK*-0N+fFF0BKf5ttV=xf~T zOu@cJXX$uW_$eA-v$+J^zIJ&s_N*V~l6$pJvSe_Tv6} z-u;EV>Ge0{*UaAy<$Z(l9G?E)v3uhGPs8`g_dN>y6Yl?rVg)jjsW(gLp51$NvCch4fw%UOQ7SgvQuEn(!CbN=_0C5Hkb