You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/02/11 17:50:47 UTC
svn commit: r1729857 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java
Author: tilman
Date: Thu Feb 11 16:50:46 2016
New Revision: 1729857
URL: http://svn.apache.org/viewvc?rev=1729857&view=rev
Log:
PDFBOX-3229: avoid exception if metadata is not encrypted although it is expected to be
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java?rev=1729857&r1=1729856&r2=1729857&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java Thu Feb 11 16:50:46 2016
@@ -28,6 +28,7 @@ import java.security.InvalidKeyException
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -51,6 +52,7 @@ import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.util.Charsets;
/**
* A security handler as described in the PDF specifications.
@@ -414,15 +416,30 @@ public abstract class SecurityHandler
*/
public void decryptStream(COSStream stream, long objNum, long genNum) throws IOException
{
- if (!decryptMetadata && COSName.METADATA.equals(stream.getCOSName(COSName.TYPE)))
+ COSBase type = stream.getCOSName(COSName.TYPE);
+ if (!decryptMetadata && COSName.METADATA.equals(type))
{
return;
}
// "The cross-reference stream shall not be encrypted"
- if (COSName.XREF.equals(stream.getCOSName(COSName.TYPE)))
+ if (COSName.XREF.equals(type))
{
return;
}
+ if (COSName.METADATA.equals(type))
+ {
+ // PDFBOX-3229 check case where metadata is not encrypted despite /EncryptMetadata missing
+ InputStream is = stream.createRawInputStream();
+ byte buf[] = new byte[10];
+ is.read(buf);
+ is.close();
+ if (Arrays.equals(buf, "<?xpacket ".getBytes(Charsets.ISO_8859_1)))
+ {
+ LOG.warn("Metadata is not encrypted, but was expected to be");
+ LOG.warn("Read PDF specification about EncryptMetadata (default value: true)");
+ return;
+ }
+ }
decryptDictionary(stream, objNum, genNum);
byte[] encrypted = IOUtils.toByteArray(stream.createRawInputStream());
ByteArrayInputStream encryptedStream = new ByteArrayInputStream(encrypted);