Wrong RevisionNumber when disabling all permissions and using 128bit encryption
-------------------------------------------------------------------------------
Key: PDFBOX-837
URL: https://issues.apache.org/jira/browse/PDFBOX-837
Project: PDFBox
Issue Type: Bug
Components: PDModel
Affects Versions: 1.2.1
Reporter: Bernd Engelhardt
When disabling all permissions and using a 128bit encryption the following
exception is thrown when saving the PDF document:
org.apache.pdfbox.exceptions.COSVisitorException: Error: Expected length=5
actual=16
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1022)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:911)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:892)
at pdfbox.Main.main(Main.java:53)
This is reproducable with the following code:
public class Main {
public static void main(String[] args) {
try {
AccessPermission ap = new AccessPermission();
StandardProtectionPolicy spp = null;
ap.setCanAssembleDocument(false);
ap.setCanExtractContent(false);
ap.setCanExtractForAccessibility(false);
ap.setCanFillInForm(false);
ap.setCanModify(false);
ap.setCanModifyAnnotations(false);
ap.setCanPrint(false);
ap.setCanPrintDegraded(false);
spp = new StandardProtectionPolicy(null, null, ap);
spp.setEncryptionKeyLength(128);
PDDocument document = null;
FileInputStream sourceFile = new FileInputStream(new
File("C:\\Web\\NetBeansProjects\\pdfBox\\test.pdf"));
document = PDDocument.load(sourceFile);
document.protect(spp);
document.save("C:\\Web\\NetBeansProjects\\pdfBox\\test_encrypted.pdf");
document.close();
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
The problem is based on "computeRevisionNumber" in
"StandardSecurityHandler.java". If all flags are disabled, the routine returns
a value of 2. But if the 128bit encryption is enabled, the revision should be
3. If not, the method "computeUserPassword" will fail.
A solution would be to check the key length in "computeRevisionNumber".
private int computeRevisionNumber()
{
if(version == 2
&& !policy.getPermissions().canFillInForm()
&& !policy.getPermissions().canExtractForAccessibility()
&& !policy.getPermissions().canPrintDegraded()
&& keyLength == 40 )
{
return 2;
}
return 3;
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.