1204
1204
* Build the XFORWARD command. With properly sanitized
1205
1205
* information, the command length stays within the 512 byte
1206
1206
* command line length limit.
1208
* XXX smtpd_xforward_preset() initializes some fields as "unknown"
1209
* and some as null; historically, pickup(8) does not send any of
1210
* these, and the queue manager presets absent fields to "not
1211
* available" except for the rewrite context which is preset to
1212
* local by way of migration aid. These definitions need to be
1213
* centralized for maintainability.
1215
#ifndef CAN_FORWARD_CLIENT_NAME
1216
#define _ATTR_AVAIL_AND_KNOWN_(val) \
1217
(DEL_REQ_ATTR_AVAIL(val) && strcasecmp((val), "unknown"))
1218
#define CAN_FORWARD_CLIENT_NAME _ATTR_AVAIL_AND_KNOWN_
1219
#define CAN_FORWARD_CLIENT_ADDR _ATTR_AVAIL_AND_KNOWN_
1220
#define CAN_FORWARD_CLIENT_PORT _ATTR_AVAIL_AND_KNOWN_
1221
#define CAN_FORWARD_PROTO_NAME _ATTR_AVAIL_AND_KNOWN_
1222
#define CAN_FORWARD_HELO_NAME DEL_REQ_ATTR_AVAIL
1223
#define CAN_FORWARD_RWR_CONTEXT DEL_REQ_ATTR_AVAIL
1208
1226
case SMTP_STATE_XFORWARD_NAME_ADDR:
1209
1227
vstring_strcpy(next_command, XFORWARD_CMD);
1210
1228
if ((session->features & SMTP_FEATURE_XFORWARD_NAME)
1211
&& DEL_REQ_ATTR_AVAIL(request->client_name)) {
1229
&& CAN_FORWARD_CLIENT_NAME(request->client_name)) {
1212
1230
vstring_strcat(next_command, " " XFORWARD_NAME "=");
1213
1231
xtext_quote_append(next_command, request->client_name, "");
1215
1233
if ((session->features & SMTP_FEATURE_XFORWARD_ADDR)
1216
&& DEL_REQ_ATTR_AVAIL(request->client_addr)) {
1234
&& CAN_FORWARD_CLIENT_ADDR(request->client_addr)) {
1217
1235
vstring_strcat(next_command, " " XFORWARD_ADDR "=");
1218
1236
xtext_quote_append(next_command, request->client_addr, "");
1220
1238
if ((session->features & SMTP_FEATURE_XFORWARD_PORT)
1221
&& DEL_REQ_ATTR_AVAIL(request->client_port)) {
1239
&& CAN_FORWARD_CLIENT_PORT(request->client_port)) {
1222
1240
vstring_strcat(next_command, " " XFORWARD_PORT "=");
1223
1241
xtext_quote_append(next_command, request->client_port, "");
1231
1249
case SMTP_STATE_XFORWARD_PROTO_HELO:
1232
1250
vstring_strcpy(next_command, XFORWARD_CMD);
1233
1251
if ((session->features & SMTP_FEATURE_XFORWARD_PROTO)
1234
&& DEL_REQ_ATTR_AVAIL(request->client_proto)) {
1252
&& CAN_FORWARD_PROTO_NAME(request->client_proto)) {
1235
1253
vstring_strcat(next_command, " " XFORWARD_PROTO "=");
1236
1254
xtext_quote_append(next_command, request->client_proto, "");
1238
1256
if ((session->features & SMTP_FEATURE_XFORWARD_HELO)
1239
&& DEL_REQ_ATTR_AVAIL(request->client_helo)) {
1257
&& CAN_FORWARD_HELO_NAME(request->client_helo)) {
1240
1258
vstring_strcat(next_command, " " XFORWARD_HELO "=");
1241
1259
xtext_quote_append(next_command, request->client_helo, "");
1243
1261
if ((session->features & SMTP_FEATURE_XFORWARD_DOMAIN)
1244
&& DEL_REQ_ATTR_AVAIL(request->rewrite_context)) {
1262
&& CAN_FORWARD_RWR_CONTEXT(request->rewrite_context)) {
1245
1263
vstring_strcat(next_command, " " XFORWARD_DOMAIN "=");
1246
1264
xtext_quote_append(next_command,
1247
1265
strcmp(request->rewrite_context, MAIL_ATTR_RWR_LOCAL) ?
1979
1997
send_name_addr =
1980
1998
var_smtp_send_xforward
1981
1999
&& (((session->features & SMTP_FEATURE_XFORWARD_NAME)
1982
&& DEL_REQ_ATTR_AVAIL(request->client_name))
2000
&& CAN_FORWARD_CLIENT_NAME(request->client_name))
1983
2001
|| ((session->features & SMTP_FEATURE_XFORWARD_ADDR)
1984
&& DEL_REQ_ATTR_AVAIL(request->client_addr))
2002
&& CAN_FORWARD_CLIENT_ADDR(request->client_addr))
1985
2003
|| ((session->features & SMTP_FEATURE_XFORWARD_PORT)
1986
&& DEL_REQ_ATTR_AVAIL(request->client_port)));
2004
&& CAN_FORWARD_CLIENT_PORT(request->client_port)));
1987
2005
session->send_proto_helo =
1988
2006
var_smtp_send_xforward
1989
2007
&& (((session->features & SMTP_FEATURE_XFORWARD_PROTO)
1990
&& DEL_REQ_ATTR_AVAIL(request->client_proto))
2008
&& CAN_FORWARD_PROTO_NAME(request->client_proto))
1991
2009
|| ((session->features & SMTP_FEATURE_XFORWARD_HELO)
1992
&& DEL_REQ_ATTR_AVAIL(request->client_helo))
2010
&& CAN_FORWARD_HELO_NAME(request->client_helo))
1993
2011
|| ((session->features & SMTP_FEATURE_XFORWARD_DOMAIN)
1994
&& DEL_REQ_ATTR_AVAIL(request->rewrite_context)));
2012
&& CAN_FORWARD_RWR_CONTEXT(request->rewrite_context)));
1995
2013
if (send_name_addr)
1996
2014
recv_state = send_state = SMTP_STATE_XFORWARD_NAME_ADDR;
1997
2015
else if (session->send_proto_helo)