[Mailman-Developers] ANNOUNCE: GNU Mailman 3.0a1 (Leave That Thing Alone)

Ian Eiloart iane at sussex.ac.uk
Wed Apr 9 20:42:17 CEST 2008



--On 8 April 2008 22:10:58 -0400 Barry Warsaw <barry at list.org> wrote:

> After far too long, I'm finally happy to announce the availability of
> GNU Mailman version 3.0 alpha 1, code name "Leave That Thing Alone".

This is great news.

I've downloaded the code, and had a look at the LMTP server code, which I'm 
looking forward to. I'm hoping that it will permit integration with Exim in 
a way (LMTP call forwards) that gives us something sensible to do with 
messages from forbidden posters.

Unfortunately, it doesn't. But, if the following seems sensible, then I'm 
willing to implement it:

The LMTP server is implemented as a subclass of Python's built in 
SMTPServer, which seems to have only one method: process_message. That must 
be run too late to give any useful information to a callforward. However, 
on closer inspection, there's a "channel" class which inherits from 
smtpd.SMTPChannel. This seems to override some useful looking methods:

    def smtp_LHLO(self, arg):
    def smtp_HELO(self, arg):

Ah, and the source suggests to me that overriding smtp_RCPT is feasible. 
That's the place to check whether the list exists (and whether the sender 
is permitted to post - but let's do one thing at a time).

Validating the recipient
------------------------

All that's required is that the code which checks the existence of a list 
is moved from process_message to smtp_RCPT, and it's modified to 
"self.__rcpttos.append(address)" when the address is valid, but not 
otherwise. Thus, we build rcpttos instead of reading from it. LMTP requires 
a reply after DATA for only those addresses that haven't been rejected at 
RCPT. If I'm reading the code correctly, then a 550 error would be 
generated if the queue disappeared between RCTP and DATA (by virtue of the 
exception being thrown by queue.enqueue().

Validating the sender
---------------------

Now, as to the question of determining whether the message sender is 
permitted to post to a list, that's a bit more complicated. As far as I can 
see, all the logic for this is in moderate.py - in the "process" function. 
But, the decision is all tangled up with with the actions.

I propose an additional function, to be called from process, or by the lmtp 
server in smtp_RCPT: perhaps post_action(list, sender) which returns the 
name of the action to take when "sender" posts to the list "list". I guess 
it will return one of "accept", "discard", "reject", or "hold", and the 
lmtp server should reject (not bounce) the message if "reject" or "discard" 
is returned. It might be nice to introduce a distinction between bounce and 
reject. For example, a site admin might decide to permit bounce messages to 
be generated for local mail domains.

-- 
Ian Eiloart
IT Services, University of Sussex
x3148


More information about the Mailman-Developers mailing list