Author: tilman Date: Wed May 22 11:34:48 2024 New Revision: 1917892 URL: http://svn.apache.org/viewvc?rev=1917892&view=rev Log: PDFBOX-5826: check for /Type and /Subtype in metadata
Modified: pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java Modified: pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java URL: http://svn.apache.org/viewvc/pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java?rev=1917892&r1=1917891&r2=1917892&view=diff ============================================================================== --- pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java (original) +++ pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java Wed May 22 11:34:48 2024 @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import org.apache.pdfbox.cos.COSBase; +import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.pdmodel.PDDocument; @@ -65,7 +66,7 @@ public class MetadataValidationProcess e XMPMetadata metadata; DomXmpParser builder = new DomXmpParser(); - try (InputStream is = getXpacket(document)) + try (InputStream is = getXpacket(document, ctx)) { metadata = builder.parse(is); } @@ -253,7 +254,7 @@ public class MetadataValidationProcess e /** * Return the xpacket from the dictionary's stream */ - private static InputStream getXpacket(PDDocument document) + private InputStream getXpacket(PDDocument document, PreflightContext ctx) throws IOException, XpacketParsingException { PDDocumentCatalog catalog = document.getDocumentCatalog(); @@ -274,7 +275,8 @@ public class MetadataValidationProcess e throw new XpacketParsingException("Failed while retrieving xpacket", error); } - if (metadata.getCOSObject().containsKey(COSName.FILTER)) + COSDictionary metadataDict = metadata.getCOSObject(); + if (metadataDict.containsKey(COSName.FILTER)) { // filter key should not be defined ValidationError error = new ValidationError( @@ -282,6 +284,18 @@ public class MetadataValidationProcess e "Filter specified in metadata dictionary"); throw new XpacketParsingException("Failed while retrieving xpacket", error); } + String type = metadataDict.getNameAsString(COSName.TYPE); + if (!"Metadata".equals(type)) + { + addValidationError(ctx, new ValidationError(PreflightConstants.ERROR_METADATA_FORMAT, + "Missing or wrong /Type key in Metadata stream dictionary")); + } + String subType = metadataDict.getNameAsString(COSName.SUBTYPE); + if (!"XML".equals(subType)) + { + addValidationError(ctx, new ValidationError(PreflightConstants.ERROR_METADATA_FORMAT, + "Missing or wrong /Subtype key in Metadata stream dictionary")); + } return metadata.exportXMPMetadata(); }