diff --git a/test/test_milter.py b/test/test_milter.py index c25abf8..8c9a49d 100644 --- a/test/test_milter.py +++ b/test/test_milter.py @@ -9,13 +9,18 @@ @pytest.fixture def run_miltertest(request, milter, milter_config): - def _run_miltertest(headers=None, standard_headers=True, body='test body\r\n'): + def _run_miltertest( + headers=None, + standard_headers=True, + body='test body\r\n', + protocol=miltertest.SMFI_V6_PROT, + ): headers = copy.copy(headers) or [] if standard_headers: headers.extend( [ - ['From', 'user@example.com\n'], - ['Date', 'Fri, 04 Oct 2024 10:11:12 -0400'], + ['From', ' user@example.com\n'], + ['Date', ' Fri, 04 Oct 2024 10:11:12 -0400'], ['Subject', request.function.__name__], ] ) @@ -24,7 +29,7 @@ def _run_miltertest(headers=None, standard_headers=True, body='test body\r\n'): sock = socket.socket(family=socket.AF_UNIX) sock.connect(bytes(milter_config['sock'])) conn = miltertest.MilterConnection(sock) - conn.optneg_mta(protocol=miltertest.SMFI_V6_PROT ^ miltertest.SMFIP_HDR_LEADSPC) + conn.optneg_mta(protocol=protocol) conn.send(miltertest.SMFIC_CONNECT, hostname='localhost', address='127.0.0.1', family=miltertest.SMFIA_INET, port=666) conn.send(miltertest.SMFIC_HELO, helo='mx.example.com') @@ -60,6 +65,17 @@ def test_milter_basic(run_miltertest): """Basic signing""" res = run_miltertest() + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=none smtp.remote-ip=127.0.0.1'] + assert res['headers'][1][0] == 'ARC-Seal' + assert 'cv=none' in res['headers'][1][1] + assert res['headers'][2][0] == 'ARC-Message-Signature' + assert res['headers'][3] == ['ARC-Authentication-Results', ' i=1; example.com; arc=none smtp.remote-ip=127.0.0.1'] + + +def test_milter_v2(run_miltertest): + """Basic signing""" + res = run_miltertest(protocol=miltertest.SMFI_V2_PROT) + assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=none smtp.remote-ip=127.0.0.1'] assert res['headers'][1][0] == 'ARC-Seal' assert 'cv=none' in res['headers'][1][1] @@ -70,7 +86,7 @@ def test_milter_basic(run_miltertest): def test_milter_staticmsg(run_miltertest): headers = [ ['ARC-Seal', ( - 'i=1; cv=none; a=rsa-sha256; d=dkimpy.example.com; s=sel;\r\n' + ' i=1; cv=none; a=rsa-sha256; d=dkimpy.example.com; s=sel;\r\n' ' t=1728713840;\r\n' ' b=jmHJmDXHe4eFAurv+yXz1RTRLj+XNaHedD4GYWPt0XntR94pMNSFlU2TxT0rzkMcE4Nkt\r\n' ' xFrz0OYVfexpgNJ393tO8czBH4OwEwV2E5h+U/8N1vM+KHKfcg2n02SOxUa991Z1+CXUrO6\r\n' @@ -79,7 +95,7 @@ def test_milter_staticmsg(run_miltertest): ' gGinobwxRu7skmTPq0TSlBQQ/1fuxpSOpocjnY+E/g3FH3ZsAtbOG2jVYd9w==' )], ['ARC-Message-Signature', ( - 'i=1; a=rsa-sha256; c=relaxed/relaxed;\r\n' + ' i=1; a=rsa-sha256; c=relaxed/relaxed;\r\n' ' d=dkimpy.example.com; s=sel; t=1728713840; h=content-type :\r\n' ' mime-version : content-transfer-encoding : subject : from : to : from;\r\n' ' bh=Pb6s/Xlf4u1eDlYyO0NCaMRMrCg6xDNkK5byz8RDY1s=;\r\n' @@ -89,20 +105,20 @@ def test_milter_staticmsg(run_miltertest): ' Q+eZZxcT7W2MWaByV2Jjz4B+sh0IzfX2wPNsGOsNpD+MvpehQsa9ig7eEndNWw7V1qpaMN+\r\n' ' vtOnb5H80nu0K4H7fvrNUI4h4b+UTumqR/HhiNTFRobUGiwuvrP4CWHj3dtQ==\r\n' )], - ['ARC-Authentication-Results', 'i=1; dkimpy.example.com'], - ['Content-Type', 'text/plain; charset="us-ascii"'], - ['MIME-Version', '1.0'], - ['Content-Transfer-Encoding', '7bit'], - ['Subject', 'test message from dkimpy'], - ['From', 'testsender@example.com'], - ['To', 'testrcpt@example.com'], + ['ARC-Authentication-Results', ' i=1; dkimpy.example.com'], + ['Content-Type', ' text/plain; charset="us-ascii"'], + ['MIME-Version', ' 1.0'], + ['Content-Transfer-Encoding', ' 7bit'], + ['Subject', ' test message from dkimpy'], + ['From', ' testsender@example.com'], + ['To', ' testrcpt@example.com'], ] res = run_miltertest(headers, False, 'test message\r\n') - assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=pass smtp.remote-ip=127.0.0.1'] + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=pass smtp.remote-ip=127.0.0.1'] assert res['headers'][1][0] == 'ARC-Seal' assert 'cv=pass' in res['headers'][1][1] assert res['headers'][2][0] == 'ARC-Message-Signature' - assert res['headers'][3] == ['ARC-Authentication-Results', 'i=2; example.com; arc=pass smtp.remote-ip=127.0.0.1'] + assert res['headers'][3] == ['ARC-Authentication-Results', ' i=2; example.com; arc=pass smtp.remote-ip=127.0.0.1'] def test_milter_resign(run_miltertest): @@ -114,10 +130,10 @@ def test_milter_resign(run_miltertest): headers = [*res['headers'], *headers] res = run_miltertest(headers) - assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=pass smtp.remote-ip=127.0.0.1'] + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=pass smtp.remote-ip=127.0.0.1'] if i <= 50: - assert res['headers'][3] == ['ARC-Authentication-Results', f'i={i}; example.com; arc=pass smtp.remote-ip=127.0.0.1'] + assert res['headers'][3] == ['ARC-Authentication-Results', f' i={i}; example.com; arc=pass smtp.remote-ip=127.0.0.1'] assert 'cv=pass' in res['headers'][1][1] # quick and dirty parsing @@ -135,7 +151,7 @@ def test_milter_mode_s(run_miltertest): assert len(res['headers']) == 3 assert 'cv=none' in res['headers'][0][1] assert res['headers'][1][0] == 'ARC-Message-Signature' - assert res['headers'][2] == ['ARC-Authentication-Results', 'i=1; example.com; arc=none smtp.remote-ip=127.0.0.1'] + assert res['headers'][2] == ['ARC-Authentication-Results', ' i=1; example.com; arc=none smtp.remote-ip=127.0.0.1'] def test_milter_mode_v(run_miltertest): @@ -143,7 +159,7 @@ def test_milter_mode_v(run_miltertest): res = run_miltertest() assert len(res['headers']) == 1 - assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=none smtp.remote-ip=127.0.0.1'] + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=none smtp.remote-ip=127.0.0.1'] def test_milter_mode_none_verify(run_miltertest): @@ -151,7 +167,7 @@ def test_milter_mode_none_verify(run_miltertest): res = run_miltertest() assert len(res['headers']) == 1 - assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=none smtp.remote-ip=127.0.0.1'] + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=none smtp.remote-ip=127.0.0.1'] def test_milter_mode_none_sign(run_miltertest): @@ -161,7 +177,7 @@ def test_milter_mode_none_sign(run_miltertest): assert len(res['headers']) == 3 assert 'cv=none' in res['headers'][0][1] assert res['headers'][1][0] == 'ARC-Message-Signature' - assert res['headers'][2] == ['ARC-Authentication-Results', 'i=1; example.com; arc=none smtp.remote-ip=127.0.0.1'] + assert res['headers'][2] == ['ARC-Authentication-Results', ' i=1; example.com; arc=none smtp.remote-ip=127.0.0.1'] @pytest.mark.parametrize( @@ -360,7 +376,7 @@ def test_milter_ar(run_miltertest, data): """Test Authentication-Results parsing""" res = run_miltertest([['Authentication-Results', x] for x in data[0]]) - assert res['headers'][3] == ['ARC-Authentication-Results', f'i=1; example.com; {data[1]}'] + assert res['headers'][3] == ['ARC-Authentication-Results', f' i=1; example.com; {data[1]}'] def test_milter_ar_override(run_miltertest): @@ -373,9 +389,9 @@ def test_milter_ar_override(run_miltertest): res = run_miltertest(headers) - assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=fail smtp.remote-ip=127.0.0.1'] + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=fail smtp.remote-ip=127.0.0.1'] assert 'cv=fail' in res['headers'][1][1] - assert res['headers'][3] == ['ARC-Authentication-Results', 'i=2; example.com; arc=fail'] + assert res['headers'][3] == ['ARC-Authentication-Results', ' i=2; example.com; arc=fail'] # override the result to "pass" headers = [*res['headers'], *headers] @@ -383,7 +399,7 @@ def test_milter_ar_override(run_miltertest): res = run_miltertest(headers) # the chain is dead because it came in as failed, no matter what A-R says - assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=fail smtp.remote-ip=127.0.0.1'] + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=fail smtp.remote-ip=127.0.0.1'] assert len(res['headers']) == 1 @@ -393,13 +409,13 @@ def test_milter_ar_override_disabled(run_miltertest): # override the result to "fail" headers = res['headers'] - headers[0][1] = 'example.com; arc=fail' + headers[0][1] = ' example.com; arc=fail' res = run_miltertest(headers) - assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=pass smtp.remote-ip=127.0.0.1'] + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=pass smtp.remote-ip=127.0.0.1'] assert 'cv=pass' in res['headers'][1][1] - assert res['headers'][3] == ['ARC-Authentication-Results', 'i=2; example.com; arc=pass smtp.remote-ip=127.0.0.1'] + assert res['headers'][3] == ['ARC-Authentication-Results', ' i=2; example.com; arc=pass smtp.remote-ip=127.0.0.1'] def test_milter_ar_override_multi(run_miltertest): @@ -413,9 +429,9 @@ def test_milter_ar_override_multi(run_miltertest): ] res = run_miltertest(headers) - assert res['headers'][0] == ['Authentication-Results', 'example.com; arc=pass smtp.remote-ip=127.0.0.1'] + assert res['headers'][0] == ['Authentication-Results', ' example.com; arc=pass smtp.remote-ip=127.0.0.1'] assert 'cv=pass' in res['headers'][1][1] - assert res['headers'][3] == ['ARC-Authentication-Results', 'i=2; example.com; arc=pass'] + assert res['headers'][3] == ['ARC-Authentication-Results', ' i=2; example.com; arc=pass'] def test_milter_seal_failed(run_miltertest): @@ -437,8 +453,8 @@ def test_milter_seal_failed(run_miltertest): def test_milter_authresip(run_miltertest): """AuthResIP false disables smtp.remote-ip""" res = run_miltertest() - assert res['headers'][0][1] == 'example.com; arc=none' - assert res['headers'][3][1] == 'i=1; example.com; arc=none' + assert res['headers'][0][1] == ' example.com; arc=none' + assert res['headers'][3][1] == ' i=1; example.com; arc=none' def test_milter_peerlist(run_miltertest): @@ -452,4 +468,4 @@ def test_milter_softwareheader(run_miltertest): res = run_miltertest() assert res['headers'][0][0] == 'ARC-Filter' - assert res['headers'][0][1].startswith('OpenARC Filter v') + assert res['headers'][0][1].startswith(' OpenARC Filter v')