Skip to content

Commit 17a166c

Browse files
committed
Correct XMP RDF container validation
DEVSIX-9031
1 parent 41a8cfb commit 17a166c

File tree

2 files changed

+162
-2
lines changed

2 files changed

+162
-2
lines changed

kernel/src/main/java/com/itextpdf/kernel/xmp/impl/XMPNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -917,7 +917,7 @@ private XMPNode find(List list, String expr)
917917
*/
918918
private void assertChildNotExisting(String childName) throws XMPException
919919
{
920-
if (!XMPConst.ARRAY_ITEM_NAME.equals(childName) &&
920+
if (!getOptions().isArray() &&
921921
findChildByName(childName) != null)
922922
{
923923
throw new XMPException("Duplicate property or field node '" + childName + "'",

kernel/src/test/java/com/itextpdf/kernel/pdf/XMPMetadataTest.java

Lines changed: 161 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ This file is part of the iText (R) project.
3131
import com.itextpdf.kernel.xmp.XMPMetaFactory;
3232
import com.itextpdf.kernel.xmp.XMPUtils;
3333
import com.itextpdf.kernel.xmp.options.SerializeOptions;
34+
import com.itextpdf.test.AssertUtil;
3435
import com.itextpdf.test.ExtendedITextTest;
3536
import com.itextpdf.test.TestUtil;
3637
import com.itextpdf.test.annotations.LogMessage;
@@ -62,7 +63,7 @@ public static void beforeClass() {
6263
public static void afterClass() {
6364
CompareTool.cleanup(DESTINATION_FOLDER);
6465
}
65-
66+
6667
@Test
6768
public void createEmptyDocumentWithXmp() throws Exception {
6869
String filename = "emptyDocumentWithXmp.pdf";
@@ -259,4 +260,163 @@ private byte[] removeAlwaysDifferentEntries(byte[] cmpBytes) throws XMPException
259260
cmpBytes = XMPMetaFactory.serializeToBuffer(xmpMeta, new SerializeOptions(SerializeOptions.SORT));
260261
return cmpBytes;
261262
}
263+
264+
@Test
265+
public void bagParsingTest() {
266+
String xmp = "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 6.0-c006 79.dabacbb, "
267+
+ "2021/04/14-00:39:44 \">\n"
268+
+ " <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n"
269+
+ " <rdf:Description rdf:about=\"\"\n"
270+
+ " xmlns:photoshop=\"http://ns.adobe.com/photoshop/1.0/\"\n"
271+
+ " xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n"
272+
+ " xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n"
273+
+ " xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n"
274+
+ " xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n"
275+
+ " xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\"\n"
276+
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"
277+
+ " xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\">\n"
278+
+ " <photoshop:LegacyIPTCDigest>CDCFFA7DA8C7BE09057076AEAF05C34E</photoshop:LegacyIPTCDigest>\n"
279+
+ " <photoshop:ColorMode>3</photoshop:ColorMode>\n"
280+
+ " <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile>\n"
281+
+ " <photoshop:DocumentAncestors>\n"
282+
+ " <rdf:Bag>\n"
283+
+ " <rdf:li>78274CCED3154607AD19599D29855E30</rdf:li>\n"
284+
+ " <rdf:li>A61D41481CEE4032AE7A116AD6C942DC</rdf:li>\n"
285+
+ " <rdf:li>A2A26CD02B014819824FC4314B4152FF</rdf:li>\n"
286+
+ " <rdf:li>425FC234DCE84124A5EEAF17C69CCC62</rdf:li>\n"
287+
+ " <rdf:li>D2B4867567A547EA9F87B476EB21147E</rdf:li>\n"
288+
+ " <rdf:li>CE995EEDAD734D029F9B27AD04BA7052</rdf:li>\n"
289+
+ " <rdf:li>E754B36AD97E49EAABC7E8F7CEA30696</rdf:li>\n"
290+
+ " <rdf:li>713B782250904422BDDCAD1723C25C3C</rdf:li>\n"
291+
+ " <rdf:li>DC818BB5F9F1421C87DA05C97DEEB2CF</rdf:li>\n"
292+
+ " \n"
293+
+ " <rdf:li>D2B4867567A547EA9F87B476EB21147E</rdf:li>\n"
294+
+ " <rdf:li>CE995EEDAD734D029F9B27AD04BA7052</rdf:li>\n"
295+
+ " <rdf:li>E754B36AD97E49EAABC7E8F7CEA30696</rdf:li>\n"
296+
+ " <rdf:li>713B782250904422BDDCAD1723C25C3C</rdf:li>\n"
297+
+ " <rdf:li>DC818BB5F9F1421C87DA05C97DEEB2CF</rdf:li>\n"
298+
+ " </rdf:Bag>\n"
299+
+ " </photoshop:DocumentAncestors> \n"
300+
+ " </rdf:Description>\n"
301+
+ " </rdf:RDF>\n"
302+
+ "</x:xmpmeta>";
303+
304+
AssertUtil.doesNotThrow(
305+
() -> XMPMetaFactory.parseFromBuffer(xmp.getBytes(StandardCharsets.UTF_8)));
306+
}
307+
308+
309+
@Test
310+
public void altParsingTest() {
311+
String xmp = "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 6.0-c006 79.dabacbb, "
312+
+ "2021/04/14-00:39:44 \">\n"
313+
+ " <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n"
314+
+ " <rdf:Description rdf:about=\"\"\n"
315+
+ " xmlns:photoshop=\"http://ns.adobe.com/photoshop/1.0/\"\n"
316+
+ " xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n"
317+
+ " xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n"
318+
+ " xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n"
319+
+ " xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n"
320+
+ " xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\"\n"
321+
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"
322+
+ " xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\">\n"
323+
+ " <photoshop:LegacyIPTCDigest>CDCFFA7DA8C7BE09057076AEAF05C34E</photoshop:LegacyIPTCDigest>\n"
324+
+ " <photoshop:ColorMode>3</photoshop:ColorMode>\n"
325+
+ " <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile>\n"
326+
+ " <photoshop:DocumentAncestors>\n"
327+
+ " <rdf:Alt>\n"
328+
+ " <rdf:li>0006528E7FAD8C1170BB8605BDABA5EC</rdf:li>\n"
329+
+ " <rdf:li>00072919E3FCD9243A279B11FA36E751</rdf:li>\n"
330+
+ " <rdf:li>D2B4867567A547EA9F87B476EB21147E</rdf:li>\n"
331+
+ " <rdf:li>CE995EEDAD734D029F9B27AD04BA7052</rdf:li>\n"
332+
+ " <rdf:li>E754B36AD97E49EAABC7E8F7CEA30696</rdf:li>\n"
333+
+ " <rdf:li>713B782250904422BDDCAD1723C25C3C</rdf:li>\n"
334+
+ " <rdf:li>DC818BB5F9F1421C87DA05C97DEEB2CF</rdf:li>\n"
335+
+ " \n"
336+
+ " <rdf:li>D2B4867567A547EA9F87B476EB21147E</rdf:li>\n"
337+
+ " <rdf:li>CE995EEDAD734D029F9B27AD04BA7052</rdf:li>\n"
338+
+ " <rdf:li>E754B36AD97E49EAABC7E8F7CEA30696</rdf:li>\n"
339+
+ " <rdf:li>713B782250904422BDDCAD1723C25C3C</rdf:li>\n"
340+
+ " <rdf:li>DC818BB5F9F1421C87DA05C97DEEB2CF</rdf:li>\n"
341+
+ " </rdf:Alt>\n"
342+
+ " </photoshop:DocumentAncestors> \n"
343+
+ " </rdf:Description>\n"
344+
+ " </rdf:RDF>\n"
345+
+ "</x:xmpmeta>";
346+
347+
AssertUtil.doesNotThrow(
348+
() -> XMPMetaFactory.parseFromBuffer(xmp.getBytes(StandardCharsets.UTF_8)));
349+
}
350+
351+
352+
@Test
353+
public void seqParsingTest() {
354+
String xmp = "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 6.0-c006 79.dabacbb, "
355+
+ "2021/04/14-00:39:44 \">\n"
356+
+ " <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n"
357+
+ " <rdf:Description rdf:about=\"\"\n"
358+
+ " xmlns:photoshop=\"http://ns.adobe.com/photoshop/1.0/\"\n"
359+
+ " xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n"
360+
+ " xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n"
361+
+ " xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n"
362+
+ " xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n"
363+
+ " xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\"\n"
364+
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"
365+
+ " xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\">\n"
366+
+ " <photoshop:LegacyIPTCDigest>CDCFFA7DA8C7BE09057076AEAF05C34E</photoshop:LegacyIPTCDigest>\n"
367+
+ " <photoshop:ColorMode>3</photoshop:ColorMode>\n"
368+
+ " <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile>\n"
369+
+ " <photoshop:DocumentAncestors>\n"
370+
+ " <rdf:Seq>\n"
371+
+ " <rdf:li>78274CCED3154607AD19599D29855E30</rdf:li>\n"
372+
+ " <rdf:li>A61D41481CEE4032AE7A116AD6C942DC</rdf:li>\n"
373+
+ " <rdf:li>A2A26CD02B014819824FC4314B4152FF</rdf:li>\n"
374+
+ " <rdf:li>425FC234DCE84124A5EEAF17C69CCC62</rdf:li>\n"
375+
+ " <rdf:li>D2B4867567A547EA9F87B476EB21147E</rdf:li>\n"
376+
+ " <rdf:li>CE995EEDAD734D029F9B27AD04BA7052</rdf:li>\n"
377+
+ " <rdf:li>E754B36AD97E49EAABC7E8F7CEA30696</rdf:li>\n"
378+
+ " <rdf:li>713B782250904422BDDCAD1723C25C3C</rdf:li>\n"
379+
+ " <rdf:li>DC818BB5F9F1421C87DA05C97DEEB2CF</rdf:li>\n"
380+
+ " \n"
381+
+ " <rdf:li>D2B4867567A547EA9F87B476EB21147E</rdf:li>\n"
382+
+ " <rdf:li>CE995EEDAD734D029F9B27AD04BA7052</rdf:li>\n"
383+
+ " <rdf:li>E754B36AD97E49EAABC7E8F7CEA30696</rdf:li>\n"
384+
+ " <rdf:li>713B782250904422BDDCAD1723C25C3C</rdf:li>\n"
385+
+ " <rdf:li>DC818BB5F9F1421C87DA05C97DEEB2CF</rdf:li>\n"
386+
+ " </rdf:Seq>\n"
387+
+ " </photoshop:DocumentAncestors> \n"
388+
+ " </rdf:Description>\n"
389+
+ " </rdf:RDF>\n"
390+
+ "</x:xmpmeta>";
391+
392+
AssertUtil.doesNotThrow(
393+
() -> XMPMetaFactory.parseFromBuffer(xmp.getBytes(StandardCharsets.UTF_8)));
394+
}
395+
396+
397+
@Test
398+
public void listParsingTest() {
399+
String xmp = "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 6.0-c006 79.dabacbb, "
400+
+ "2021/04/14-00:39:44 \">\n"
401+
+ " <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n"
402+
+ " <rdf:Description rdf:about=\"\"\n"
403+
+ " xmlns:photoshop=\"http://ns.adobe.com/photoshop/1.0/\"\n"
404+
+ " xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n"
405+
+ " xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n"
406+
+ " xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n"
407+
+ " xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n"
408+
+ " xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\"\n"
409+
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"
410+
+ " xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\">\n"
411+
+ " <photoshop:LegacyIPTCDigest>CDCFFA7DA8C7BE09057076AEAF05C34E</photoshop:LegacyIPTCDigest>\n"
412+
+ " <photoshop:ColorMode>3</photoshop:ColorMode>\n"
413+
+ " <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile>\n"
414+
+ " <photoshop:ICCProfile>sRGB IEC61966-2.2</photoshop:ICCProfile>\n"
415+
+ " </rdf:Description>\n"
416+
+ " </rdf:RDF>\n"
417+
+ "</x:xmpmeta>";
418+
419+
Assertions.assertThrows(XMPException.class,
420+
() -> XMPMetaFactory.parseFromBuffer(xmp.getBytes(StandardCharsets.UTF_8)));
421+
}
262422
}

0 commit comments

Comments
 (0)