emails: Add a FromAddress class to control access to certain settings emails.

No change in behavior.

Also makes the first step towards converting all uses of
settings.ZULIP_ADMINISTRATOR and settings.NOREPLY_EMAIL_ADDRESS to
FromAddress.*.

Once everything is converted, it will be easier to ensure that future
development doesn't break backwards compatibility with the old style of
settings emails.
This commit is contained in:
James Rowan
2017-06-26 13:43:32 -04:00
committed by Tim Abbott
parent 368bd66d8b
commit d88e7308bf
7 changed files with 19 additions and 16 deletions

View File

@@ -29,7 +29,7 @@ from zerver.lib.message import (
) )
from zerver.lib.realm_icon import realm_icon_url from zerver.lib.realm_icon import realm_icon_url
from zerver.lib.retention import move_message_to_archive from zerver.lib.retention import move_message_to_archive
from zerver.lib.send_email import send_email from zerver.lib.send_email import send_email, FromAddress
from zerver.models import Realm, RealmEmoji, Stream, UserProfile, UserActivity, \ from zerver.models import Realm, RealmEmoji, Stream, UserProfile, UserActivity, \
RealmDomain, \ RealmDomain, \
Subscription, Recipient, Message, Attachment, UserMessage, RealmAuditLog, \ Subscription, Recipient, Message, Attachment, UserMessage, RealmAuditLog, \
@@ -640,8 +640,7 @@ def do_start_email_change_process(user_profile, new_email):
activation_url = EmailChangeConfirmation.objects.get_link_for_object(obj, host=user_profile.realm.host) activation_url = EmailChangeConfirmation.objects.get_link_for_object(obj, host=user_profile.realm.host)
context = {'realm': user_profile.realm, 'old_email': old_email, 'new_email': new_email, context = {'realm': user_profile.realm, 'old_email': old_email, 'new_email': new_email,
'activate_url': activation_url} 'activate_url': activation_url}
send_email('zerver/emails/confirm_new_email', new_email, from_address=settings.ZULIP_ADMINISTRATOR.split()[-1], send_email('zerver/emails/confirm_new_email', new_email, from_address=FromAddress.SUPPORT, context=context)
context=context)
def compute_irc_user_fullname(email): def compute_irc_user_fullname(email):
# type: (NonBinaryStr) -> NonBinaryStr # type: (NonBinaryStr) -> NonBinaryStr
@@ -3054,8 +3053,7 @@ def do_send_confirmation_email(invitee, referrer, body):
""" """
activation_url = Confirmation.objects.get_link_for_object(invitee, host=referrer.realm.host) activation_url = Confirmation.objects.get_link_for_object(invitee, host=referrer.realm.host)
context = {'referrer': referrer, 'custom_body': body, 'activate_url': activation_url} context = {'referrer': referrer, 'custom_body': body, 'activate_url': activation_url}
send_email('zerver/emails/invitation', invitee.email, from_address=settings.ZULIP_ADMINISTRATOR.split()[-1], send_email('zerver/emails/invitation', invitee.email, from_address=FromAddress.SUPPORT, context=context)
context=context)
def is_inactive(email): def is_inactive(email):
# type: (Text) -> None # type: (Text) -> None

View File

