Wietse Venema: > Wietse Venema: > > Anton Yuzhaninov: > > > In postfix-2.5.4 environment variable CLIENT_HOSTNAME is not set at all, > > > if hostname is unknown. > > > > > > Older version work in different way - env variable CLIENT_HOSTNAME set to > > > string unknown. > > > > > > Why this change was change not listed in Changelog? > > > > Because it was not supposed to change in this way. > > Before 20080411, this bug was hidden by a different bug, where an > unknown remote client would show up as CLIENT_HOSTNAME=localhost > after mail was processed by a local content filter. > > 20080411 > > Bugfix (introduced Postfix 2.3): the queue manager would > initialize missing client logging attributes (from xforward) > with real client attributes. Fix: enable this backwards > compatibility feature only with queue files that don't > contain logging attributes. Problem reported by Liviu Daia. > Files *qmgr/qmgr_message.c. > > One possible fix is to have the Postfix SMTP server write all client > attributes to the queue file, including the attributes that are > known to have the value "unknown".
It is not that simple, so below is a workaround for Postfix 2.5 and 2.6 that avoids the trouble with empty client attribute values. The final solution may need some restructuring of the way the client attributes are handled; that is too much change for Postfix 2.5. Wietse diff -cr /var/tmp/postfix-2.6-20080903/src/local/command.c ./src/local/command.c *** /var/tmp/postfix-2.6-20080903/src/local/command.c Sat Nov 10 20:16:32 2007 --- ./src/local/command.c Wed Sep 24 20:33:55 2008 *************** *** 171,181 **** #define EXPORT_REQUEST(name, value) \ if ((value)[0]) argv_add(env, (name), (value), ARGV_END); ! EXPORT_REQUEST("CLIENT_HOSTNAME", state.msg_attr.request->client_name); ! EXPORT_REQUEST("CLIENT_ADDRESS", state.msg_attr.request->client_addr); EXPORT_REQUEST("CLIENT_HELO", state.msg_attr.request->client_helo); ! EXPORT_REQUEST("CLIENT_PROTOCOL", state.msg_attr.request->client_proto); EXPORT_REQUEST("SASL_METHOD", state.msg_attr.request->sasl_method); EXPORT_REQUEST("SASL_SENDER", state.msg_attr.request->sasl_sender); EXPORT_REQUEST("SASL_USERNAME", state.msg_attr.request->sasl_username); --- 171,185 ---- #define EXPORT_REQUEST(name, value) \ if ((value)[0]) argv_add(env, (name), (value), ARGV_END); + #define LOCAL_LOG_ATTR(x) (DEL_REQ_ATTR_AVAIL(x) ? (x) : "unknown") ! EXPORT_REQUEST("CLIENT_HOSTNAME", ! LOCAL_LOG_ATTR(state.msg_attr.request->client_name)); ! EXPORT_REQUEST("CLIENT_ADDRESS", ! LOCAL_LOG_ATTR(state.msg_attr.request->client_addr)); EXPORT_REQUEST("CLIENT_HELO", state.msg_attr.request->client_helo); ! EXPORT_REQUEST("CLIENT_PROTOCOL", ! LOCAL_LOG_ATTR(state.msg_attr.request->client_proto)); EXPORT_REQUEST("SASL_METHOD", state.msg_attr.request->sasl_method); EXPORT_REQUEST("SASL_SENDER", state.msg_attr.request->sasl_sender); EXPORT_REQUEST("SASL_USERNAME", state.msg_attr.request->sasl_username); diff -cr /var/tmp/postfix-2.6-20080903/src/pipe/pipe.c ./src/pipe/pipe.c *** /var/tmp/postfix-2.6-20080903/src/pipe/pipe.c Sun Jun 29 14:41:59 2008 --- ./src/pipe/pipe.c Wed Sep 24 20:34:19 2008 *************** *** 1201,1218 **** dict_update(PIPE_DICT_TABLE, PIPE_DICT_NEXTHOP, STR(buf)); } else dict_update(PIPE_DICT_TABLE, PIPE_DICT_NEXTHOP, request->nexthop); vstring_sprintf(buf, "%ld", (long) request->data_size); dict_update(PIPE_DICT_TABLE, PIPE_DICT_SIZE, STR(buf)); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_ADDR, ! request->client_addr); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_HELO, request->client_helo); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_NAME, ! request->client_name); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_PORT, ! request->client_port); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_PROTO, ! request->client_proto); dict_update(PIPE_DICT_TABLE, PIPE_DICT_SASL_METHOD, request->sasl_method); dict_update(PIPE_DICT_TABLE, PIPE_DICT_SASL_USERNAME, --- 1201,1221 ---- dict_update(PIPE_DICT_TABLE, PIPE_DICT_NEXTHOP, STR(buf)); } else dict_update(PIPE_DICT_TABLE, PIPE_DICT_NEXTHOP, request->nexthop); + + #define PIPE_LOG_ATTR(x) (DEL_REQ_ATTR_AVAIL(x) ? (x) : "unknown") + vstring_sprintf(buf, "%ld", (long) request->data_size); dict_update(PIPE_DICT_TABLE, PIPE_DICT_SIZE, STR(buf)); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_ADDR, ! PIPE_LOG_ATTR(request->client_addr)); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_HELO, request->client_helo); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_NAME, ! PIPE_LOG_ATTR(request->client_name)); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_PORT, ! PIPE_LOG_ATTR(request->client_port)); dict_update(PIPE_DICT_TABLE, PIPE_DICT_CLIENT_PROTO, ! PIPE_LOG_ATTR(request->client_proto)); dict_update(PIPE_DICT_TABLE, PIPE_DICT_SASL_METHOD, request->sasl_method); dict_update(PIPE_DICT_TABLE, PIPE_DICT_SASL_USERNAME,