mirror of
https://github.com/chatmail/relay.git
synced 2026-05-19 20:38:05 +00:00
improve secure-join message detection (#473)
This commit is contained in:
@@ -8,6 +8,9 @@
|
|||||||
- migration guide: let opendkim own the DKIM keys directory
|
- migration guide: let opendkim own the DKIM keys directory
|
||||||
([#468](https://github.com/deltachat/chatmail/pull/468))
|
([#468](https://github.com/deltachat/chatmail/pull/468))
|
||||||
|
|
||||||
|
- improve secure-join message detection
|
||||||
|
([#473](https://github.com/deltachat/chatmail/pull/473))
|
||||||
|
|
||||||
## 1.5.0 2024-12-20
|
## 1.5.0 2024-12-20
|
||||||
|
|
||||||
- cmdeploy dns: always show recommended DNS records
|
- cmdeploy dns: always show recommended DNS records
|
||||||
|
|||||||
@@ -100,6 +100,27 @@ def check_armored_payload(payload: str):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_securejoin(message):
|
||||||
|
if message.get("secure-join") not in ["vc-request", "vg-request"]:
|
||||||
|
return False
|
||||||
|
if not message.is_multipart():
|
||||||
|
return False
|
||||||
|
parts_count = 0
|
||||||
|
for part in message.iter_parts():
|
||||||
|
parts_count += 1
|
||||||
|
if parts_count > 1:
|
||||||
|
return False
|
||||||
|
if part.is_multipart():
|
||||||
|
return False
|
||||||
|
if part.get_content_type() != "text/plain":
|
||||||
|
return False
|
||||||
|
|
||||||
|
payload = part.get_payload().strip().lower()
|
||||||
|
if payload not in ("secure-join: vc-request", "secure-join: vg-request"):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def check_encrypted(message):
|
def check_encrypted(message):
|
||||||
"""Check that the message is an OpenPGP-encrypted message.
|
"""Check that the message is an OpenPGP-encrypted message.
|
||||||
|
|
||||||
@@ -203,11 +224,7 @@ class BeforeQueueHandler:
|
|||||||
|
|
||||||
passthrough_recipients = self.config.passthrough_recipients
|
passthrough_recipients = self.config.passthrough_recipients
|
||||||
|
|
||||||
is_securejoin = message.get("secure-join") in [
|
if mail_encrypted or is_securejoin(message):
|
||||||
"vc-request",
|
|
||||||
"vg-request",
|
|
||||||
]
|
|
||||||
if is_securejoin:
|
|
||||||
return
|
return
|
||||||
|
|
||||||
for recipient in envelope.rcpt_tos:
|
for recipient in envelope.rcpt_tos:
|
||||||
@@ -222,7 +239,7 @@ class BeforeQueueHandler:
|
|||||||
_recipient_addr, recipient_domain = res
|
_recipient_addr, recipient_domain = res
|
||||||
|
|
||||||
is_outgoing = recipient_domain != envelope_from_domain
|
is_outgoing = recipient_domain != envelope_from_domain
|
||||||
if is_outgoing and not mail_encrypted:
|
if is_outgoing:
|
||||||
print("Rejected unencrypted mail.", file=sys.stderr)
|
print("Rejected unencrypted mail.", file=sys.stderr)
|
||||||
return f"500 Invalid unencrypted mail to <{recipient}>"
|
return f"500 Invalid unencrypted mail to <{recipient}>"
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
Subject: Message from {from_addr}
|
||||||
|
From: <{from_addr}>
|
||||||
|
To: <{to_addr}>
|
||||||
|
Date: Sun, 15 Oct 2023 16:43:25 +0000
|
||||||
|
Message-ID: <Mr.78MWtlV7RAi.goCFzBhCYfy@c2.testrun.org>
|
||||||
|
Chat-Version: 1.0
|
||||||
|
Secure-Join: vc-request
|
||||||
|
Secure-Join-Invitenumber: RANDOM-TOKEN
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: multipart/mixed; boundary="Gl92xgZjOShJ5PGHntqYkoo2OK2Dvi"
|
||||||
|
|
||||||
|
|
||||||
|
--Gl92xgZjOShJ5PGHntqYkoo2OK2Dvi
|
||||||
|
Content-Type: text/plain; charset=utf-8
|
||||||
|
|
||||||
|
Buy viagra!
|
||||||
|
|
||||||
|
|
||||||
|
--Gl92xgZjOShJ5PGHntqYkoo2OK2Dvi--
|
||||||
|
|
||||||
|
|
||||||
21
chatmaild/src/chatmaild/tests/mail-data/securejoin-vc.eml
Normal file
21
chatmaild/src/chatmaild/tests/mail-data/securejoin-vc.eml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
Subject: Message from {from_addr}
|
||||||
|
From: <{from_addr}>
|
||||||
|
To: <{to_addr}>
|
||||||
|
Date: Sun, 15 Oct 2023 16:43:25 +0000
|
||||||
|
Message-ID: <Mr.78MWtlV7RAi.goCFzBhCYfy@c2.testrun.org>
|
||||||
|
Chat-Version: 1.0
|
||||||
|
Secure-Join: vc-request
|
||||||
|
Secure-Join-Invitenumber: RANDOM-TOKEN
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: multipart/mixed; boundary="Gl92xgZjOShJ5PGHntqYkoo2OK2Dvi"
|
||||||
|
|
||||||
|
|
||||||
|
--Gl92xgZjOShJ5PGHntqYkoo2OK2Dvi
|
||||||
|
Content-Type: text/plain; charset=utf-8
|
||||||
|
|
||||||
|
Secure-Join: vc-request
|
||||||
|
|
||||||
|
|
||||||
|
--Gl92xgZjOShJ5PGHntqYkoo2OK2Dvi--
|
||||||
|
|
||||||
|
|
||||||
@@ -6,6 +6,7 @@ from chatmaild.filtermail import (
|
|||||||
check_armored_payload,
|
check_armored_payload,
|
||||||
check_encrypted,
|
check_encrypted,
|
||||||
common_encrypted_subjects,
|
common_encrypted_subjects,
|
||||||
|
is_securejoin,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -55,6 +56,20 @@ def test_filtermail_no_encryption_detection(maildata):
|
|||||||
assert not check_encrypted(msg)
|
assert not check_encrypted(msg)
|
||||||
|
|
||||||
|
|
||||||
|
def test_filtermail_securejoin_detection(maildata):
|
||||||
|
msg = maildata(
|
||||||
|
"securejoin-vc.eml", from_addr="some@example.org", to_addr="other@example.org"
|
||||||
|
)
|
||||||
|
assert is_securejoin(msg)
|
||||||
|
|
||||||
|
msg = maildata(
|
||||||
|
"securejoin-vc-fake.eml",
|
||||||
|
from_addr="some@example.org",
|
||||||
|
to_addr="other@example.org",
|
||||||
|
)
|
||||||
|
assert not is_securejoin(msg)
|
||||||
|
|
||||||
|
|
||||||
def test_filtermail_encryption_detection(maildata):
|
def test_filtermail_encryption_detection(maildata):
|
||||||
for subject in common_encrypted_subjects:
|
for subject in common_encrypted_subjects:
|
||||||
msg = maildata(
|
msg = maildata(
|
||||||
|
|||||||
Reference in New Issue
Block a user