From 091ff3ad2c9c6803b9e4b2bd0a8a2f553130fb7f Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Fri, 18 Dec 2020 10:43:06 +0100 Subject: [PATCH 1/2] Add decode_text() --- app/email_utils.py | 11 +++++++++++ tests/test_email_utils.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/app/email_utils.py b/app/email_utils.py index 8ebb2f1a..3855c915 100644 --- a/app/email_utils.py +++ b/app/email_utils.py @@ -746,6 +746,17 @@ def encode_text(text: str, encoding: EmailEncoding = EmailEncoding.NO) -> str: return text +def decode_text(text: str, encoding: EmailEncoding = EmailEncoding.NO) -> str: + if encoding == EmailEncoding.QUOTED: + decoded = quopri.decodestring(text.encode("utf-8")) + return str(decoded, "utf-8") + elif encoding == EmailEncoding.BASE64: + decoded = base64.b64decode(text.encode("utf-8")) + return str(decoded, "utf-8") + else: # 7bit - no encoding + return text + + def add_header(msg: Message, text_header, html_header) -> Message: if msg.get_content_type() == "text/plain": encoding = get_encoding(msg) diff --git a/tests/test_email_utils.py b/tests/test_email_utils.py index 99a47bc7..89e1c1f5 100644 --- a/tests/test_email_utils.py +++ b/tests/test_email_utils.py @@ -23,6 +23,7 @@ from app.email_utils import ( EmailEncoding, replace, should_disable, + decode_text, ) from app.extensions import db from app.models import User, CustomDomain, Alias, Contact, EmailLog @@ -554,6 +555,33 @@ def test_encode_text(): assert encode_text("mèo méo", EmailEncoding.QUOTED) == "m=C3=A8o m=C3=A9o" +def test_decode_text(): + assert decode_text("") == "" + assert decode_text("ascii") == "ascii" + + assert ( + decode_text(encode_text("ascii", EmailEncoding.BASE64), EmailEncoding.BASE64) + == "ascii" + ) + assert ( + decode_text( + encode_text("mèo méo 🇪🇺", EmailEncoding.BASE64), EmailEncoding.BASE64 + ) + == "mèo méo 🇪🇺" + ) + + assert ( + decode_text(encode_text("ascii", EmailEncoding.QUOTED), EmailEncoding.QUOTED) + == "ascii" + ) + assert ( + decode_text( + encode_text("mèo méo 🇪🇺", EmailEncoding.QUOTED), EmailEncoding.QUOTED + ) + == "mèo méo 🇪🇺" + ) + + def test_should_disable(flask_client): user = User.create( email="a@b.c", From fb8a43fd5d4bb87a90ab7b6e4fa4812df3dffba6 Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Fri, 18 Dec 2020 10:44:42 +0100 Subject: [PATCH 2/2] use decode_text() in add_header() --- app/email_utils.py | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/app/email_utils.py b/app/email_utils.py index 3855c915..795d46a7 100644 --- a/app/email_utils.py +++ b/app/email_utils.py @@ -763,36 +763,30 @@ def add_header(msg: Message, text_header, html_header) -> Message: payload = msg.get_payload() if type(payload) is str: clone_msg = copy(msg) - to_append = encode_text(f"{text_header}\n---\n", encoding) - payload = f"{to_append}{payload}" - clone_msg.set_payload(payload) + new_payload = f"""{text_header} +--- +{decode_text(payload, encoding)}""" + clone_msg.set_payload(encode_text(new_payload, encoding)) return clone_msg elif msg.get_content_type() == "text/html": encoding = get_encoding(msg) payload = msg.get_payload() if type(payload) is str: - new_payload = ( - encode_text( - f""" - + new_payload = f"""
- +
{html_header}
""", - encoding, - ) - + payload - + encode_text( - """ + {decode_text(payload, encoding)} +
- """, - encoding, - ) - ) +""" + clone_msg = copy(msg) - clone_msg.set_payload(new_payload) + clone_msg.set_payload(encode_text(new_payload, encoding)) return clone_msg elif msg.get_content_type() in ("multipart/alternative", "multipart/related"): new_parts = []