diff --git a/app/handler/unsubscribe_encoder.py b/app/handler/unsubscribe_encoder.py index 6d1d5efa..8471fa8f 100644 --- a/app/handler/unsubscribe_encoder.py +++ b/app/handler/unsubscribe_encoder.py @@ -27,9 +27,7 @@ class UnsubscribeEncoder: @staticmethod def encode(action: UnsubscribeAction, data: int) -> UnsubscribeLink: if config.UNSUBSCRIBER: - return UnsubscribeLink( - UnsubscribeEncoder.encode_subject(action, data), True - ) + return UnsubscribeLink(UnsubscribeEncoder.encode_mailto(action, data), True) return UnsubscribeLink(UnsubscribeEncoder.encode_url(action, data), False) @staticmethod @@ -41,6 +39,11 @@ class UnsubscribeEncoder: if action == UnsubscribeAction.UnsubscribeNewsletter: return f"{data}*" + @staticmethod + def encode_mailto(action: UnsubscribeAction, data: int) -> str: + subject = UnsubscribeEncoder.encode_subject(action, data) + return f"mailto:{config.UNSUBSCRIBER}?subject={subject}" + @staticmethod def encode_url(action: UnsubscribeAction, data: int) -> str: if action == UnsubscribeAction.DisableAlias: diff --git a/app/models.py b/app/models.py index c1967ec9..c40ec5dd 100644 --- a/app/models.py +++ b/app/models.py @@ -892,7 +892,9 @@ class User(Base, ModelMixin, UserMixin, PasswordOracle): # use * as suffix instead of = as for alias unsubscribe return ( self.email, - f"mailto:{config.UNSUBSCRIBER}?subject={self.id}*", + UnsubscribeEncoder.encode_mailto( + UnsubscribeAction.UnsubscribeNewsletter, self.id + ), True, ) @@ -1480,22 +1482,6 @@ class Alias(Base, ModelMixin): else: return self.user.email - def unsubscribe_link(self, contact: Optional["Contact"] = None) -> (str, bool): - """ - return the unsubscribe link along with whether this is via email (mailto:) or Http POST - The mailto: method is preferred - """ - if contact: - if config.UNSUBSCRIBER: - return f"mailto:{config.UNSUBSCRIBER}?subject={contact.id}_", True - else: - return f"{config.URL}/dashboard/block_contact/{contact.id}", False - else: - if config.UNSUBSCRIBER: - return f"mailto:{config.UNSUBSCRIBER}?subject={self.id}=", True - else: - return f"{config.URL}/dashboard/unsubscribe/{self.id}", False - def __repr__(self): return f"" diff --git a/tests/handler/test_unsubscribe_encoder.py b/tests/handler/test_unsubscribe_encoder.py index 85d53400..ed730e26 100644 --- a/tests/handler/test_unsubscribe_encoder.py +++ b/tests/handler/test_unsubscribe_encoder.py @@ -49,7 +49,7 @@ legacy_mail_or_link_test_data = [ UnsubscribeData(UnsubscribeAction.DisableAlias, 3), ), ( - "9=", + "mailto:me@nowhere.net?subject=9=", True, UnsubscribeData(UnsubscribeAction.DisableAlias, 9), ), @@ -59,10 +59,15 @@ legacy_mail_or_link_test_data = [ UnsubscribeData(UnsubscribeAction.DisableContact, 8), ), ( - "8_", + "mailto:me@nowhere.net?subject=8_", True, UnsubscribeData(UnsubscribeAction.DisableContact, 8), ), + ( + "mailto:me@nowhere.net?subject=83*", + True, + UnsubscribeData(UnsubscribeAction.UnsubscribeNewsletter, 83), + ), ]