From 9719a36dab8a7adf7254e3761d5aa77e9b2b9260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Casaj=C3=BAs?= Date: Wed, 6 Mar 2024 16:26:10 +0100 Subject: [PATCH] Do not replace unsubs that go to UNSUBSCRIBER (#2051) --- app/handler/unsubscribe_generator.py | 6 ++++++ tests/handler/test_unsubscribe_generator.py | 23 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/handler/unsubscribe_generator.py b/app/handler/unsubscribe_generator.py index 84bb14bf..b4737d66 100644 --- a/app/handler/unsubscribe_generator.py +++ b/app/handler/unsubscribe_generator.py @@ -3,6 +3,7 @@ from email.header import Header from email.message import Message from app.email import headers +from app import config from app.email_utils import add_or_replace_header, delete_header from app.handler.unsubscribe_encoder import ( UnsubscribeEncoder, @@ -47,6 +48,11 @@ class UnsubscribeGenerator: method = raw_method[start + 1 : end] url_data = urllib.parse.urlparse(method) if url_data.scheme == "mailto": + if url_data.path == config.UNSUBSCRIBER: + LOG.debug( + f"Skipping replacing unsubscribe since the original email already points to {config.UNSUBSCRIBER}" + ) + return message query_data = urllib.parse.parse_qs(url_data.query) mailto_unsubs = (url_data.path, query_data.get("subject", [""])[0]) LOG.debug(f"Unsub is mailto to {mailto_unsubs}") diff --git a/tests/handler/test_unsubscribe_generator.py b/tests/handler/test_unsubscribe_generator.py index 70dde9ba..a08a9227 100644 --- a/tests/handler/test_unsubscribe_generator.py +++ b/tests/handler/test_unsubscribe_generator.py @@ -13,8 +13,7 @@ from app.handler.unsubscribe_encoder import ( ) from app.handler.unsubscribe_generator import UnsubscribeGenerator from app.models import Alias, Contact, UnsubscribeBehaviourEnum -from tests.utils import create_new_user - +from tests.utils import create_new_user, random_email TEST_UNSUB_EMAIL = "unsub@sl.com" @@ -204,3 +203,23 @@ def test_unsub_preserve_original( assert message[headers.LIST_UNSUBSCRIBE_POST] is None else: assert "List-Unsubscribe=One-Click" == message[headers.LIST_UNSUBSCRIBE_POST] + + +def test_unsub_preserves_sl_unsubscriber(): + user = create_new_user() + user.unsub_behaviour = UnsubscribeBehaviourEnum.PreserveOriginal + alias = Alias.create_new_random(user) + Session.commit() + config.UNSUBSCRIBER = random_email() + contact = Contact.create( + user_id=user.id, + alias_id=alias.id, + website_email="contact@example.com", + reply_email="rep@sl.local", + commit=True, + ) + message = Message() + original_header = f"" + message[headers.LIST_UNSUBSCRIBE] = original_header + message = UnsubscribeGenerator().add_header_to_message(alias, contact, message) + assert original_header == message[headers.LIST_UNSUBSCRIBE]