Compare commits

..

6 Commits

Author SHA1 Message Date
holger krekel
ecdaf60e11 generalize remotelog to "remote" and offer remote.iter_output method 2023-10-16 20:02:08 +02:00
holger krekel
334f86f56f fix capturing of logging to capture postfix better 2023-10-16 19:48:54 +02:00
holger krekel
97f0911b6f fix bugs 2023-10-16 19:38:52 +02:00
holger krekel
c47778e03e simplify and speedup multi-chatmail instance support 2023-10-16 19:18:21 +02:00
holger krekel
1ed4ffebab add support for using a second chatmail server 2023-10-16 19:10:59 +02:00
holger krekel
e848fc10ac introduce remotelog fixture for capturing systemd-unit logs 2023-10-16 18:13:14 +02:00
10 changed files with 22 additions and 79 deletions

View File

@@ -52,7 +52,6 @@ scripts/
init.sh # create venv/other perequires init.sh # create venv/other perequires
deploy.sh # run pyinfra based deploy of everything deploy.sh # run pyinfra based deploy of everything
test.sh # run all local and online tests test.sh # run all local and online tests
bench.sh # run performance benchmark tests
``` ```

View File

@@ -95,7 +95,7 @@ def main():
while True: while True:
msg = self.rfile.readline().strip().decode() msg = self.rfile.readline().strip().decode()
if not msg: if not msg:
break continue
res = handle_dovecot_request(msg, db) res = handle_dovecot_request(msg, db)
if res: if res:
print(f"sending result: {res!r}", file=sys.stderr) print(f"sending result: {res!r}", file=sys.stderr)

View File

@@ -9,8 +9,9 @@ from aiosmtpd.controller import UnixSocketController
from smtplib import SMTP as SMTPClient from smtplib import SMTP as SMTPClient
def check_encrypted(message): def check_encrypted(content):
"""Check that the message is an OpenPGP-encrypted message.""" """Check that the message is an OpenPGP-encrypted message."""
message = BytesParser(policy=policy.default).parsebytes(content)
if not message.is_multipart(): if not message.is_multipart():
return False return False
if message.get("subject") != "...": if message.get("subject") != "...":
@@ -46,8 +47,7 @@ class ExampleHandler:
valid_recipients = [] valid_recipients = []
message = BytesParser(policy=policy.default).parsebytes(envelope.content) mail_encrypted = check_encrypted(envelope.content)
mail_encrypted = check_encrypted(message)
res = [] res = []
for recipient in envelope.rcpt_tos: for recipient in envelope.rcpt_tos:
@@ -68,13 +68,7 @@ class ExampleHandler:
continue continue
is_outgoing = recipient_local_domain[1] != my_local_domain[1] is_outgoing = recipient_local_domain[1] != my_local_domain[1]
if is_outgoing and not mail_encrypted:
if (
is_outgoing
and not mail_encrypted
and message.get("secure-join") != "vc-request"
and message.get("secure-join") != "vg-request"
):
res += ["500 Outgoing mail must be encrypted"] res += ["500 Outgoing mail must be encrypted"]
continue continue

View File

