Skip to content

Header & body state not reset on abort

Reproduced from GH-2

The following from https://github.com/domsekotill/kilter.service/issues/2 shows an issue when sending multiple messages in a single session, which seems to be related to headers (and body) accessors not being reset on receipt of an Abort.

Milter code

import logging

import anyio
from kilter.protocol import Accept
from kilter.service import Runner, Session

logging.basicConfig(level=logging.DEBUG)

logger = logging.getLogger(__name__)


async def tryme(session: Session) -> Accept:
    await session.headers.collect()
    async with session.headers as headers:
        async for header in headers:
            logger.info(f"{header.name} -> {header.value!r}")

    return Accept()


async def main() -> None:
    listener = await anyio.create_tcp_listener(local_host="0.0.0.0", local_port=9000)
    await listener.serve(Runner(tryme))


if __name__ == "__main__":
    anyio.run(main)

Send messages with

#!/usr/bin/env python3                                                                           
                                                                                                 
import smtplib                                                                                   
                                                                                                 
frm = "test@kodo.org.uk"                                                                         
to = "root@smtp.test.kodo.org.uk"                                                                
msg = f"""                                                                                       
To: {to}                                                                                         
From: {frm}                                                                                      
Subject: Test                                                                                    
                                                                                                                                                                       
Multi message test emails                                                                                                                                              
""".lstrip()                                                                                                                                                           
                                                                                                                                                                       
                                                                                                                                                                       
with smtplib.SMTP() as client:                                                                                                                                         
    client.connect("postfix")                                                                                                                                          
    client.sendmail(frm, to, msg)                                                                                                                                      
    client.sendmail(frm, to, msg)                                                                                                                                      
    client.sendmail(frm, to, msg)                                                                                                                                      
    client.sendmail(frm, to, msg)

Postfix logs

postfix-1  | Feb 17 18:30:59 smtp postfix/smtpd[19]: connect from test-milter-1.test_test[172.24.0.3]
postfix-1  | Feb 17 18:30:59 smtp postfix/smtpd[19]: using backwards-compatible default setting mynetworks_style=subnet to permit request from client "test-milter-1.test_test[172.24.0.3]"
postfix-1  | Feb 17 18:30:59 smtp postfix/smtpd[19]: 3FC9C244824: client=test-milter-1.test_test[172.24.0.3]
postfix-1  | Feb 17 18:30:59 smtp postfix/cleanup[23]: 3FC9C244824: message-id=<>
postfix-1  | Feb 17 18:30:59 smtp postfix/qmgr[9]: 3FC9C244824: from=<test@kodo.org.uk>, size=342, nrcpt=1 (queue active)
postfix-1  | Feb 17 18:30:59 smtp postfix/smtpd[19]: warning: milter inet:milter:9000: can't read SMFIC_MAIL reply packet header: Application error
postfix-1  | Feb 17 18:30:59 smtp postfix/smtpd[19]: NOQUEUE: milter-reject: MAIL from test-milter-1.test_test[172.24.0.3]: 451 4.7.1 Service unavailable - try again later; from=<test@kodo.org.uk> proto=ESMTP helo=<[172.24.0.3]>
postfix-1  | Feb 17 18:30:59 smtp postfix/smtpd[19]: disconnect from test-milter-1.test_test[172.24.0.3] ehlo=1 mail=1/2 rcpt=1 data=1 rset=1 quit=1 commands=6/7
postfix-1  | Feb 17 18:30:59 smtp postfix/local[24]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
postfix-1  | Feb 17 18:30:59 smtp postfix/local[24]: 3FC9C244824: to=<root@smtp.test.kodo.org.uk>, relay=local, delay=0.12, delays=0.06/0.02/0/0.03, dsn=2.0.0, status=sent (delivered to mailbox)
postfix-1  | Feb 17 18:30:59 smtp postfix/qmgr[9]: 3FC9C244824: removed

Milter logs

