mirror of
https://github.com/chatmail/relay.git
synced 2026-05-12 17:14:36 +00:00
Compare commits
10 Commits
scripts-te
...
reorgtest
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
77727e259e | ||
|
|
732fdb3dab | ||
|
|
fe648f4784 | ||
|
|
d43e046c5d | ||
|
|
3716f2e429 | ||
|
|
00b4c484ff | ||
|
|
0950d7ea8f | ||
|
|
7dd2d0b9b4 | ||
|
|
dd232689a7 | ||
|
|
c613ca24af |
@@ -34,34 +34,6 @@ def check_encrypted(message):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def check_mdn(message, envelope):
|
|
||||||
if len(envelope.rcpt_tos) != 1:
|
|
||||||
return False
|
|
||||||
|
|
||||||
for name in ["auto-submitted", "chat-version"]:
|
|
||||||
if not message.get(name):
|
|
||||||
return False
|
|
||||||
|
|
||||||
if message.get_content_type() != "multipart/report":
|
|
||||||
return False
|
|
||||||
|
|
||||||
body = message.get_body()
|
|
||||||
if body.get_content_type() != "text/plain":
|
|
||||||
return False
|
|
||||||
|
|
||||||
if list(body.iter_attachments()) or list(body.iter_parts()):
|
|
||||||
return False
|
|
||||||
|
|
||||||
# even with all mime-structural checks an attacker
|
|
||||||
# could try to abuse the subject or body to contain links or other
|
|
||||||
# annoyance -- we skip on checking subject/body for now as Delta Chat
|
|
||||||
# should evolve to create E2E-encrypted read receipts anyway.
|
|
||||||
# and then MDNs are just encrypted mail and can pass the border
|
|
||||||
# to other instances.
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
class SMTPController(Controller):
|
class SMTPController(Controller):
|
||||||
def factory(self):
|
def factory(self):
|
||||||
return SMTP(self.handler, **self.SMTP_kwargs)
|
return SMTP(self.handler, **self.SMTP_kwargs)
|
||||||
@@ -110,9 +82,6 @@ def check_DATA(envelope):
|
|||||||
if envelope.mail_from.lower() != from_addr.lower():
|
if envelope.mail_from.lower() != from_addr.lower():
|
||||||
return f"500 Invalid FROM <{from_addr!r}> for <{envelope.mail_from!r}>"
|
return f"500 Invalid FROM <{from_addr!r}> for <{envelope.mail_from!r}>"
|
||||||
|
|
||||||
if not mail_encrypted and check_mdn(message, envelope):
|
|
||||||
return
|
|
||||||
|
|
||||||
envelope_from_domain = from_addr.split("@").pop()
|
envelope_from_domain = from_addr.split("@").pop()
|
||||||
for recipient in envelope.rcpt_tos:
|
for recipient in envelope.rcpt_tos:
|
||||||
if envelope.mail_from == recipient:
|
if envelope.mail_from == recipient:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
venv/bin/tox -c chatmaild
|
tox -c chatmaild
|
||||||
venv/bin/tox -c deploy-chatmail
|
tox -c deploy-chatmail
|
||||||
venv/bin/pytest tests/online -vrx --durations=5 $@
|
venv/bin/pytest tests/online -vrx --durations=5 $@
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from chatmaild.filtermail import check_encrypted, check_DATA, SendRateLimiter, check_mdn
|
from chatmaild.filtermail import check_encrypted, check_DATA, SendRateLimiter
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
@@ -41,33 +41,8 @@ def test_filtermail_encryption_detection(maildata):
|
|||||||
assert not check_encrypted(msg)
|
assert not check_encrypted(msg)
|
||||||
|
|
||||||
|
|
||||||
def test_filtermail_is_mdn(maildata, gencreds):
|
def test_filtermail_mdn_is_not_encrypted(maildata):
|
||||||
from_addr = gencreds()[0]
|
assert not check_encrypted(maildata("mdn.eml"))
|
||||||
to_addr = gencreds()[0] + ".other"
|
|
||||||
msg = maildata("mdn.eml", from_addr, to_addr)
|
|
||||||
|
|
||||||
class env:
|
|
||||||
mail_from = from_addr
|
|
||||||
rcpt_tos = [to_addr]
|
|
||||||
content = msg.as_bytes()
|
|
||||||
|
|
||||||
assert check_mdn(msg, env)
|
|
||||||
print(msg.as_string())
|
|
||||||
assert not check_DATA(env)
|
|
||||||
|
|
||||||
|
|
||||||
def test_filtermail_to_multiple_recipients_no_mdn(maildata, gencreds):
|
|
||||||
from_addr = gencreds()[0]
|
|
||||||
to_addr = gencreds()[0] + ".other"
|
|
||||||
thirdaddr = gencreds()[0]
|
|
||||||
msg = maildata("mdn.eml", from_addr, to_addr)
|
|
||||||
|
|
||||||
class env:
|
|
||||||
mail_from = from_addr
|
|
||||||
rcpt_tos = [to_addr, thirdaddr]
|
|
||||||
content = msg.as_bytes()
|
|
||||||
|
|
||||||
assert not check_mdn(msg, env)
|
|
||||||
|
|
||||||
|
|
||||||
def test_send_rate_limiter():
|
def test_send_rate_limiter():
|
||||||
|
|||||||
@@ -290,7 +290,7 @@ class Remote:
|
|||||||
def maildata(request, gencreds):
|
def maildata(request, gencreds):
|
||||||
datadir = conftestdir.joinpath("mail-data")
|
datadir = conftestdir.joinpath("mail-data")
|
||||||
|
|
||||||
def maildata(name, from_addr=None, to_addr=None):
|
def maildata(name, parsed=True, from_addr=None, to_addr=None):
|
||||||
if from_addr is None:
|
if from_addr is None:
|
||||||
from_addr = gencreds()[0]
|
from_addr = gencreds()[0]
|
||||||
if to_addr is None:
|
if to_addr is None:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Subject: Message opened
|
Subject: Message opened
|
||||||
From: <{from_addr}>
|
From: <barbaz@c2.testrun.org>
|
||||||
To: <{to_addr}>
|
To: <foobar@c2.testrun.org>
|
||||||
Date: Sun, 15 Oct 2023 16:43:25 +0000
|
Date: Sun, 15 Oct 2023 16:43:25 +0000
|
||||||
Message-ID: <Mr.78MWtlV7RAi.goCFzBhCYfy@c2.testrun.org>
|
Message-ID: <Mr.78MWtlV7RAi.goCFzBhCYfy@c2.testrun.org>
|
||||||
Auto-Submitted: auto-replied
|
Auto-Submitted: auto-replied
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import time
|
|
||||||
import random
|
import random
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@@ -82,29 +81,3 @@ class TestEndToEndDeltaChat:
|
|||||||
ch = ac2.qr_setup_contact(qr)
|
ch = ac2.qr_setup_contact(qr)
|
||||||
assert ch.id >= 10
|
assert ch.id >= 10
|
||||||
ac1._evtracker.wait_securejoin_inviter_progress(1000)
|
ac1._evtracker.wait_securejoin_inviter_progress(1000)
|
||||||
|
|
||||||
def test_read_receipts_between_instances(self, cmfactory, lp, maildomain2):
|
|
||||||
ac1 = cmfactory.new_online_configuring_account(cache=False)
|
|
||||||
cmfactory.switch_maildomain(maildomain2)
|
|
||||||
ac2 = cmfactory.new_online_configuring_account(cache=False)
|
|
||||||
cmfactory.bring_accounts_online()
|
|
||||||
|
|
||||||
lp.sec("setup encrypted comms between ac1 and ac2 on different instances")
|
|
||||||
qr = ac1.get_setup_contact_qr()
|
|
||||||
ch = ac2.qr_setup_contact(qr)
|
|
||||||
msg = ac2.wait_next_incoming_message()
|
|
||||||
assert "verified" in msg.text
|
|
||||||
|
|
||||||
lp.sec("ac1 sends a message and ac2 marks it as seen")
|
|
||||||
chat = ac1.create_chat(ac2)
|
|
||||||
msg = chat.send_text("hi")
|
|
||||||
m = ac2.wait_next_incoming_message()
|
|
||||||
m.mark_seen()
|
|
||||||
# we can only indirectly wait for mark-seen to cause an smtp-error
|
|
||||||
lp.sec("try to wait for markseen to complete and check error states")
|
|
||||||
deadline = time.time() + 3.1
|
|
||||||
while time.time() < deadline:
|
|
||||||
msgs = m.chat.get_messages()
|
|
||||||
for msg in msgs:
|
|
||||||
assert "error" not in m.get_message_info()
|
|
||||||
time.sleep(1)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user