Skip to content

Commit 306aa79

Browse files
Fix encryption support
Reading password-encrypted files was broken in RUPS due to changes in the way PdfReaders are initialised in iText 7. This commit resolves that issue. RES-385
1 parent b46069e commit 306aa79

File tree

1 file changed

+45
-27
lines changed

1 file changed

+45
-27
lines changed

src/main/java/com/itextpdf/rups/model/PdfFile.java

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ This file is part of the iText (R) project.
5151

5252
import javax.swing.*;
5353
import java.io.*;
54+
import java.nio.charset.StandardCharsets;
5455

5556
/**
5657
* Wrapper for both iText's PdfReader (referring to a PDF file to read)
@@ -124,6 +125,24 @@ public PdfFile(byte[] file, boolean readOnly) throws IOException, PdfException {
124125
}
125126
}
126127

128+
private static byte[] requestPassword() {
129+
final JPasswordField passwordField = new JPasswordField(32);
130+
131+
JOptionPane pane = new JOptionPane(passwordField, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) {
132+
private static final long serialVersionUID = 3695604506510737289L;
133+
134+
@Override
135+
public void selectInitialValue() {
136+
passwordField.requestFocusInWindow();
137+
}
138+
};
139+
140+
pane.createDialog(null, "Enter the User or Owner Password of this PDF file").setVisible(true);
141+
142+
// TODO RES-427: SASLprep & truncate this
143+
return new String(passwordField.getPassword()).getBytes(StandardCharsets.UTF_8);
144+
}
145+
127146
/**
128147
* Does the actual reading of the file into PdfReader and PDFFile.
129148
*
@@ -138,42 +157,41 @@ protected void readFile(InputStream fis, boolean checkPass, boolean readOnly) th
138157
PdfReader reader;
139158
PdfWriter writer;
140159
permissions = new Permissions();
160+
ReaderProperties readerProps = new ReaderProperties();
161+
final byte[] password;
141162
if (checkPass) {
142-
final JPasswordField passwordField = new JPasswordField(32);
143-
144-
JOptionPane pane = new JOptionPane(passwordField, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) {
145-
private static final long serialVersionUID = 3695604506510737289L;
146-
147-
@Override
148-
public void selectInitialValue() {
149-
passwordField.requestFocusInWindow();
150-
}
151-
};
152-
153-
pane.createDialog(null, "Enter the User or Owner Password of this PDF file").setVisible(true);
154-
155-
byte[] password = new String(passwordField.getPassword()).getBytes();
156-
reader = new PdfReader(fis, new ReaderProperties().setPassword(password));
157-
permissions.setEncrypted(true);
158-
permissions.setCryptoMode(reader.getCryptoMode());
159-
permissions.setPermissions((int) reader.getPermissions());
160-
if (reader.isOpenedWithFullPermission()) {
161-
permissions.setOwnerPassword(password);
162-
permissions.setUserPassword(reader.computeUserPassword());
163-
} else {
164-
JOptionPane.showMessageDialog(null, "You opened the document using the user password instead of the owner password.");
165-
}
163+
password = requestPassword();
164+
readerProps.setPassword(password);
166165
} else {
167-
reader = new PdfReader(fis);
168-
permissions.setEncrypted(false);
166+
password = null;
169167
}
168+
reader = new PdfReader(fis, readerProps);
170169
baos = new ByteArrayOutputStream();
171170
if (readOnly) {
172171
document = new PdfDocument(reader);
173172
} else {
174-
writer = new PdfWriter(baos); //TODO: change writer mechanism
173+
writer = new PdfWriter(baos);
175174
document = new PdfDocument(reader, writer);
176175
}
176+
// we have some extra work to do if the document was encrypted
177+
if(reader.isEncrypted()) {
178+
permissions.setEncrypted(true);
179+
permissions.setCryptoMode(reader.getCryptoMode());
180+
permissions.setPermissions((int) reader.getPermissions());
181+
if(password != null) {
182+
if (reader.isOpenedWithFullPermission()) {
183+
permissions.setOwnerPassword(password);
184+
permissions.setUserPassword(reader.computeUserPassword());
185+
} else {
186+
JOptionPane.showMessageDialog(
187+
null,
188+
"You opened the document using the user password instead of the owner password.");
189+
}
190+
}
191+
} else {
192+
permissions.setEncrypted(false);
193+
}
194+
177195
}
178196

179197
/**

0 commit comments

Comments
 (0)