diff --git a/zerver/lib/email_mirror_helpers.py b/zerver/lib/email_mirror_helpers.py index 510b8bd659..ed8246a278 100644 --- a/zerver/lib/email_mirror_helpers.py +++ b/zerver/lib/email_mirror_helpers.py @@ -48,17 +48,17 @@ def get_email_gateway_message_string_from_address(address: str) -> str: 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( realm=stream.realm, channel=stream, creator=stream.creator, 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 if settings.EMAIL_GATEWAY_PATTERN == "": return "" diff --git a/zerver/management/commands/send_to_email_mirror.py b/zerver/management/commands/send_to_email_mirror.py index 8cfebfc4c0..cff3ada494 100644 --- a/zerver/management/commands/send_to_email_mirror.py +++ b/zerver/management/commands/send_to_email_mirror.py @@ -11,7 +11,7 @@ from django.core.management.base import CommandError, CommandParser from typing_extensions import override 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.models import 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: 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 # headers that are inconsistent with the recipient we want (the stream address). @@ -125,8 +126,8 @@ Example: for header in recipient_headers: if header in message: del message[header] - message[header] = encode_email_address(stream) + message[header] = encode_email_address(stream.name, email_token) if "To" in message: del message["To"] - message["To"] = encode_email_address(stream) + message["To"] = encode_email_address(stream.name, email_token) diff --git a/zerver/tests/test_email_mirror.py b/zerver/tests/test_email_mirror.py index 3159cac5f4..295118df1e 100644 --- a/zerver/tests/test_email_mirror.py +++ b/zerver/tests/test_email_mirror.py @@ -31,6 +31,7 @@ from zerver.lib.email_mirror_helpers import ( ZulipEmailForwardError, decode_email_address, encode_email_address, + get_channel_email_token, get_email_gateway_message_string_from_address, ) 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.test_classes import ZulipTestCase 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.messages import Message from zerver.models.realms import get_realm @@ -74,8 +75,8 @@ class TestEncodeDecode(ZulipTestCase): realm = get_realm("zulip") stream_name = "dev. help" stream = ensure_stream(realm, stream_name, acting_user=None) - email_address = encode_email_address(stream) - email_token = ChannelEmailAddress.objects.get(channel=stream).email_token + email_token = get_channel_email_token(stream) + email_address = encode_email_address(stream.name, email_token) self.assertEqual(email_address, f"dev-help.{email_token}@testserver") # The default form of the email address (with an option - "include-footer"): @@ -130,8 +131,8 @@ class TestEncodeDecode(ZulipTestCase): realm = get_realm("zulip") stream_name = "Тестовы some ascii letters" stream = ensure_stream(realm, stream_name, acting_user=None) - email_address = encode_email_address(stream) - email_token = ChannelEmailAddress.objects.get(channel=stream).email_token + email_token = get_channel_email_token(stream) + email_address = encode_email_address(stream.name, email_token) msg_string = get_email_gateway_message_string_from_address(email_address) parts = msg_string.split("+") @@ -146,13 +147,14 @@ class TestEncodeDecode(ZulipTestCase): asciiable_stream_name = "ąężć" 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.")) def test_decode_ignores_stream_name(self) -> None: stream = get_stream("Denmark", get_realm("zulip")) - stream_to_address = encode_email_address(stream) - email_token = ChannelEmailAddress.objects.get(channel=stream).email_token + 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", "Some_name") # get the email_token: @@ -161,8 +163,8 @@ class TestEncodeDecode(ZulipTestCase): def test_encode_with_show_sender(self) -> None: stream = get_stream("Denmark", get_realm("zulip")) - stream_to_address = encode_email_address(stream, show_sender=True) - email_token = ChannelEmailAddress.objects.get(channel=stream).email_token + email_token = get_channel_email_token(stream) + stream_to_address = encode_email_address(stream.name, email_token, show_sender=True) token, options = decode_email_address(stream_to_address) self._assert_options(options, show_sender=True) @@ -170,8 +172,8 @@ class TestEncodeDecode(ZulipTestCase): def test_decode_prefer_text_options(self) -> None: stream = get_stream("Denmark", get_realm("zulip")) - encode_email_address(stream) - email_token = ChannelEmailAddress.objects.get(channel=stream).email_token + email_token = get_channel_email_token(stream) + encode_email_address(stream.name, email_token) address_prefer_text = f"Denmark.{email_token}.prefer-text@testserver" address_prefer_html = f"Denmark.{email_token}.prefer-html@testserver" @@ -236,7 +238,8 @@ class TestStreamEmailMessages(ZulipTestCase): def create_incoming_valid_message( self, msgtext: str, stream: Stream, include_quotes: bool ) -> 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" if include_quotes: email_username += "+include-quotes" @@ -258,7 +261,8 @@ class TestStreamEmailMessages(ZulipTestCase): self.subscribe(user_profile, "Denmark") 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.set_content("TestStreamEmailMessages body") @@ -286,7 +290,8 @@ class TestStreamEmailMessages(ZulipTestCase): self.subscribe(user_profile, "Denmark") 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.set_content("TestStreamEmailMessages body") @@ -313,7 +318,8 @@ class TestStreamEmailMessages(ZulipTestCase): self.subscribe(user_profile, "Denmark") 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.set_content("TestStreamEmailMessages body") @@ -340,7 +346,8 @@ class TestStreamEmailMessages(ZulipTestCase): self.subscribe(user_profile, "Denmark") 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.set_content("TestStreamEmailMessages body") @@ -371,7 +378,8 @@ class TestStreamEmailMessages(ZulipTestCase): self.subscribe(user_profile, "private_stream") 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.set_content("TestStreamEmailMessages body") @@ -397,9 +405,10 @@ class TestStreamEmailMessages(ZulipTestCase): stream = get_stream("Denmark", user_profile.realm) # stream address is angle-addr within multiple addresses + email_token = get_channel_email_token(stream) stream_to_addresses = [ "A.N. Other ", - f"Denmark <{encode_email_address(stream)}>", + f"Denmark <{encode_email_address(stream.name, email_token)}>", ] incoming_valid_message = EmailMessage() @@ -513,7 +522,8 @@ and other things self.subscribe(user_profile, "Denmark") 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" stream_to_address = Address(username=email_username, domain=address.domain).addr_spec @@ -544,7 +554,8 @@ and other things self.subscribe(user_profile, "Denmark") 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" stream_to_address = Address(username=email_username, domain=address.domain).addr_spec @@ -572,7 +583,8 @@ and other things self.subscribe(user_profile, "Denmark") 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" 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.subscribe(user_profile, "Denmark") 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.set_content("Test body") @@ -648,7 +661,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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.set_content("Test body") @@ -686,7 +700,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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.set_content("a" * settings.MAX_MESSAGE_LENGTH) @@ -728,7 +743,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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.set_content("Test body") @@ -771,7 +787,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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.set_content("Test body") @@ -817,7 +834,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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.set_content("Test body") @@ -847,8 +865,8 @@ class TestEmailMirrorMessagesWithAttachments(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") stream = get_stream("Denmark", user_profile.realm) - encode_email_address(stream) - email_token = ChannelEmailAddress.objects.get(channel=stream).email_token + email_token = get_channel_email_token(stream) + encode_email_address(stream.name, email_token) stream_address = f"Denmark.{email_token}@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.subscribe(user_profile, "Denmark") stream = get_stream("Denmark", user_profile.realm) - encode_email_address(stream) - email_token = ChannelEmailAddress.objects.get(channel=stream).email_token + email_token = get_channel_email_token(stream) + encode_email_address(stream.name, email_token) stream_address_prefer_html = f"Denmark.{email_token}.prefer-html@testserver" text = "Test message" @@ -951,7 +969,8 @@ class TestStreamEmailMessagesEmptyBody(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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 incoming_valid_message = EmailMessage() @@ -974,7 +993,8 @@ class TestStreamEmailMessagesEmptyBody(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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 incoming_valid_message = EmailMessage() with open( @@ -1007,7 +1027,8 @@ class TestStreamEmailMessagesEmptyBody(ZulipTestCase): self.subscribe(user_profile, "Denmark") 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["Reply-To"] = self.example_email("othello") @@ -1393,7 +1414,8 @@ class TestEmptyGatewaySetting(ZulipTestCase): stream = get_stream("Denmark", get_realm("zulip")) 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, "") @@ -1418,7 +1440,8 @@ class TestReplyExtraction(ZulipTestCase): self.subscribe(user_profile, "Denmark") 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 -----Original Message----- @@ -1455,7 +1478,8 @@ class TestReplyExtraction(ZulipTestCase): self.subscribe(user_profile, "Denmark") 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 = """ @@ -1504,7 +1528,8 @@ class TestScriptMTA(ZulipTestCase): sender = self.example_email("hamlet") 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 = mail_template.format(stream_to_address=stream_to_address, sender=sender) @@ -1520,7 +1545,8 @@ class TestScriptMTA(ZulipTestCase): sender = self.example_email("hamlet") 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 = mail_template.format(stream_to_address=stream_to_address, sender=sender) p = subprocess.run( @@ -1587,13 +1613,15 @@ class TestEmailMirrorTornadoView(ZulipTestCase): def test_success_stream(self) -> None: 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")) self.assert_json_success(result) def test_error_to_stream_with_wrong_address(self) -> None: 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: token = decode_email_address(stream_to_address)[0] 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: 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") 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.subscribe(user_profile, "Denmark") 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.set_content("TestStreamEmailMessages body") incoming_valid_message["Subject"] = "Re: Fwd: Re: AW: Test" @@ -1683,7 +1713,8 @@ class TestContentTypeUnspecifiedCharset(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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"] incoming_message["To"] = stream_to_address @@ -1708,7 +1739,8 @@ class TestContentTypeInvalidCharset(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "Denmark") 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"] incoming_message["To"] = stream_to_address @@ -1740,7 +1772,8 @@ class TestEmailMirrorLogAndReport(ZulipTestCase): self.login_user(user_profile) self.subscribe(user_profile, "errors") 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.set_content("Test body") @@ -1772,7 +1805,8 @@ class TestEmailMirrorLogAndReport(ZulipTestCase): stream = get_stream("Denmark", user_profile.realm) # 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) scrubbed_stream_address = Address( username="X" * len(address.username), domain=address.domain diff --git a/zerver/tests/test_queue_worker.py b/zerver/tests/test_queue_worker.py index 1e0a4887f9..ca76a2c948 100644 --- a/zerver/tests/test_queue_worker.py +++ b/zerver/tests/test_queue_worker.py @@ -17,7 +17,7 @@ from django.test import override_settings from typing_extensions import override 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.rate_limiter import RateLimiterLockingError from zerver.lib.remote_server import PushNotificationBouncerRetryLaterError @@ -574,7 +574,8 @@ class WorkerTest(ZulipTestCase): def test_mirror_worker(self, mock_mirror_email: MagicMock) -> None: fake_client = FakeClient() 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 = [ dict( msg_base64=base64.b64encode(b"\xf3test").decode(), @@ -599,7 +600,8 @@ class WorkerTest(ZulipTestCase): realm = get_realm("zulip") RateLimitedRealmMirror(realm).clear_history() 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 = [ dict( msg_base64=base64.b64encode(b"\xf3test").decode(), diff --git a/zerver/tests/test_subs.py b/zerver/tests/test_subs.py index d242110025..3a1b43d60a 100644 --- a/zerver/tests/test_subs.py +++ b/zerver/tests/test_subs.py @@ -55,7 +55,7 @@ from zerver.lib.default_streams import ( get_default_stream_ids_for_realm, 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.message import UnreadStreamInfo, aggregate_unread_data, get_raw_unread_data 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.models import ( Attachment, - ChannelEmailAddress, DefaultStream, DefaultStreamGroup, Message, @@ -6164,10 +6163,8 @@ class GetStreamsTest(ZulipTestCase): denmark_stream = get_stream("Denmark", realm) result = self.client_get(f"/json/streams/{denmark_stream.id}/email_address") json = self.assert_json_success(result) - email_token = ChannelEmailAddress.objects.get(channel=denmark_stream).email_token - denmark_email = encode_email_address_helper( - denmark_stream.name, email_token, show_sender=True - ) + email_token = get_channel_email_token(denmark_stream) + denmark_email = encode_email_address(denmark_stream.name, email_token, show_sender=True) self.assertEqual(json["email"], denmark_email) self.login("polonius") diff --git a/zerver/views/streams.py b/zerver/views/streams.py index feeea02dae..d678f1a9dd 100644 --- a/zerver/views/streams.py +++ b/zerver/views/streams.py @@ -48,7 +48,7 @@ from zerver.decorator import ( require_realm_admin, ) 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 ( CannotManageDefaultChannelError, JsonableError, @@ -1133,6 +1133,7 @@ def get_stream_email_address( user_profile, 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})