Keep original From

This commit is contained in:
Adrià Casajús 2022-03-21 19:05:15 +01:00
parent 1b2d504b3b
commit 93b06fe30c
No known key found for this signature in database
GPG key ID: F0033226A5AFC9B9

View file

@ -539,7 +539,9 @@ def handle_email_sent_to_ourself(alias, from_addr: str, msg: Message, user):
) )
def apply_dmarc_policy(alias: Alias, contact: Contact, msg: Message) -> Optional[str]: def apply_dmarc_policy(
alias: Alias, contact: Contact, envelope: Envelope, msg: Message
) -> Optional[str]:
dmarc_result = get_dmarc_status(msg) dmarc_result = get_dmarc_status(msg)
newrelic.agent.record_custom_event( newrelic.agent.record_custom_event(
"Custom/dmarc_check", {"result": dmarc_result.name} "Custom/dmarc_check", {"result": dmarc_result.name}
@ -551,8 +553,16 @@ def apply_dmarc_policy(alias: Alias, contact: Contact, msg: Message) -> Optional
DmarcCheckResult.reject, DmarcCheckResult.reject,
DmarcCheckResult.soft_fail, DmarcCheckResult.soft_fail,
): ):
quarantine_dmarc_failed_email(alias, contact, envelope, msg)
add_quarantine_notification_for_alias(alias)
return status.E519
return None
def quarantine_dmarc_failed_email(alias, contact, envelope, msg):
add_or_replace_header(msg, headers.SL_DIRECTION, "Forward") add_or_replace_header(msg, headers.SL_DIRECTION, "Forward")
msg[headers.SL_ENVELOPE_TO] = alias.email msg[headers.SL_ENVELOPE_TO] = alias.email
msg[headers.SL_ENVELOPE_FROM] = envelope.mail_from
add_or_replace_header(msg, "From", contact.new_addr()) add_or_replace_header(msg, "From", contact.new_addr())
# replace CC & To emails by reverse-alias for all emails that are not alias # replace CC & To emails by reverse-alias for all emails that are not alias
try: try:
@ -561,7 +571,6 @@ def apply_dmarc_policy(alias: Alias, contact: Contact, msg: Message) -> Optional
except CannotCreateContactForReverseAlias: except CannotCreateContactForReverseAlias:
Session.commit() Session.commit()
raise raise
random_name = str(uuid.uuid4()) random_name = str(uuid.uuid4())
s3_report_path = f"refused-emails/full-{random_name}.eml" s3_report_path = f"refused-emails/full-{random_name}.eml"
s3.upload_email_from_bytesio( s3.upload_email_from_bytesio(
@ -582,6 +591,8 @@ def apply_dmarc_policy(alias: Alias, contact: Contact, msg: Message) -> Optional
commit=True, commit=True,
) )
def add_quarantine_notification_for_alias(alias: Alias):
notification_title = f"{alias.email} has a new mail in quarantine" notification_title = f"{alias.email} has a new mail in quarantine"
notifications = ( notifications = (
Notification.filter_by(user_id=alias.user_id) Notification.filter_by(user_id=alias.user_id)
@ -594,7 +605,6 @@ def apply_dmarc_policy(alias: Alias, contact: Contact, msg: Message) -> Optional
if notification.title == notification_title: if notification.title == notification_title:
already_notified = True already_notified = True
break break
if not already_notified: if not already_notified:
Notification.create( Notification.create(
user_id=alias.user_id, user_id=alias.user_id,
@ -602,9 +612,8 @@ def apply_dmarc_policy(alias: Alias, contact: Contact, msg: Message) -> Optional
message=Notification.render( message=Notification.render(
"notification/message-quarantine.html", alias=alias "notification/message-quarantine.html", alias=alias
), ),
commit=True,
) )
return status.E519
return None
def handle_forward(envelope, msg: Message, rcpt_to: str) -> List[Tuple[bool, str]]: def handle_forward(envelope, msg: Message, rcpt_to: str) -> List[Tuple[bool, str]]:
@ -688,7 +697,7 @@ def handle_forward(envelope, msg: Message, rcpt_to: str) -> List[Tuple[bool, str
return [(True, res_status)] return [(True, res_status)]
# Check if we need to reject or quarantine based on dmarc # Check if we need to reject or quarantine based on dmarc
dmarc_delivery_status = apply_dmarc_policy(alias, contact, msg) dmarc_delivery_status = apply_dmarc_policy(alias, contact, envelope, msg)
if dmarc_delivery_status is not None: if dmarc_delivery_status is not None:
return [(False, dmarc_delivery_status)] return [(False, dmarc_delivery_status)]