summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNelson Benítez León <nbenitezl@gmail.com>2022-01-08 13:24:41 -0400
committerAlbert Astals Cid <tsdgeos@yahoo.es>2022-01-16 11:08:14 +0000
commit90d1dd7bae03b9af063554f240d0f684912755c0 (patch)
tree902400578f35920db8407ed657a8c7a93e77633f
parent4d921bd83945b803f1ea3724d1d841e2138e2a05 (diff)
glib: try with utf8 password if latin1 fails
when opening encrypted files in below functions. poppler_document_new_from_file(): poppler_document_new_from_data(): poppler_document_new_from_bytes(): poppler_document_new_from_stream(): poppler_document_new_from_fd(): Poppler-glib converts password to latin1 before opening, but as shown in issue #824 there could be files encrypted with a UTF8 password, and other pdf viewers handle this well, so let's do the same and try with UTF-8 if latin1 fails. Note: we originally receive the password in UTF-8 from GTK. Thanks @aacid for clue about how this was fixed in Okular side. Fixes issue #824
-rw-r--r--glib/poppler-document.cc47
1 files changed, 47 insertions, 0 deletions
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index 6a226919..7c275454 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -214,11 +214,26 @@ PopplerDocument *poppler_document_new_from_file(const char *uri, const char *pas
length = MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, length);
newDoc = new PDFDoc(filenameW, length, password_g, password_g);
+ if (!newDoc->isOk() && newDoc->getErrorCode() == errEncrypted && password) {
+ /* Try again with original password (which comes from GTK in UTF8) Issue #824 */
+ delete newDoc;
+ delete password_g;
+ password_g = new GooString(password);
+ newDoc = new PDFDoc(filenameW, length, password_g, password_g);
+ }
delete[] filenameW;
#else
GooString *filename_g;
filename_g = new GooString(filename);
newDoc = new PDFDoc(filename_g, password_g, password_g);
+ if (!newDoc->isOk() && newDoc->getErrorCode() == errEncrypted && password) {
+ /* Try again with original password (which comes from GTK in UTF8) Issue #824 */
+ filename_g = filename_g->copy();
+ delete newDoc;
+ delete password_g;
+ password_g = new GooString(password);
+ newDoc = new PDFDoc(filename_g, password_g, password_g);
+ }
#endif
g_free(filename);
@@ -260,6 +275,14 @@ PopplerDocument *poppler_document_new_from_data(char *data, int length, const ch
password_g = poppler_password_to_latin1(password);
newDoc = new PDFDoc(str, password_g, password_g);
+ if (!newDoc->isOk() && newDoc->getErrorCode() == errEncrypted && password) {
+ /* Try again with original password (which comes from GTK in UTF8) Issue #824 */
+ str = dynamic_cast<MemStream *>(str->copy());
+ delete newDoc;
+ delete password_g;
+ password_g = new GooString(password);
+ newDoc = new PDFDoc(str, password_g, password_g);
+ }
delete password_g;
return _poppler_document_new_from_pdfdoc(std::move(initer), newDoc, error);
@@ -308,6 +331,14 @@ PopplerDocument *poppler_document_new_from_bytes(GBytes *bytes, const char *pass
password_g = poppler_password_to_latin1(password);
newDoc = new PDFDoc(str, password_g, password_g);
+ if (!newDoc->isOk() && newDoc->getErrorCode() == errEncrypted && password) {
+ /* Try again with original password (which comes from GTK in UTF8) Issue #824 */
+ str = dynamic_cast<BytesStream *>(str->copy());
+ delete newDoc;
+ delete password_g;
+ password_g = new GooString(password);
+ newDoc = new PDFDoc(str, password_g, password_g);
+ }
delete password_g;
return _poppler_document_new_from_pdfdoc(std::move(initer), newDoc, error);
@@ -368,6 +399,14 @@ PopplerDocument *poppler_document_new_from_stream(GInputStream *stream, goffset
password_g = poppler_password_to_latin1(password);
newDoc = new PDFDoc(str, password_g, password_g);
+ if (!newDoc->isOk() && newDoc->getErrorCode() == errEncrypted && password) {
+ /* Try again with original password (which comes from GTK in UTF8) Issue #824 */
+ str = str->copy();
+ delete newDoc;
+ delete password_g;
+ password_g = new GooString(password);
+ newDoc = new PDFDoc(str, password_g, password_g);
+ }
delete password_g;
return _poppler_document_new_from_pdfdoc(std::move(initer), newDoc, error);
@@ -488,6 +527,14 @@ PopplerDocument *poppler_document_new_from_fd(int fd, const char *password, GErr
password_g = poppler_password_to_latin1(password);
newDoc = new PDFDoc(stream, password_g, password_g);
+ if (!newDoc->isOk() && newDoc->getErrorCode() == errEncrypted && password) {
+ /* Try again with original password (which comes from GTK in UTF8) Issue #824 */
+ stream = stream->copy();
+ delete newDoc;
+ delete password_g;
+ password_g = new GooString(password);
+ newDoc = new PDFDoc(stream, password_g, password_g);
+ }
delete password_g;
return _poppler_document_new_from_pdfdoc(std::move(initer), newDoc, error);