refactor: Separate get channel email token logic from email encoding.

This commit extracts the logic for creating or retrieving a channel
email token into a dedicated `get_channel_email_token` function.

This improves code clarity by decoupling token generation from
the email encoding process.
This commit is contained in:
Prakhar Pratyush
2024-12-25 13:57:36 +05:30
committed by Tim Abbott
parent 864a2a067e
commit 2bb4b70121
6 changed files with 100 additions and 65 deletions

View File

@@ -48,17 +48,17 @@ def get_email_gateway_message_string_from_address(address: str) -> str:
return msg_string return msg_string
def encode_email_address(stream: Stream, show_sender: bool = False) -> str: def get_channel_email_token(stream: Stream) -> str:
channel_email_address, ignored = ChannelEmailAddress.objects.get_or_create( channel_email_address, ignored = ChannelEmailAddress.objects.get_or_create(
realm=stream.realm, realm=stream.realm,
channel=stream, channel=stream,
creator=stream.creator, creator=stream.creator,
sender=get_system_bot(settings.EMAIL_GATEWAY_BOT, stream.realm_id), sender=get_system_bot(settings.EMAIL_GATEWAY_BOT, stream.realm_id),
) )
return encode_email_address_helper(stream.name, channel_email_address.email_token, show_sender) return channel_email_address.email_token
def encode_email_address_helper(name: str, email_token: str, show_sender: bool = False) -> str: def encode_email_address(name: str, email_token: str, show_sender: bool = False) -> str:
# Some deployments may not use the email gateway # Some deployments may not use the email gateway
if settings.EMAIL_GATEWAY_PATTERN == "": if settings.EMAIL_GATEWAY_PATTERN == "":
return "" return ""

View File

@@ -11,7 +11,7 @@ from django.core.management.base import CommandError, CommandParser
from typing_extensions import override from typing_extensions import override
from zerver.lib.email_mirror import mirror_email_message from zerver.lib.email_mirror import mirror_email_message
from zerver.lib.email_mirror_helpers import encode_email_address from zerver.lib.email_mirror_helpers import encode_email_address, get_channel_email_token
from zerver.lib.management import ZulipBaseCommand from zerver.lib.management import ZulipBaseCommand
from zerver.models import Realm from zerver.models import Realm
from zerver.models.realms import get_realm from zerver.models.realms import get_realm
@@ -111,6 +111,7 @@ Example:
def _prepare_message(self, message: EmailMessage, realm: Realm, stream_name: str) -> None: def _prepare_message(self, message: EmailMessage, realm: Realm, stream_name: str) -> None:
stream = get_stream(stream_name, realm) stream = get_stream(stream_name, realm)
email_token = get_channel_email_token(stream)
# The block below ensures that the imported email message doesn't have any recipient-like # The block below ensures that the imported email message doesn't have any recipient-like
# headers that are inconsistent with the recipient we want (the stream address). # headers that are inconsistent with the recipient we want (the stream address).
@@ -125,8 +126,8 @@ Example:
for header in recipient_headers: for header in recipient_headers:
if header in message: if header in message:
del message[header] del message[header]
message[header] = encode_email_address(stream) message[header] = encode_email_address(stream.name, email_token)
if "To" in message: if "To" in message:
del message["To"] del message["To"]
message["To"] = encode_email_address(stream) message["To"] = encode_email_address(stream.name, email_token)

View File