milter-1  | DEBUG:kilter.service:received: Negotiate(version=6, action_flags=<ActionFlags.ALL: 511>, protocol_flags=<ProtocolFlags.NO_CONNECT|NO_HELO|NO_SENDER|NO_RECIPIENT|NO_BODY|NO_HEADERS|NO_END_OF_HEADERS|NO_UNKNOWN|NO_DATA|SKIP|REJECTED_RECIPIENT|NR_CONNECT|NR_HELO|NR_SENDER|NR_RECIPIENT|NR_DATA|NR_UNKNOWN|NR_END_OF_HEADERS|NR_BODY|NR_HEADER|HEADER_LEADING_SPACE: 2097151>, macros={})
milter-1  | INFO:kilter.service:Negotiating with MTA
milter-1  | DEBUG:kilter.service:sent: Negotiate(version=6, action_flags=<ActionFlags.ALL: 511>, protocol_flags=<ProtocolFlags.SKIP: 1024>, macros={})
milter-1  | DEBUG:kilter.service:received: Macro(stage=67, macros={'j': 'smtp.test.kodo.org.uk', '{daemon_name}': 'smtp.test.kodo.org.uk', '{daemon_addr}': '172.24.0.2', 'v': 'Postfix 3.7.11', '_': 'test-milter-1.test_test [172.24.0.3]'})
milter-1  | DEBUG:kilter.service:received: Connect(hostname='test-milter-1.test_test', address=IPv4Address('172.24.0.3'), port=46448)
milter-1  | INFO:kilter.service:Client connected from test-milter-1.test_test
milter-1  | DEBUG:kilter.service:sent: Continue()
milter-1  | DEBUG:kilter.service:received: Macro(stage=72, macros={})
milter-1  | DEBUG:kilter.service:received: Helo(hostname='[172.24.0.3]')
milter-1  | DEBUG:kilter.service:sent: Continue()
milter-1  | DEBUG:kilter.service:received: Macro(stage=77, macros={'{mail_addr}': 'test@kodo.org.uk', '{mail_host}': 'kodo.org.uk', '{mail_mailer}': 'smtp'})
milter-1  | DEBUG:kilter.service:received: EnvelopeFrom(sender=<memory at 0x7fc34f353b80>, arguments=[<memory at 0x7fc34f1f8340>])
milter-1  | DEBUG:kilter.service:sent: Continue()
milter-1  | DEBUG:kilter.service:received: Macro(stage=82, macros={'{rcpt_addr}': 'root@smtp.test.kodo.org.uk', '{rcpt_host}': 'smtp.test.kodo.org.uk', '{rcpt_mailer}': 'local'})
milter-1  | DEBUG:kilter.service:received: EnvelopeRecipient(recipient=<memory at 0x7fc34f353dc0>, arguments=[])
milter-1  | DEBUG:kilter.service:sent: Continue()
milter-1  | DEBUG:kilter.service:received: Macro(stage=84, macros={'i': '3FC9C244824'})
milter-1  | DEBUG:kilter.service:received: Data()
milter-1  | DEBUG:kilter.service:sent: Continue()
milter-1  | DEBUG:kilter.service:received: Macro(stage=76, macros={'i': '3FC9C244824'})
milter-1  | DEBUG:kilter.service:received: Header(name='To', value=<memory at 0x7fc34f1f81c0>)
milter-1  | DEBUG:kilter.service:sent: Continue()
milter-1  | DEBUG:kilter.service:received: Macro(stage=76, macros={'i': '3FC9C244824'})
milter-1  | DEBUG:kilter.service:received: Header(name='From', value=<memory at 0x7fc34f1f8340>)
milter-1  | DEBUG:kilter.service:sent: Continue()
milter-1  | DEBUG:kilter.service:received: Macro(stage=76, macros={'i': '3FC9C244824'})
milter-1  | DEBUG:kilter.service:received: Header(name='Subject', value=<memory at 0x7fc34f1f81c0>)
milter-1  | DEBUG:kilter.service:sent: Continue()
milter-1  | DEBUG:kilter.service:received: Macro(stage=78, macros={'i': '3FC9C244824'})
milter-1  | DEBUG:kilter.service:received: EndOfHeaders()
milter-1  | INFO:__main__:To -> b'root@smtp.test.kodo.org.uk'
milter-1  | INFO:__main__:From -> b'test@kodo.org.uk'
milter-1  | INFO:__main__:Subject -> b'Test'
milter-1  | INFO:kilter.service:Returning response Accept from tryme
milter-1  | DEBUG:kilter.service:sent: Accept()
milter-1  | DEBUG:kilter.service:received: Abort()
milter-1  | DEBUG:kilter.service:received: Macro(stage=77, macros={'{mail_addr}': 'test@kodo.org.uk', '{mail_host}': 'kodo.org.uk', '{mail_mailer}': 'smtp'})
milter-1  | DEBUG:kilter.service:received: EnvelopeFrom(sender=<memory at 0x7fc34f353f40>, arguments=[<memory at 0x7fc34f353880>])
milter-1  | INFO:__main__:To -> b'root@smtp.test.kodo.org.uk'
milter-1  | INFO:__main__:From -> b'test@kodo.org.uk'
milter-1  | INFO:__main__:Subject -> b'Test'
Edited by Dom Sekotill
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information