if (!conn->set.peer_trusted)
return;
+ if (conn->xclient_sent)
+ return;
if ((conn->caps.standard & SMTP_CAPABILITY_XCLIENT) == 0 ||
conn->caps.xclient_args == NULL)
return;
const char *init_resp, *error;
if (set->username == NULL && set->sasl_mech == NULL) {
- if (!conn->initial_xclient_sent && !conn->set.xclient_defer) {
- conn->initial_xclient_sent = TRUE;
+ if (!conn->set.xclient_defer)
smtp_client_connection_send_xclient(conn);
- }
return (conn->xclient_replies_expected == 0);
}
- if (!conn->initial_xclient_sent) {
- conn->initial_xclient_sent = TRUE;
- smtp_client_connection_send_xclient(conn);
- if (conn->xclient_replies_expected > 0)
- return FALSE;
- }
-
+ smtp_client_connection_send_xclient(conn);
+ if (conn->xclient_replies_expected > 0)
+ return FALSE;
if (conn->authenticated)
return TRUE;
struct smtp_client_connection *conn,
const struct smtp_proxy_data *proxy_data)
{
+ if (conn->xclient_sent)
+ return;
+
smtp_proxy_data_merge(conn->pool, &conn->set.proxy_data, proxy_data);
}
struct smtp_client_connection *conn;
struct smtp_client_transaction *trans;
- bool xclient_sent:1;
bool trans_started:1;
bool trusted:1;
};
i_zero(&proxy_data);
proxy_data.helo = data->helo.domain;
smtp_client_connection_update_proxy_data(backend->conn, &proxy_data);
-
- smtp_client_connection_send_xclient(backend->conn);
- backend->xclient_sent = TRUE;
}
static void
{
struct submission_backend_relay *backend = helo->backend;
- /* relay an XCLIENT command */
if (helo->data->changed)
relay_cmd_helo_update_xclient(backend, helo->data);
{
struct submission_backend_relay *backend = helo->backend;
- /* relay an XCLIENT command */
if (helo->data->changed)
relay_cmd_helo_update_xclient(backend, helo->data);
}
struct smtp_client_transaction_mail *relay_mail;
};
-static void
-relay_cmd_mail_update_xclient(struct submission_backend_relay *backend)
-{
- struct client *client = backend->backend.client;
- struct smtp_proxy_data proxy_data;
- struct smtp_server_helo_data *helo_data =
- smtp_server_connection_get_helo_data(client->conn);
-
- if (backend->xclient_sent)
- return;
- if (!backend->trusted)
- return;
- if (helo_data->domain == NULL)
- return;
-
- i_zero(&proxy_data);
- proxy_data.helo = helo_data->domain;
- proxy_data.proto = SMTP_PROXY_PROTOCOL_ESMTP;
- smtp_client_connection_update_proxy_data(backend->conn, &proxy_data);
-
- smtp_client_connection_send_xclient(backend->conn);
- backend->xclient_sent = TRUE;
-}
-
-
static void
relay_cmd_mail_replied(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct relay_cmd_mail_context *mail_cmd)
if (relay_cmd_mail_parameter_size(backend, cmd, relay_caps, data) < 0)
return -1;
- relay_cmd_mail_update_xclient(backend);
-
/* queue command (pipeline) */
mail_cmd = p_new(cmd->pool, struct relay_cmd_mail_context, 1);
mail_cmd->backend = backend;
user->conn.remote_port;
}
smtp_set.proxy_data.login = user->username;
+ smtp_set.xclient_defer = TRUE;
}
smtp_set.username = set->user;