@@ -31,6 +31,7 @@ from zerver.lib.email_mirror_helpers import (
ZulipEmailForwardError, ZulipEmailForwardError,
decode_email_address, decode_email_address,
encode_email_address, encode_email_address,
get_channel_email_token,
get_email_gateway_message_string_from_address, get_email_gateway_message_string_from_address,
) )
from zerver.lib.email_notifications import convert_html_to_markdown from zerver.lib.email_notifications import convert_html_to_markdown
@@ -38,7 +39,7 @@ from zerver.lib.send_email import FromAddress
from zerver.lib.streams import ensure_stream from zerver.lib.streams import ensure_stream
from zerver.lib.test_classes import ZulipTestCase from zerver.lib.test_classes import ZulipTestCase
from zerver.lib.test_helpers import mock_queue_publish, most_recent_message, most_recent_usermessage from zerver.lib.test_helpers import mock_queue_publish, most_recent_message, most_recent_usermessage
from zerver.models import Attachment, ChannelEmailAddress, Recipient, Stream, UserProfile from zerver.models import Attachment, Recipient, Stream, UserProfile
from zerver.models.groups import NamedUserGroup, SystemGroups from zerver.models.groups import NamedUserGroup, SystemGroups
from zerver.models.messages import Message from zerver.models.messages import Message
from zerver.models.realms import get_realm from zerver.models.realms import get_realm
@@ -74,8 +75,8 @@ class TestEncodeDecode(ZulipTestCase):
realm = get_realm("zulip") realm = get_realm("zulip")
stream_name = "dev. help" stream_name = "dev. help"
stream = ensure_stream(realm, stream_name, acting_user=None) stream = ensure_stream(realm, stream_name, acting_user=None)
email_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
email_token = ChannelEmailAddress.objects.get(channel=stream).email_token email_address = encode_email_address(stream.name, email_token)
self.assertEqual(email_address, f"dev-help.{email_token}@testserver") self.assertEqual(email_address, f"dev-help.{email_token}@testserver")
# The default form of the email address (with an option - "include-footer"): # The default form of the email address (with an option - "include-footer"):
@@ -130,8 +131,8 @@ class TestEncodeDecode(ZulipTestCase):
realm = get_realm("zulip") realm = get_realm("zulip")
stream_name = "Тестовы some ascii letters" stream_name = "Тестовы some ascii letters"
stream = ensure_stream(realm, stream_name, acting_user=None) stream = ensure_stream(realm, stream_name, acting_user=None)
email_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
email_token = ChannelEmailAddress.objects.get(channel=stream).email_token email_address = encode_email_address(stream.name, email_token)
msg_string = get_email_gateway_message_string_from_address(email_address) msg_string = get_email_gateway_message_string_from_address(email_address)
parts = msg_string.split("+") parts = msg_string.split("+")
@@ -146,13 +147,14 @@ class TestEncodeDecode(ZulipTestCase):
asciiable_stream_name = "ąężć" asciiable_stream_name = "ąężć"
stream = ensure_stream(realm, asciiable_stream_name, acting_user=None) stream = ensure_stream(realm, asciiable_stream_name, acting_user=None)
email_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
email_address = encode_email_address(stream.name, email_token)
self.assertTrue(email_address.startswith("aezc.")) self.assertTrue(email_address.startswith("aezc."))
def test_decode_ignores_stream_name(self) -> None: def test_decode_ignores_stream_name(self) -> None:
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
email_token = ChannelEmailAddress.objects.get(channel=stream).email_token stream_to_address = encode_email_address(stream.name, email_token)
stream_to_address = stream_to_address.replace("denmark", "Some_name") stream_to_address = stream_to_address.replace("denmark", "Some_name")
# get the email_token: # get the email_token:
@@ -161,8 +163,8 @@ class TestEncodeDecode(ZulipTestCase):
def test_encode_with_show_sender(self) -> None: def test_encode_with_show_sender(self) -> None:
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
stream_to_address = encode_email_address(stream, show_sender=True) email_token = get_channel_email_token(stream)
email_token = ChannelEmailAddress.objects.get(channel=stream).email_token stream_to_address = encode_email_address(stream.name, email_token, show_sender=True)
token, options = decode_email_address(stream_to_address) token, options = decode_email_address(stream_to_address)
self._assert_options(options, show_sender=True) self._assert_options(options, show_sender=True)
@@ -170,8 +172,8 @@ class TestEncodeDecode(ZulipTestCase):
def test_decode_prefer_text_options(self) -> None: def test_decode_prefer_text_options(self) -> None:
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
encode_email_address(stream) email_token = get_channel_email_token(stream)
email_token = ChannelEmailAddress.objects.get(channel=stream).email_token encode_email_address(stream.name, email_token)
address_prefer_text = f"Denmark.{email_token}.prefer-text@testserver" address_prefer_text = f"Denmark.{email_token}.prefer-text@testserver"
address_prefer_html = f"Denmark.{email_token}.prefer-html@testserver" address_prefer_html = f"Denmark.{email_token}.prefer-html@testserver"
@@ -236,7 +238,8 @@ class TestStreamEmailMessages(ZulipTestCase):
def create_incoming_valid_message( def create_incoming_valid_message(
self, msgtext: str, stream: Stream, include_quotes: bool self, msgtext: str, stream: Stream, include_quotes: bool
) -> EmailMessage: ) -> EmailMessage:
address = Address(addr_spec=encode_email_address(stream)) email_token = get_channel_email_token(stream)
address = Address(addr_spec=encode_email_address(stream.name, email_token))
email_username = address.username + "+show-sender" email_username = address.username + "+show-sender"
if include_quotes: if include_quotes:
email_username += "+include-quotes" email_username += "+include-quotes"
@@ -258,7 +261,8 @@ class TestStreamEmailMessages(ZulipTestCase):
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("TestStreamEmailMessages body") incoming_valid_message.set_content("TestStreamEmailMessages body")
@@ -286,7 +290,8 @@ class TestStreamEmailMessages(ZulipTestCase):
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("TestStreamEmailMessages body") incoming_valid_message.set_content("TestStreamEmailMessages body")
@@ -313,7 +318,8 @@ class TestStreamEmailMessages(ZulipTestCase):
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("TestStreamEmailMessages body") incoming_valid_message.set_content("TestStreamEmailMessages body")
@@ -340,7 +346,8 @@ class TestStreamEmailMessages(ZulipTestCase):
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("TestStreamEmailMessages body") incoming_valid_message.set_content("TestStreamEmailMessages body")
@@ -371,7 +378,8 @@ class TestStreamEmailMessages(ZulipTestCase):
self.subscribe(user_profile, "private_stream") self.subscribe(user_profile, "private_stream")
stream = get_stream("private_stream", user_profile.realm) stream = get_stream("private_stream", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("TestStreamEmailMessages body") incoming_valid_message.set_content("TestStreamEmailMessages body")
@@ -397,9 +405,10 @@ class TestStreamEmailMessages(ZulipTestCase):
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
# stream address is angle-addr within multiple addresses # stream address is angle-addr within multiple addresses
email_token = get_channel_email_token(stream)
stream_to_addresses = [ stream_to_addresses = [
"A.N. Other <another@example.org>", "A.N. Other <another@example.org>",
f"Denmark <{encode_email_address(stream)}>", f"Denmark <{encode_email_address(stream.name, email_token)}>",
] ]
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
@@ -513,7 +522,8 @@ and other things
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
address = Address(addr_spec=encode_email_address(stream)) email_token = get_channel_email_token(stream)
address = Address(addr_spec=encode_email_address(stream.name, email_token))
email_username = address.username + "+show-sender" email_username = address.username + "+show-sender"
stream_to_address = Address(username=email_username, domain=address.domain).addr_spec stream_to_address = Address(username=email_username, domain=address.domain).addr_spec
@@ -544,7 +554,8 @@ and other things
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
address = Address(addr_spec=encode_email_address(stream)) email_token = get_channel_email_token(stream)
address = Address(addr_spec=encode_email_address(stream.name, email_token))
email_username = address.username + "+include-footer" email_username = address.username + "+include-footer"
stream_to_address = Address(username=email_username, domain=address.domain).addr_spec stream_to_address = Address(username=email_username, domain=address.domain).addr_spec
@@ -572,7 +583,8 @@ and other things
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
address = Address(addr_spec=encode_email_address(stream)) email_token = get_channel_email_token(stream)
address = Address(addr_spec=encode_email_address(stream.name, email_token))
email_username = address.username + "+include-quotes" email_username = address.username + "+include-quotes"
stream_to_address = Address(username=email_username, domain=address.domain).addr_spec stream_to_address = Address(username=email_username, domain=address.domain).addr_spec
@@ -603,7 +615,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("Test body") incoming_valid_message.set_content("Test body")
@@ -648,7 +661,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("Test body") incoming_valid_message.set_content("Test body")
@@ -686,7 +700,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("a" * settings.MAX_MESSAGE_LENGTH) incoming_valid_message.set_content("a" * settings.MAX_MESSAGE_LENGTH)
@@ -728,7 +743,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("Test body") incoming_valid_message.set_content("Test body")
@@ -771,7 +787,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("Test body") incoming_valid_message.set_content("Test body")
@@ -817,7 +834,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("Test body") incoming_valid_message.set_content("Test body")
@@ -847,8 +865,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
encode_email_address(stream) email_token = get_channel_email_token(stream)
email_token = ChannelEmailAddress.objects.get(channel=stream).email_token encode_email_address(stream.name, email_token)
stream_address = f"Denmark.{email_token}@testserver" stream_address = f"Denmark.{email_token}@testserver"
stream_address_prefer_html = f"Denmark.{email_token}.prefer-html@testserver" stream_address_prefer_html = f"Denmark.{email_token}.prefer-html@testserver"
@@ -882,8 +900,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
encode_email_address(stream) email_token = get_channel_email_token(stream)
email_token = ChannelEmailAddress.objects.get(channel=stream).email_token encode_email_address(stream.name, email_token)
stream_address_prefer_html = f"Denmark.{email_token}.prefer-html@testserver" stream_address_prefer_html = f"Denmark.{email_token}.prefer-html@testserver"
text = "Test message" text = "Test message"
@@ -951,7 +969,8 @@ class TestStreamEmailMessagesEmptyBody(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
# empty body # empty body
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
@@ -974,7 +993,8 @@ class TestStreamEmailMessagesEmptyBody(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
# No textual body # No textual body
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
with open( with open(
@@ -1007,7 +1027,8 @@ class TestStreamEmailMessagesEmptyBody(ZulipTestCase):
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
headers = {} headers = {}
headers["Reply-To"] = self.example_email("othello") headers["Reply-To"] = self.example_email("othello")
@@ -1393,7 +1414,8 @@ class TestEmptyGatewaySetting(ZulipTestCase):
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
with self.settings(EMAIL_GATEWAY_PATTERN=""): with self.settings(EMAIL_GATEWAY_PATTERN=""):
test_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
test_address = encode_email_address(stream.name, email_token)
self.assertEqual(test_address, "") self.assertEqual(test_address, "")
@@ -1418,7 +1440,8 @@ class TestReplyExtraction(ZulipTestCase):
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
text = """Reply text = """Reply
-----Original Message----- -----Original Message-----
@@ -1455,7 +1478,8 @@ class TestReplyExtraction(ZulipTestCase):
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
html = """ html = """
<html> <html>
<body> <body>
@@ -1504,7 +1528,8 @@ class TestScriptMTA(ZulipTestCase):
sender = self.example_email("hamlet") sender = self.example_email("hamlet")
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
mail_template = self.fixture_data("simple.txt", type="email") mail_template = self.fixture_data("simple.txt", type="email")
mail = mail_template.format(stream_to_address=stream_to_address, sender=sender) mail = mail_template.format(stream_to_address=stream_to_address, sender=sender)
@@ -1520,7 +1545,8 @@ class TestScriptMTA(ZulipTestCase):
sender = self.example_email("hamlet") sender = self.example_email("hamlet")
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
mail_template = self.fixture_data("simple.txt", type="email") mail_template = self.fixture_data("simple.txt", type="email")
mail = mail_template.format(stream_to_address=stream_to_address, sender=sender) mail = mail_template.format(stream_to_address=stream_to_address, sender=sender)
p = subprocess.run( p = subprocess.run(
@@ -1587,13 +1613,15 @@ class TestEmailMirrorTornadoView(ZulipTestCase):
def test_success_stream(self) -> None: def test_success_stream(self) -> None:
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
result = self.send_offline_message(stream_to_address, self.example_user("hamlet")) result = self.send_offline_message(stream_to_address, self.example_user("hamlet"))
self.assert_json_success(result) self.assert_json_success(result)
def test_error_to_stream_with_wrong_address(self) -> None: def test_error_to_stream_with_wrong_address(self) -> None:
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
# get the email_token: # get the email_token:
token = decode_email_address(stream_to_address)[0] token = decode_email_address(stream_to_address)[0]
stream_to_address = stream_to_address.replace(token, "Wrong_token") stream_to_address = stream_to_address.replace(token, "Wrong_token")
@@ -1607,7 +1635,8 @@ class TestEmailMirrorTornadoView(ZulipTestCase):
def test_success_to_stream_with_good_token_wrong_stream_name(self) -> None: def test_success_to_stream_with_good_token_wrong_stream_name(self) -> None:
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
stream_to_address = stream_to_address.replace("denmark", "Wrong_name") stream_to_address = stream_to_address.replace("denmark", "Wrong_name")
result = self.send_offline_message(stream_to_address, self.example_user("hamlet")) result = self.send_offline_message(stream_to_address, self.example_user("hamlet"))
@@ -1641,7 +1670,8 @@ class TestStreamEmailMessagesSubjectStripping(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("TestStreamEmailMessages body") incoming_valid_message.set_content("TestStreamEmailMessages body")
incoming_valid_message["Subject"] = "Re: Fwd: Re: AW: Test" incoming_valid_message["Subject"] = "Re: Fwd: Re: AW: Test"
@@ -1683,7 +1713,8 @@ class TestContentTypeUnspecifiedCharset(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
del incoming_message["To"] del incoming_message["To"]
incoming_message["To"] = stream_to_address incoming_message["To"] = stream_to_address
@@ -1708,7 +1739,8 @@ class TestContentTypeInvalidCharset(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "Denmark") self.subscribe(user_profile, "Denmark")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
del incoming_message["To"] del incoming_message["To"]
incoming_message["To"] = stream_to_address incoming_message["To"] = stream_to_address
@@ -1740,7 +1772,8 @@ class TestEmailMirrorLogAndReport(ZulipTestCase):
self.login_user(user_profile) self.login_user(user_profile)
self.subscribe(user_profile, "errors") self.subscribe(user_profile, "errors")
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
incoming_valid_message = EmailMessage() incoming_valid_message = EmailMessage()
incoming_valid_message.set_content("Test body") incoming_valid_message.set_content("Test body")
@@ -1772,7 +1805,8 @@ class TestEmailMirrorLogAndReport(ZulipTestCase):
stream = get_stream("Denmark", user_profile.realm) stream = get_stream("Denmark", user_profile.realm)
# Test for a stream address: # Test for a stream address:
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
address = Address(addr_spec=stream_to_address) address = Address(addr_spec=stream_to_address)
scrubbed_stream_address = Address( scrubbed_stream_address = Address(
username="X" * len(address.username), domain=address.domain username="X" * len(address.username), domain=address.domain

View File

@@ -17,7 +17,7 @@ from django.test import override_settings
from typing_extensions import override from typing_extensions import override
from zerver.lib.email_mirror import RateLimitedRealmMirror from zerver.lib.email_mirror import RateLimitedRealmMirror
from zerver.lib.email_mirror_helpers import encode_email_address from zerver.lib.email_mirror_helpers import encode_email_address, get_channel_email_token
from zerver.lib.queue import MAX_REQUEST_RETRIES from zerver.lib.queue import MAX_REQUEST_RETRIES
from zerver.lib.rate_limiter import RateLimiterLockingError from zerver.lib.rate_limiter import RateLimiterLockingError
from zerver.lib.remote_server import PushNotificationBouncerRetryLaterError from zerver.lib.remote_server import PushNotificationBouncerRetryLaterError
@@ -574,7 +574,8 @@ class WorkerTest(ZulipTestCase):
def test_mirror_worker(self, mock_mirror_email: MagicMock) -> None: def test_mirror_worker(self, mock_mirror_email: MagicMock) -> None:
fake_client = FakeClient() fake_client = FakeClient()
stream = get_stream("Denmark", get_realm("zulip")) stream = get_stream("Denmark", get_realm("zulip"))
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
data = [ data = [
dict( dict(
msg_base64=base64.b64encode(b"\xf3test").decode(), msg_base64=base64.b64encode(b"\xf3test").decode(),
@@ -599,7 +600,8 @@ class WorkerTest(ZulipTestCase):
realm = get_realm("zulip") realm = get_realm("zulip")
RateLimitedRealmMirror(realm).clear_history() RateLimitedRealmMirror(realm).clear_history()
stream = get_stream("Denmark", realm) stream = get_stream("Denmark", realm)
stream_to_address = encode_email_address(stream) email_token = get_channel_email_token(stream)
stream_to_address = encode_email_address(stream.name, email_token)
data = [ data = [
dict( dict(
msg_base64=base64.b64encode(b"\xf3test").decode(), msg_base64=base64.b64encode(b"\xf3test").decode(),

View File

@@ -55,7 +55,7 @@ from zerver.lib.default_streams import (
get_default_stream_ids_for_realm, get_default_stream_ids_for_realm,
get_slim_realm_default_streams, get_slim_realm_default_streams,
) )
from zerver.lib.email_mirror_helpers import encode_email_address_helper from zerver.lib.email_mirror_helpers import encode_email_address, get_channel_email_token
from zerver.lib.exceptions import JsonableError from zerver.lib.exceptions import JsonableError
from zerver.lib.message import UnreadStreamInfo, aggregate_unread_data, get_raw_unread_data from zerver.lib.message import UnreadStreamInfo, aggregate_unread_data, get_raw_unread_data
from zerver.lib.response import json_success from zerver.lib.response import json_success
@@ -107,7 +107,6 @@ from zerver.lib.types import (
from zerver.lib.user_groups import is_user_in_group from zerver.lib.user_groups import is_user_in_group
from zerver.models import ( from zerver.models import (
Attachment, Attachment,
ChannelEmailAddress,
DefaultStream, DefaultStream,
DefaultStreamGroup, DefaultStreamGroup,
Message, Message,
@@ -6164,10 +6163,8 @@ class GetStreamsTest(ZulipTestCase):
denmark_stream = get_stream("Denmark", realm) denmark_stream = get_stream("Denmark", realm)
result = self.client_get(f"/json/streams/{denmark_stream.id}/email_address") result = self.client_get(f"/json/streams/{denmark_stream.id}/email_address")
json = self.assert_json_success(result) json = self.assert_json_success(result)
email_token = ChannelEmailAddress.objects.get(channel=denmark_stream).email_token email_token = get_channel_email_token(denmark_stream)
denmark_email = encode_email_address_helper( denmark_email = encode_email_address(denmark_stream.name, email_token, show_sender=True)
denmark_stream.name, email_token, show_sender=True
)
self.assertEqual(json["email"], denmark_email) self.assertEqual(json["email"], denmark_email)
self.login("polonius") self.login("polonius")

View File

@@ -48,7 +48,7 @@ from zerver.decorator import (
require_realm_admin, require_realm_admin,
) )
from zerver.lib.default_streams import get_default_stream_ids_for_realm from zerver.lib.default_streams import get_default_stream_ids_for_realm
from zerver.lib.email_mirror_helpers import encode_email_address from zerver.lib.email_mirror_helpers import encode_email_address, get_channel_email_token
from zerver.lib.exceptions import ( from zerver.lib.exceptions import (
CannotManageDefaultChannelError, CannotManageDefaultChannelError,
JsonableError, JsonableError,
@@ -1133,6 +1133,7 @@ def get_stream_email_address(
user_profile, user_profile,
stream_id, stream_id,
) )
stream_email = encode_email_address(stream, show_sender=True) email_token = get_channel_email_token(stream)
stream_email = encode_email_address(stream.name, email_token, show_sender=True)
return json_success(request, data={"email": stream_email}) return json_success(request, data={"email": stream_email})