diff options
author | Nelson Benítez León <nbenitezl@gmail.com> | 2022-01-08 13:24:41 -0400 |
---|---|---|
committer | Albert Astals Cid <tsdgeos@yahoo.es> | 2022-01-16 11:08:14 +0000 |
commit | 90d1dd7bae03b9af063554f240d0f684912755c0 (patch) | |
tree | 902400578f35920db8407ed657a8c7a93e77633f | |
parent | 4d921bd83945b803f1ea3724d1d841e2138e2a05 (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.cc | 47 |
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); |