On Feb 7, 2006, at 8:15 PM, Brian J. France wrote:

Hi Rian,

Before I started converting my other modules to the new code I figured I would start with writing a new module to handle the SIZE extension. I needed to apply the following patch (link below) to the mod_smtpd code to get access at the max data size.

+0, Well this is an interesting point. The max data size should be settable and gettable from extending modules. In a way max_data is a lot like the list of extensions: should it be set on every connection or upon server initialization (ie should it's scope be per connection or per mod_smtpd instance). I chose that the list of extensions might want to be per-connection since modules may not want to offer all clients all extensions, just the same way modules may want to enforce different max_data sizes for different clients. Where do you think these variables belong?

One thing I do know is that max_data doesn't belong in mod_smtpd's configuration structure and rather either in some other "per mod_smtpd instance" structure accessible to extending modules or just in scr (the per connection structure). Right? I think that would be cleaner and more modular. We should talk about this some more before I apply this patch.

I hooked the mail from hook, check for a valid SIZE in mail_parameters and check to make sure it is not over the limit. If it is over the limit I can use smtpd_respond_oneline to send the 552 "message exceeds fixed maximum message size" line back to the client, but what should the function return to make it force a QUIT or REST command as anything but SMTPD_DONE sends more stuff to the client.

Should I just return SMTPD_DONE and set scr->should_disconnect? Could we tweak it to support two different settings, one would only allow QUIT only and the other would allow QUIT and REST (to start over).

+1, Since quit and rset are both handled by mod_smtpd there should probably be another variable called scr->only_quit_or_rset, also because I think there are other times when the client should only issue a quit or rset. More discussion follows though:

My basic design strategy has been that mod_smtpd should do as little as possible or what will be practical to a large amount of extending modules. If mod_smtpd sets a variable in a structure it should use it. If an extending module sets a variable in a structure it should use it. Having an "only_quit_or_rset" variable in the scr structure with mod_smtpd consciously checking for it, but never changing the value itself sort of violates that strategy. That doesn't mean I'm against it because like I already mentioned I think a lot of modules will need this sort of thing.

Have you thought about hooking into all the commands, and then sending a "503 Only QUIT and RSET" from your SIZE module until a rset is received?

I only added the scr->should_disconnect logic since it's what should happen when a simple module wants to SMTPD_DENY some connections. I didn't want every module that wanted to implement connection policy to have to deal with being hooked into all the commands, and just be able to return SMTPD_DENY.

The scr->should_disconnect situation I just explained (where I didn't want every modules to have to deal with hooking all the commands for a redundant task) could be applied to any potential module that wants to disallow any of the built in commands with instead a bit-field that specifies which mod_smtpd core commands are currently allowed. I think I like this idea the best, what do you think?

Rian Hunter



Reply via email to