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
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 ""

View File

@@ -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)

View File

@@ -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 <another@example.org>",
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 = """
<html>
<body>
@@ -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

View File

@@ -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(),

View File

@@ -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")

View File

@@ -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})