20141017 Sendmail compatibility: Postfix "hides" its own auto-generated headers from Milter applications in a more Sendmail-compatible manner. This should address any remaining visiblity issues with message headers inserted by Milters. Files: cleanup/cleanup.h, cleanup/cleanup_message.c, cleanup/cleanup_state.c, milter/milter.[hc], milter/milter8.c. diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro --exclude=Makefile.in --exclude=INSTALL -ur /var/tmp/postfix-2.11.2/src/cleanup/cleanup.h ./src/cleanup/cleanup.h --- /var/tmp/postfix-2.11.2/src/cleanup/cleanup.h 2013-11-23 19:39:32.000000000 -0500 +++ ./src/cleanup/cleanup.h 2014-10-17 15:24:51.000000000 -0400 @@ -61,6 +61,7 @@ char *orig_rcpt; /* original recipient address */ char *return_receipt; /* return-receipt address */ char *errors_to; /* errors-to address */ + ARGV *auto_hdrs; /* MTA's own header(s) */ int flags; /* processing options, status flags */ int qmgr_opts; /* qmgr processing options */ int errs; /* any badness experienced */ diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro --exclude=Makefile.in --exclude=INSTALL -ur /var/tmp/postfix-2.11.2/src/cleanup/cleanup_message.c ./src/cleanup/cleanup_message.c --- /var/tmp/postfix-2.11.2/src/cleanup/cleanup_message.c 2013-11-12 12:53:03.000000000 -0500 +++ ./src/cleanup/cleanup_message.c 2014-10-17 15:31:28.000000000 -0400 @@ -479,6 +479,10 @@ if (hdr_opts && (hdr_opts->flags & HDR_OPT_MIME)) header_class = MIME_HDR_MULTIPART; + /* XXX Increment Received: header count before dropping headers below. */ + if (hdr_opts && hdr_opts->type == HDR_RECEIVED) + state->hop_count += 1; + if ((state->flags & CLEANUP_FLAG_FILTER) && (CHECK(MIME_HDR_PRIMARY, cleanup_header_checks, VAR_HEADER_CHECKS) || CHECK(MIME_HDR_MULTIPART, cleanup_mimehdr_checks, VAR_MIMEHDR_CHECKS) @@ -579,9 +583,13 @@ msg_info("%s: message-id=%s", state->queue_id, hdrval); if (hdr_opts->type == HDR_RESENT_MESSAGE_ID) msg_info("%s: resent-message-id=%s", state->queue_id, hdrval); - if (hdr_opts->type == HDR_RECEIVED) - if (++state->hop_count >= var_hopcount_limit) + if (hdr_opts->type == HDR_RECEIVED) { + if (state->hop_count >= var_hopcount_limit) state->errs |= CLEANUP_STAT_HOPS; + /* Save our own Received: header after it is modified above. */ + if (state->hop_count == 1) + argv_add(state->auto_hdrs, vstring_str(header_buf), ARGV_END); + } if (CLEANUP_OUT_OK(state)) { if (hdr_opts->flags & HDR_OPT_RR) state->resent = "Resent-"; diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro --exclude=Makefile.in --exclude=INSTALL -ur /var/tmp/postfix-2.11.2/src/cleanup/cleanup_milter.c ./src/cleanup/cleanup_milter.c --- /var/tmp/postfix-2.11.2/src/cleanup/cleanup_milter.c 2013-11-23 20:25:40.000000000 -0500 +++ ./src/cleanup/cleanup_milter.c 2014-10-17 15:24:51.000000000 -0400 @@ -2020,7 +2020,7 @@ * filter library. */ if ((resp = milter_message(milters, state->handle->stream, - state->data_offset)) != 0) + state->data_offset, state->auto_hdrs)) != 0) cleanup_milter_apply(state, "END-OF-MESSAGE", resp); /* diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro --exclude=Makefile.in --exclude=INSTALL -ur /var/tmp/postfix-2.11.2/src/cleanup/cleanup_state.c ./src/cleanup/cleanup_state.c --- /var/tmp/postfix-2.11.2/src/cleanup/cleanup_state.c 2013-11-23 19:37:19.000000000 -0500 +++ ./src/cleanup/cleanup_state.c 2014-10-17 15:24:51.000000000 -0400 @@ -78,6 +78,7 @@ state->orig_rcpt = 0; state->return_receipt = 0; state->errors_to = 0; + state->auto_hdrs = argv_alloc(1); state->flags = 0; state->qmgr_opts = 0; state->errs = 0; @@ -151,6 +152,7 @@ myfree(state->return_receipt); if (state->errors_to) myfree(state->errors_to); + argv_free(state->auto_hdrs); if (state->queue_name) myfree(state->queue_name); if (state->queue_id) diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro --exclude=Makefile.in --exclude=INSTALL -ur /var/tmp/postfix-2.11.2/src/milter/milter.c ./src/milter/milter.c --- /var/tmp/postfix-2.11.2/src/milter/milter.c 2011-10-24 10:28:38.000000000 -0400 +++ ./src/milter/milter.c 2014-10-17 15:24:51.000000000 -0400 @@ -85,10 +85,11 @@ /* const char *milter_other_event(milters) /* MILTERS *milters; /* -/* const char *milter_message(milters, qfile, data_offset) +/* const char *milter_message(milters, qfile, data_offset, auto_hdrs) /* MILTERS *milters; /* VSTREAM *qfile; /* off_t data_offset; +/* ARGV *auto_hdrs; /* /* const char *milter_abort(milters) /* MILTERS *milters; @@ -481,7 +482,8 @@ /* milter_message - inspect message content */ -const char *milter_message(MILTERS *milters, VSTREAM *fp, off_t data_offset) +const char *milter_message(MILTERS *milters, VSTREAM *fp, off_t data_offset, + ARGV *auto_hdrs) { const char *resp; MILTER *m; @@ -495,7 +497,8 @@ for (resp = 0, m = milters->milter_list; resp == 0 && m != 0; m = m->next) { any_eoh_macros = MILTER_MACRO_EVAL(global_eoh_macros, m, milters, eoh_macros); any_eod_macros = MILTER_MACRO_EVAL(global_eod_macros, m, milters, eod_macros); - resp = m->message(m, fp, data_offset, any_eoh_macros, any_eod_macros); + resp = m->message(m, fp, data_offset, any_eoh_macros, any_eod_macros, + auto_hdrs); if (any_eoh_macros != global_eoh_macros) argv_free(any_eoh_macros); if (any_eod_macros != global_eod_macros) diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro --exclude=Makefile.in --exclude=INSTALL -ur /var/tmp/postfix-2.11.2/src/milter/milter.h ./src/milter/milter.h --- /var/tmp/postfix-2.11.2/src/milter/milter.h 2009-04-27 10:53:56.000000000 -0400 +++ ./src/milter/milter.h 2014-10-17 15:24:51.000000000 -0400 @@ -40,7 +40,7 @@ const char *(*mail_event) (struct MILTER *, const char **, ARGV *); const char *(*rcpt_event) (struct MILTER *, const char **, ARGV *); const char *(*data_event) (struct MILTER *, ARGV *); - const char *(*message) (struct MILTER *, VSTREAM *, off_t, ARGV *, ARGV *); + const char *(*message) (struct MILTER *, VSTREAM *, off_t, ARGV *, ARGV *, ARGV *); const char *(*unknown_event) (struct MILTER *, const char *, ARGV *); const char *(*other_event) (struct MILTER *); void (*abort) (struct MILTER *); @@ -136,7 +136,7 @@ extern const char *milter_mail_event(MILTERS *, const char **); extern const char *milter_rcpt_event(MILTERS *, int, const char **); extern const char *milter_data_event(MILTERS *); -extern const char *milter_message(MILTERS *, VSTREAM *, off_t); +extern const char *milter_message(MILTERS *, VSTREAM *, off_t, ARGV *); extern const char *milter_unknown_event(MILTERS *, const char *); extern const char *milter_other_event(MILTERS *); extern void milter_abort(MILTERS *); diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro --exclude=Makefile.in --exclude=INSTALL -ur /var/tmp/postfix-2.11.2/src/milter/milter8.c ./src/milter/milter8.c --- /var/tmp/postfix-2.11.2/src/milter/milter8.c 2013-11-18 14:45:07.000000000 -0500 +++ ./src/milter/milter8.c 2014-10-17 15:24:51.000000000 -0400 @@ -2285,6 +2285,7 @@ MILTER8 *milter; /* milter client */ ARGV *eoh_macros; /* end-of-header macros */ ARGV *eod_macros; /* end-of-body macros */ + ARGV *auto_hdrs; /* auto-generated headers */ int first_header; /* first header */ int first_body; /* first body line */ const char *resp; /* milter application response */ @@ -2301,6 +2302,7 @@ MILTER8 *milter = msg_ctx->milter; char *cp; int skip_reply; + char **cpp; /* * XXX Workaround: mime_state_update() may invoke multiple call-backs @@ -2329,10 +2331,9 @@ * XXX Sendmail compatibility. It eats the first space (not tab) after the * header label and ":". */ - if (msg_ctx->first_header) { - msg_ctx->first_header = 0; - return; - } + for (cpp = msg_ctx->auto_hdrs->argv; *cpp; cpp++) + if (strcmp(*cpp, STR(buf)) == 0) + return; /* * Sendmail 8 sends multi-line headers as text separated by newline. @@ -2507,7 +2508,8 @@ static const char *milter8_message(MILTER *m, VSTREAM *qfile, off_t data_offset, ARGV *eoh_macros, - ARGV *eod_macros) + ARGV *eod_macros, + ARGV *auto_hdrs) { const char *myname = "milter8_message"; MILTER8 *milter = (MILTER8 *) m; @@ -2541,6 +2543,7 @@ msg_ctx.milter = milter; msg_ctx.eoh_macros = eoh_macros; msg_ctx.eod_macros = eod_macros; + msg_ctx.auto_hdrs = auto_hdrs; msg_ctx.first_header = 1; msg_ctx.first_body = 1; msg_ctx.resp = 0;