John Fawcett: > On 01/01/2019 17:56, Wietse Venema wrote: > > John Fawcett: > >>>> JFTR, this is what a full implementation would look like. > >>>> A full implementation would update a new SMTP_STATE violation_mask > >>>> field for specific violation categories (syntax, pipelining, > >>>> plaintext, relay, unverified-address, unknown-user, access-deny, > >>>> dnsbl, tls-handshake, lost-connection, timeout, etc). > >>>> > >>>> This has a huge code footprint, because every piece of code that > >>>> detects a violation will need to set a violation category bit. TBD > >>>> is which error categories: we don't want too few (then we could > >>>> just use the existing 'protocol', 'software', 'policy', 'resource', > >>>> etc. break-down) or too many buckets. > >>>> > >>>> For output, the implementation would use str_name_mask(), probably > >>>> called from a separate function smtpd_format_error_stats(). > >>>> > >>>> Wietse > >>> Thanks for the feedback. > >>> > >>> I can take a look at it, but aside from time, I agree that any invasive > >>> modifications would be better done in a new experimental release. I also > >>> would not put the a temporary modification in 3.4 since people may > >>> become accustomed to it, when it is likely to change again. > >>> > >>> John > >>> > >> To take this one step further, I have documented the current behaviour > >> for errors during the smtp chat, indicating whether they are chatted to > >> the client, logged to maillog and whether they set existing error flags. > >> I did that so far for smtpd.c, smtpd_sasl_glue.c and smtpd_sasl_proto.c > >> from postfix-3.4-20181229-nonprod. I did not include normal smtp chats, > >> verbose logging or logging done outside an smtp session or done during > >> initializations. > >> > >> I suppose that the next step would be to evalute which of these errors > >> are worthy of being reported in the disconnect line, with a particular > >> eye to errors that are currently not logged in the maillog and that > >> would not be available if postmaster notifications are disabled (more > >> likely for PROTOCOL and POLICY errors). > >> > >> Any thoughts about this approach? PS the attachment is a LibreOffice > >> spreadsheet. Let's see if it gets through. > > Basically everything that detects a violation sets state->error_mask, > > and there would need to be another line of code that sets a violation > > type bit. That's about 124 places. I don't see that smtpd_chat.c > > is in a violation detection code path; it reports violations that > > are detected elsewhere. > > > > Wietse > > smtp_chat.c wasn't one of the files I looked at but I agree it is not > relevant. For clarity: the "smtp chat" column in the spreadhset is to > contextualize what errors are being sent back to the client. > > Grepping on MAIL_ERROR_* errors for smtpd directory, I get > > MAIL_ERROR_POLICY 32
Many policy violations are reported with smtpd_check_reject() calls, including this one: /* * Deny relaying between sites that both are not in relay_domains. */ return (smtpd_check_reject(state, MAIL_ERROR_POLICY, var_relay_code, "5.7.1", "<%s>: %s rejected: Relay access denied", reply_name, reply_class)); In my initial strawman, this would be flagged as a 'relay' violation. > MAIL_ERROR_PROTOCOL 74 (1 is in excluded code) Lots of 'bad syntax', disabled commands, but also pipelining. > MAIL_ERROR_RESOURCE 3 > > MAIL_ERROR_SOFTWARE 8 > > MAIL_ERROR_BOUNCE 2 > > MAIL_ERROR_DATA 1 > > and I've tracked all of them in the revised spreadsheet as well as > correcting a copy and paste error in the last few lines of the previous > version. > > In column H I have added the proposal for the new violation_mask bucket. > I have only done that for errors that are currently flagged as > violations in error_mask, plus the following additional cases: > > * in smtpd_proto(), when smtpd_client_connection_rate_limit exceeded > * in smtpd_proto() for improper pipelining > > Maybe I put too many buckets, but they can be condensed. From the > example buckets you gave, I didn't find places where the following were > flagged as violations: relay, unverified-address, unknown-user, dnsbl, > tls-handshake, lost connection and timeout. That needs more work. There > was also one that I could not classify (see ???? in column H). 'user unknown' is reported as a MAIL_ERROR_BOUNCE conditon by calling smtpd_check_reject(). return (smtpd_check_reject(state, MAIL_ERROR_BOUNCE, var_local_rcpt_code, strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ? "5.1.0" : "5.1.1", "<%s>: %s rejected: User unknown%s", recipient, reply_class, var_show_unk_rcpt_table ? " in local recipient table" : "")); I don't have time to investigate the other ones but expect that many of them will also buried in smtpd_check_reject() calls. Wietse