@@ -8,7 +8,7 @@ from django.template import loader
from django.utils.timezone import now as timezone_now from django.utils.timezone import now as timezone_now
from zerver.decorator import statsd_increment from zerver.decorator import statsd_increment
from zerver.lib.send_email import send_future_email, display_email, \ from zerver.lib.send_email import send_future_email, display_email, \
send_email_from_dict send_email_from_dict, FromAddress
from zerver.lib.queue import queue_json_publish from zerver.lib.queue import queue_json_publish
from zerver.models import ( from zerver.models import (
Recipient, Recipient,
@@ -26,6 +26,7 @@ from zerver.models import (
) )
import datetime import datetime
from email.utils import formataddr
import re import re
import subprocess import subprocess
import ujson import ujson
@@ -398,7 +399,7 @@ def enqueue_welcome_emails(email, name):
from_address = settings.WELCOME_EMAIL_SENDER['email'] from_address = settings.WELCOME_EMAIL_SENDER['email']
else: else:
from_name = None from_name = None
from_address = settings.ZULIP_ADMINISTRATOR.split()[-1] from_address = FromAddress.SUPPORT
user_profile = get_user_profile_by_email(email) user_profile = get_user_profile_by_email(email)
unsubscribe_link = one_click_unsubscribe_link(user_profile, "welcome") unsubscribe_link = one_click_unsubscribe_link(user_profile, "welcome")

View File

@@ -10,6 +10,10 @@ import ujson
from typing import Any, Dict, Iterable, List, Mapping, Optional, Text from typing import Any, Dict, Iterable, List, Mapping, Optional, Text
class FromAddress(object):
SUPPORT = parseaddr(settings.ZULIP_ADMINISTRATOR)[1]
NOREPLY = parseaddr(settings.NOREPLY_EMAIL_ADDRESS)[1]
def display_email(user): def display_email(user):
# type: (UserProfile) -> Text # type: (UserProfile) -> Text
# Change to '%s <%s>' % (user.full_name, user.email) once # Change to '%s <%s>' % (user.full_name, user.email) once
@@ -33,7 +37,7 @@ def build_email(template_prefix, to_email, from_name=None, from_address=None,
if from_name is None: if from_name is None:
from_name = "Zulip" from_name = "Zulip"
if from_address is None: if from_address is None:
from_address = parseaddr(settings.NOREPLY_EMAIL_ADDRESS)[1] from_address = FromAddress.NOREPLY
from_email = formataddr((from_name, from_address)) from_email = formataddr((from_name, from_address))
reply_to = None reply_to = None
if reply_to_email is not None: if reply_to_email is not None:

View File

@@ -36,7 +36,7 @@ from zerver.lib.actions import (
get_stream, get_stream,
do_create_realm, do_create_realm,
) )
from zerver.lib.send_email import display_email, send_email, send_future_email from zerver.lib.send_email import display_email, send_email, send_future_email, FromAddress
from zerver.lib.initial_password import initial_password from zerver.lib.initial_password import initial_password
from zerver.lib.actions import ( from zerver.lib.actions import (
do_deactivate_realm, do_deactivate_realm,
@@ -743,7 +743,7 @@ so we didn't send them an invitation. We did send invitations to everyone else!"
with self.settings(EMAIL_BACKEND='django.core.mail.backends.console.EmailBackend'): with self.settings(EMAIL_BACKEND='django.core.mail.backends.console.EmailBackend'):
send_future_email( send_future_email(
"zerver/emails/invitation_reminder", data["email"], "zerver/emails/invitation_reminder", data["email"],
from_address=settings.ZULIP_ADMINISTRATOR.split()[-1], context=context) from_address=FromAddress.SUPPORT, context=context)
email_jobs_to_deliver = ScheduledJob.objects.filter( email_jobs_to_deliver = ScheduledJob.objects.filter(
type=ScheduledJob.EMAIL, type=ScheduledJob.EMAIL,
scheduled_timestamp__lte=timezone_now()) scheduled_timestamp__lte=timezone_now())

View File

@@ -16,7 +16,7 @@ from zerver.models import UserProfile, Realm, PreregistrationUser, \
name_changes_disabled, email_to_username, \ name_changes_disabled, email_to_username, \
completely_open, get_unique_open_realm, email_allowed_for_realm, \ completely_open, get_unique_open_realm, email_allowed_for_realm, \
get_realm, get_realm_by_email_domain, get_system_bot get_realm, get_realm_by_email_domain, get_system_bot
from zerver.lib.send_email import send_email, send_email_to_user from zerver.lib.send_email import send_email, send_email_to_user, FromAddress
from zerver.lib.events import do_events_register from zerver.lib.events import do_events_register
from zerver.lib.actions import do_change_password, do_change_full_name, do_change_is_admin, \ from zerver.lib.actions import do_change_password, do_change_full_name, do_change_is_admin, \
do_activate_user, do_create_user, do_create_realm, set_default_streams, \ do_activate_user, do_create_user, do_create_realm, set_default_streams, \
@@ -313,7 +313,7 @@ def send_registration_completion_email(email, request, realm_creation=False):
""" """
prereg_user = create_preregistration_user(email, request, realm_creation) prereg_user = create_preregistration_user(email, request, realm_creation)
activation_url = Confirmation.objects.get_link_for_object(prereg_user, host=request.get_host()) activation_url = Confirmation.objects.get_link_for_object(prereg_user, host=request.get_host())
send_email('zerver/emails/confirm_registration', email, from_address=settings.ZULIP_ADMINISTRATOR.split()[-1], send_email('zerver/emails/confirm_registration', email, from_address=FromAddress.SUPPORT,
context={'activate_url': activation_url}) context={'activate_url': activation_url})
if settings.DEVELOPMENT and realm_creation: if settings.DEVELOPMENT and realm_creation:
request.session['confirmation_key'] = {'confirmation_key': activation_url.split('/')[-1]} request.session['confirmation_key'] = {'confirmation_key': activation_url.split('/')[-1]}

View File

@@ -17,7 +17,7 @@ from zerver.lib.actions import do_change_password, \
do_regenerate_api_key, do_change_avatar_fields, do_set_user_display_setting, \ do_regenerate_api_key, do_change_avatar_fields, do_set_user_display_setting, \
validate_email, do_change_user_email, do_start_email_change_process validate_email, do_change_user_email, do_start_email_change_process
from zerver.lib.avatar import avatar_url from zerver.lib.avatar import avatar_url
from zerver.lib.send_email import send_email, display_email from zerver.lib.send_email import send_email, display_email, FromAddress
from zerver.lib.i18n import get_available_language_codes from zerver.lib.i18n import get_available_language_codes
from zerver.lib.response import json_success, json_error from zerver.lib.response import json_success, json_error
from zerver.lib.upload import upload_avatar_image from zerver.lib.upload import upload_avatar_image
@@ -52,7 +52,7 @@ def confirm_email_change(request, confirmation_key):
'new_email': new_email, 'new_email': new_email,
} }
send_email('zerver/emails/notify_change_in_email', old_email, send_email('zerver/emails/notify_change_in_email', old_email,
from_address=settings.ZULIP_ADMINISTRATOR.split()[-1], context=context) from_address=FromAddress.SUPPORT, context=context)
ctx = { ctx = {
'confirmed': confirmed, 'confirmed': confirmed,

View File

@@ -27,7 +27,7 @@ from zerver.lib.actions import do_send_confirmation_email, \
render_incoming_message, do_update_embedded_data render_incoming_message, do_update_embedded_data
from zerver.lib.url_preview import preview as url_preview from zerver.lib.url_preview import preview as url_preview
from zerver.lib.digest import handle_digest_email from zerver.lib.digest import handle_digest_email
from zerver.lib.send_email import send_future_email, send_email_from_dict from zerver.lib.send_email import send_future_email, send_email_from_dict, FromAddress
from zerver.lib.email_mirror import process_message as mirror_email from zerver.lib.email_mirror import process_message as mirror_email
from zerver.decorator import JsonableError from zerver.decorator import JsonableError
from zerver.tornado.socket import req_redis_key from zerver.tornado.socket import req_redis_key
@@ -180,7 +180,7 @@ class ConfirmationEmailWorker(QueueProcessingWorker):
send_future_email( send_future_email(
"zerver/emails/invitation_reminder", "zerver/emails/invitation_reminder",
data["email"], data["email"],
from_address=settings.ZULIP_ADMINISTRATOR.split()[-1], from_address=FromAddress.SUPPORT,
context=context, context=context,
delay=datetime.timedelta(days=2)) delay=datetime.timedelta(days=2))