email_mirror: Check address usability in get_missed_message_address.

This commit is contained in:
Mateusz Mandera
2020-01-10 10:36:35 +01:00
committed by Tim Abbott
parent 843c148c59
commit ac8f4aaa93

View File

@@ -105,16 +105,23 @@ def get_missed_message_token_from_address(address: str) -> str:
return msg_string
def get_missed_message_address(address: str) -> MissedMessageEmailAddress:
def get_usable_missed_message_address(address: str) -> MissedMessageEmailAddress:
token = get_missed_message_token_from_address(address)
try:
return MissedMessageEmailAddress.objects.select_related().get(
mm_address = MissedMessageEmailAddress.objects.select_related().get(
email_token=token,
timestamp__gt=timezone_now() - timedelta(seconds=MissedMessageEmailAddress.EXPIRY_SECONDS)
)
except MissedMessageEmailAddress.DoesNotExist:
raise ZulipEmailForwardError("Missed message address expired or doesn't exist.")
if not mm_address.is_usable():
# Technical, this also checks whether the event is expired,
# but that case is excluded by the logic above.
raise ZulipEmailForwardError("Missed message address out of uses.")
return mm_address
def create_missed_message_address(user_profile: UserProfile, message: Message) -> str:
if settings.EMAIL_GATEWAY_PATTERN == '':
logger.warning("EMAIL_GATEWAY_PATTERN is an empty string, using "
@@ -302,9 +309,7 @@ def process_stream_message(to: str, message: message.Message) -> None:
stream.name, stream.realm.string_id))
def process_missed_message(to: str, message: message.Message) -> None:
mm_address = get_missed_message_address(to)
if not mm_address.is_usable():
raise ZulipEmailForwardError("Missed message address out of uses.")
mm_address = get_usable_missed_message_address(to)
mm_address.increment_times_used()
user_profile = mm_address.user_profile
@@ -371,9 +376,7 @@ def process_message(message: message.Message, rcpt_to: Optional[str]=None) -> No
def validate_to_address(rcpt_to: str) -> None:
if is_missed_message_address(rcpt_to):
mm_address = get_missed_message_address(rcpt_to)
if not mm_address.is_usable():
raise ZulipEmailForwardError("Missed message address out of uses.")
get_usable_missed_message_address(rcpt_to)
else:
decode_stream_email_address(rcpt_to)