From b0e42ee5c4235ac9cf4ef3ade951cb9b83203a3c Mon Sep 17 00:00:00 2001 From: Anderson Costa Date: Thu, 28 Sep 2023 18:37:22 -0400 Subject: [PATCH 1/5] Fix encryption of string containing non-latin char --- CHANGELOG.md | 1 + fpdf/encryption.py | 8 +++++++- test/encryption/encryption_unicode.pdf | Bin 0 -> 13482 bytes test/encryption/test_encryption.py | 17 +++++++++++++++++ test/fonts/Garuda.ttf | Bin 0 -> 57324 bytes 5 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/encryption/encryption_unicode.pdf create mode 100644 test/fonts/Garuda.ttf diff --git a/CHANGELOG.md b/CHANGELOG.md index dd593b038..b2a5374ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ This change was made for consistency between row-height governed by text or imag * Edge case when parsing a Markdown link followed by a newline - _cf._ issue [#916](https://github.com/py-pdf/fpdf2/issues/916), and when bold/italics/underline markers are repeated * Zoom not set correctly when a numeric value was set in [`set_display_mode()`](https://py-pdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.set_display_mode) - _cf._ issue [#926](https://github.com/py-pdf/fpdf2/issues/926) * [`FPDF.table()`](https://py-pdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.table): images no longer overlap with cell borders - _cf._ issue [#892](https://github.com/py-pdf/fpdf2/issues/892) +* Encryption of strings containing non-latin characters - __cf.__ issue [#933](https://github.com/py-pdf/fpdf2/issues/933) ## [2.7.5] - 2023-08-04 ### Added diff --git a/fpdf/encryption.py b/fpdf/encryption.py index f4b872cb9..46201cb82 100644 --- a/fpdf/encryption.py +++ b/fpdf/encryption.py @@ -11,6 +11,8 @@ import math import stringprep import unicodedata +from binascii import hexlify +from codecs import BOM_UTF16_BE from os import urandom from typing import Callable, Iterable, Type, Union @@ -220,7 +222,11 @@ def encrypt_string(self, string: str, obj_id: int) -> str: if self.encryption_method == EncryptionMethod.NO_ENCRYPTION: return PDFString(string, encrypt=False).serialize() LOGGER.debug("Encrypting string: %s", string) - return f"<{bytes(self.encrypt_bytes(string.encode('latin-1'), obj_id)).hex().upper()}>" + try: + string.encode("latin-1") + return f"<{bytes(self.encrypt_bytes(string.encode('latin-1'), obj_id)).hex().upper()}>" + except: + return f'<{hexlify(bytearray(self.encrypt_bytes(BOM_UTF16_BE + string.encode("utf-16-be"), obj_id))).decode("latin-1")}>' def encrypt_stream(self, stream: bytes, obj_id: int) -> bytes: if self.encryption_method == EncryptionMethod.NO_ENCRYPTION: diff --git a/test/encryption/encryption_unicode.pdf b/test/encryption/encryption_unicode.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a260d4cf9787caa5711823512e5aee68ce7047a5 GIT binary patch literal 13482 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 literal 0 HcmV?d00001 diff --git a/test/encryption/test_encryption.py b/test/encryption/test_encryption.py index d41fd8389..0e2ded99a 100644 --- a/test/encryption/test_encryption.py +++ b/test/encryption/test_encryption.py @@ -293,3 +293,20 @@ def test_password_prep(): with pytest.raises(FPDFException) as e: sh.prepare_string("\u0627\x31") # Error - bidirectional check assert sh.prepare_string("A" * 300) == b"A" * 127 # test cap 127 chars + + +def test_encryption_unicode(tmp_path): + "Issue #993" + pdf = FPDF() + pdf.set_author("Thai") + pdf.set_subject("ทดสอบภาษาไทย") + pdf.add_page() + pdf.set_text_shaping() + pdf.add_font("Garuda", fname=HERE.parent / "fonts" / "Garuda.ttf") + pdf.set_font("Garuda", size=12) + pdf.start_section("ทดสอบภาษาไทย") + pdf.cell( + txt="สวัสดี ทดสอบภาษาไทย กีกี้ กาก้า ก๋า อ้า อ้ำ ฤาษี ทุ่มทุน อุ้งอุ๋ง น้ำใจ ฯลฯ ญาญ่า ฐาน ฎีกา ฏฒัฯนณ ภัทร์ สิทธิ์" + ) + pdf.set_encryption(owner_password="fpdf2") + assert_pdf_equal(pdf, HERE / "encryption_unicode.pdf", tmp_path, generate=True) diff --git a/test/fonts/Garuda.ttf b/test/fonts/Garuda.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b9fcdfd90e111c6d09bd19bb11d5c283c3ff14e3 GIT binary patch literal 57324 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 R(zDmg$ks!8?u(}A{{nc`th4|C literal 0 HcmV?d00001 From cfa07c7c7d261bf2092a1f84516d491961c682c9 Mon Sep 17 00:00:00 2001 From: Anderson Costa Date: Thu, 28 Sep 2023 18:40:20 -0400 Subject: [PATCH 2/5] fix comment --- test/encryption/test_encryption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/encryption/test_encryption.py b/test/encryption/test_encryption.py index 0e2ded99a..1fc44e5d0 100644 --- a/test/encryption/test_encryption.py +++ b/test/encryption/test_encryption.py @@ -296,7 +296,7 @@ def test_password_prep(): def test_encryption_unicode(tmp_path): - "Issue #993" + "Issue #933" pdf = FPDF() pdf.set_author("Thai") pdf.set_subject("ทดสอบภาษาไทย") From 89b9f2b8e7e54a15681a16d9280e061fd318b73c Mon Sep 17 00:00:00 2001 From: Anderson Costa Date: Thu, 28 Sep 2023 18:46:50 -0400 Subject: [PATCH 3/5] remove missed generate --- test/encryption/test_encryption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/encryption/test_encryption.py b/test/encryption/test_encryption.py index 1fc44e5d0..18b1bce47 100644 --- a/test/encryption/test_encryption.py +++ b/test/encryption/test_encryption.py @@ -309,4 +309,4 @@ def test_encryption_unicode(tmp_path): txt="สวัสดี ทดสอบภาษาไทย กีกี้ กาก้า ก๋า อ้า อ้ำ ฤาษี ทุ่มทุน อุ้งอุ๋ง น้ำใจ ฯลฯ ญาญ่า ฐาน ฎีกา ฏฒัฯนณ ภัทร์ สิทธิ์" ) pdf.set_encryption(owner_password="fpdf2") - assert_pdf_equal(pdf, HERE / "encryption_unicode.pdf", tmp_path, generate=True) + assert_pdf_equal(pdf, HERE / "encryption_unicode.pdf", tmp_path) From 493aeac60686fb1ecaa746abfaeecf1812855546 Mon Sep 17 00:00:00 2001 From: Anderson Costa Date: Thu, 28 Sep 2023 18:51:40 -0400 Subject: [PATCH 4/5] please pylint --- fpdf/encryption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fpdf/encryption.py b/fpdf/encryption.py index 46201cb82..c2af31ac8 100644 --- a/fpdf/encryption.py +++ b/fpdf/encryption.py @@ -225,7 +225,7 @@ def encrypt_string(self, string: str, obj_id: int) -> str: try: string.encode("latin-1") return f"<{bytes(self.encrypt_bytes(string.encode('latin-1'), obj_id)).hex().upper()}>" - except: + except UnicodeEncodeError: return f'<{hexlify(bytearray(self.encrypt_bytes(BOM_UTF16_BE + string.encode("utf-16-be"), obj_id))).decode("latin-1")}>' def encrypt_stream(self, stream: bytes, obj_id: int) -> bytes: From 774baae5ba7315d50990a9bce276808ea0d920b0 Mon Sep 17 00:00:00 2001 From: Anderson Costa Date: Thu, 28 Sep 2023 18:59:16 -0400 Subject: [PATCH 5/5] add ref file for new font --- test/fonts/charmap_first_999_chars-Garuda.pdf | Bin 0 -> 46876 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fonts/charmap_first_999_chars-Garuda.pdf diff --git a/test/fonts/charmap_first_999_chars-Garuda.pdf b/test/fonts/charmap_first_999_chars-Garuda.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3c0c4b1c30c13f720ae72a7fbecbc18532d7bba GIT binary patch literal 46876 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 literal 0 HcmV?d00001