@@ -1,16 +1,12 @@
import pytest
from .filtermail import check_encrypted from .filtermail import check_encrypted
from email.parser import BytesParser
from email import policy
def test_filtermail(): def test_filtermail():
def check_encrypted_bstr(content): assert not check_encrypted(b"foo")
message = BytesParser(policy=policy.default).parsebytes(content)
return check_encrypted(message)
assert not check_encrypted_bstr(b"foo") assert not check_encrypted(
assert not check_encrypted_bstr(
"\r\n".join( "\r\n".join(
[ [
"Subject: =?utf-8?q?Message_from_foobar=40c2=2Etestrun=2Eorg?=", "Subject: =?utf-8?q?Message_from_foobar=40c2=2Etestrun=2Eorg?=",
@@ -40,7 +36,7 @@ def test_filtermail():
).encode() ).encode()
) )
assert not check_encrypted_bstr( assert not check_encrypted(
"\r\n".join( "\r\n".join(
[ [
"Subject: =?utf-8?q?Message_from_foobar=40c2=2Etestrun=2Eorg?=", "Subject: =?utf-8?q?Message_from_foobar=40c2=2Etestrun=2Eorg?=",
@@ -71,7 +67,7 @@ def test_filtermail():
) )
# https://xkcd.com/1181/ # https://xkcd.com/1181/
assert not check_encrypted_bstr( assert not check_encrypted(
"\r\n".join( "\r\n".join(
[ [
"Subject: =?utf-8?q?Message_from_foobar=40c2=2Etestrun=2Eorg?=", "Subject: =?utf-8?q?Message_from_foobar=40c2=2Etestrun=2Eorg?=",
@@ -103,7 +99,7 @@ def test_filtermail():
).encode() ).encode()
) )
assert check_encrypted_bstr( assert check_encrypted(
"\r\n".join( "\r\n".join(
[ [
"Subject: ...", "Subject: ...",
@@ -176,7 +172,7 @@ def test_filtermail():
).encode() ).encode()
) )
assert not check_encrypted_bstr( assert not check_encrypted(
"\r\n".join( "\r\n".join(
[ [
"Subject: Buy Penis Enlargement at www.malicious-domain.com", "Subject: Buy Penis Enlargement at www.malicious-domain.com",
@@ -249,7 +245,7 @@ def test_filtermail():
).encode() ).encode()
) )
assert not check_encrypted_bstr( assert not check_encrypted(
"\r\n".join( "\r\n".join(
[ [
"Subject: Message opened", "Subject: Message opened",

View File

@@ -1,34 +0,0 @@
def test_tls_serialized_connect(benchmark, imap_or_smtp):
def connect():
imap_or_smtp.connect()
benchmark(connect)
def test_login(benchmark, imap_or_smtp, gencreds):
cls = imap_or_smtp.__class__
conns = []
for i in range(20):
conn = cls(imap_or_smtp.host)
conn.connect()
conns.append(conn)
def login():
conn = conns.pop()
conn.login(*gencreds())
benchmark(login)
def test_send_and_receive_10(benchmark, cmfactory, lp):
"""send many messages between two accounts"""
ac1, ac2 = cmfactory.get_online_accounts(2)
chat = cmfactory.get_accepted_chat(ac1, ac2)
def send_10_receive_all():
for i in range(10):
chat.send_text(f"hello {i}")
for i in range(10):
ac2.wait_next_incoming_message()
benchmark(send_10_receive_all)

View File

@@ -67,17 +67,3 @@ class TestEndToEndDeltaChat:
break break
pytest.fail("sending succeeded although messages should exceed quota") pytest.fail("sending succeeded although messages should exceed quota")
def test_securejoin(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("ac1: create QR code and let ac2 scan it, starting the securejoin")
qr = ac1.get_setup_contact_qr()
lp.sec("ac2: start QR-code based setup contact protocol")
ch = ac2.qr_setup_contact(qr)
assert ch.id >= 10
ac1._evtracker.wait_securejoin_inviter_progress(1000)

View File

@@ -8,6 +8,12 @@
- limit: configure max-connections per account - limit: configure max-connections per account
## Filtermail
- (alex, Only allow (outgoing) mails if secure-join or autocrypt-pgp-encrypted format.
TODO: mime-parse mails and check/add tests
## nami: send out rate limit / rspamd ## nami: send out rate limit / rspamd
- basic outgoing send rate/limits (depending on "account-rating") - basic outgoing send rate/limits (depending on "account-rating")

View File

@@ -1,4 +0,0 @@
#!/bin/bash
set -e
online-tests/venv/bin/pytest online-tests/benchmark.py -vrx

View File

@@ -10,7 +10,7 @@ chatmaild/venv/bin/pip install pytest
chatmaild/venv/bin/pip install -e chatmaild chatmaild/venv/bin/pip install -e chatmaild
python3 -m venv online-tests/venv python3 -m venv online-tests/venv
online-tests/venv/bin/pip install pytest pytest-timeout pdbpp deltachat pytest-benchmark online-tests/venv/bin/pip install pytest pytest-timeout pdbpp deltachat
python3 -m venv venv python3 -m venv venv
venv/bin/pip install build venv/bin/pip install build

View File

@@ -4,4 +4,4 @@ pushd chatmaild/src/chatmaild
../../venv/bin/pytest ../../venv/bin/pytest
popd popd
online-tests/venv/bin/pytest online-tests/ -vrx --durations=5 online-tests/venv/bin/pytest online-tests/ -vrx --durations=5 --slow