* Common
*/
-/* The command handling of the submission proxy service aims to follow the
+/* The command handling of the submission relay service aims to follow the
following rules:
- - Attempt to keep pipelined commands pipelined when proxying them to the
+ - Attempt to keep pipelined commands pipelined when relaying them to the
actual relay service.
- Don't forward commands if they're known to fail at the relay server. Errors
can still occur if pipelined commands fail. Abort subsequent pending
struct smtp_server_cmd_ctx *cmd;
struct smtp_server_cmd_helo *data;
- struct smtp_client_command *cmd_proxied;
+ struct smtp_client_command *cmd_relayed;
};
static void
{
struct submission_backend_relay *backend = helo->backend;
- /* proxy an XCLIENT command */
+ /* relay an XCLIENT command */
if (helo->data->changed)
relay_cmd_helo_update_xclient(backend, helo->data);
}
static void
-relay_cmd_helo_callback(const struct smtp_reply *proxy_reply,
+relay_cmd_helo_callback(const struct smtp_reply *relay_reply,
struct relay_cmd_helo_context *helo)
{
struct smtp_server_cmd_ctx *cmd = helo->cmd;
struct submission_backend_relay *backend = helo->backend;
struct smtp_reply reply;
- if (!backend_relay_handle_relay_reply(backend, proxy_reply, &reply))
+ if (!backend_relay_handle_relay_reply(backend, relay_reply, &reply))
return;
- if ((proxy_reply->status / 100) == 2) {
+ if ((relay_reply->status / 100) == 2) {
relay_cmd_helo_reply(cmd, helo);
} else {
/* RFC 2034, Section 4:
{
struct submission_backend_relay *backend = helo->backend;
- /* proxy an XCLIENT command */
+ /* relay an XCLIENT command */
if (helo->data->changed)
relay_cmd_helo_update_xclient(backend, helo->data);
}
helo->cmd = cmd;
helo->data = data;
- /* this is not the first HELO/EHLO; just proxy a RSET command */
+ /* this is not the first HELO/EHLO; just relay a RSET command */
smtp_server_command_add_hook(
cmd->cmd, SMTP_SERVER_COMMAND_HOOK_NEXT,
relay_cmd_helo_start, helo);
- helo->cmd_proxied = smtp_client_command_rset_submit
+ helo->cmd_relayed = smtp_client_command_rset_submit
(backend->conn, 0, relay_cmd_helo_callback, helo);
return 0;
}
struct smtp_server_cmd_ctx *cmd;
struct smtp_server_cmd_mail *data;
- struct smtp_client_command *cmd_proxied;
+ struct smtp_client_command *cmd_relayed;
};
static void
relay_cmd_mail_replied(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct relay_cmd_mail_context *mail_cmd)
{
- if (mail_cmd->cmd_proxied != NULL)
- smtp_client_command_abort(&mail_cmd->cmd_proxied);
+ if (mail_cmd->cmd_relayed != NULL)
+ smtp_client_command_abort(&mail_cmd->cmd_relayed);
}
static void
-relay_cmd_mail_callback(const struct smtp_reply *proxy_reply,
+relay_cmd_mail_callback(const struct smtp_reply *relay_reply,
struct relay_cmd_mail_context *mail_cmd)
{
struct smtp_server_cmd_ctx *cmd = mail_cmd->cmd;
struct submission_backend_relay *backend = mail_cmd->backend;
struct smtp_reply reply;
- /* finished proxying MAIL command to relay server */
+ /* finished relaying MAIL command to relay server */
i_assert(mail_cmd != NULL);
- mail_cmd->cmd_proxied = NULL;
+ mail_cmd->cmd_relayed = NULL;
- if (!backend_relay_handle_relay_reply(backend, proxy_reply, &reply))
+ if (!backend_relay_handle_relay_reply(backend, relay_reply, &reply))
return;
- if ((proxy_reply->status / 100) == 2) {
+ if ((relay_reply->status / 100) == 2) {
/* if relay accepts it, we accept it too */
/* the default 2.0.0 code won't do */
- if (!smtp_reply_has_enhanced_code(proxy_reply))
+ if (!smtp_reply_has_enhanced_code(relay_reply))
reply.enhanced_code = SMTP_REPLY_ENH_CODE(2, 1, 0);
}
static int
relay_cmd_mail_parameter_auth(struct submission_backend_relay *backend,
struct smtp_server_cmd_ctx *cmd,
- enum smtp_capability proxy_caps,
+ enum smtp_capability relay_caps,
struct smtp_server_cmd_mail *data)
{
struct client *client = backend->backend.client;
struct smtp_address *auth_addr;
const char *error;
- if ((proxy_caps & SMTP_CAPABILITY_AUTH) == 0)
+ if ((relay_caps & SMTP_CAPABILITY_AUTH) == 0)
return 0;
auth_addr = NULL;
static int
relay_cmd_mail_parameter_size(struct submission_backend_relay *backend,
struct smtp_server_cmd_ctx *cmd,
- enum smtp_capability proxy_caps,
+ enum smtp_capability relay_caps,
struct smtp_server_cmd_mail *data)
{
struct client *client = backend->backend.client;
/* SIZE=<size-value>: RFC 1870 */
- if (data->params.size == 0 || (proxy_caps & SMTP_CAPABILITY_SIZE) == 0)
+ if (data->params.size == 0 || (relay_caps & SMTP_CAPABILITY_SIZE) == 0)
return 0;
/* determine actual size limit (account for our additions) */
return -1;
}
- /* proxy the SIZE parameter (account for additional size) */
+ /* relay the SIZE parameter (account for additional size) */
data->params.size += SUBMISSION_MAX_ADDITIONAL_MAIL_SIZE;
return 0;
}
{
struct submission_backend_relay *backend = &client->backend;
struct relay_cmd_mail_context *mail_cmd;
- enum smtp_capability proxy_caps =
+ enum smtp_capability relay_caps =
smtp_client_connection_get_capabilities(backend->conn);
/* check and adjust parameters where necessary */
- if (relay_cmd_mail_parameter_auth(backend, cmd, proxy_caps, data) < 0)
+ if (relay_cmd_mail_parameter_auth(backend, cmd, relay_caps, data) < 0)
return -1;
- if (relay_cmd_mail_parameter_size(backend, cmd, proxy_caps, data) < 0)
+ if (relay_cmd_mail_parameter_size(backend, cmd, relay_caps, data) < 0)
return -1;
relay_cmd_mail_update_xclient(backend);
smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED,
relay_cmd_mail_replied, mail_cmd);
- mail_cmd->cmd_proxied = smtp_client_command_mail_submit(
+ mail_cmd->cmd_relayed = smtp_client_command_mail_submit(
backend->conn, 0, data->path, &data->params,
relay_cmd_mail_callback, mail_cmd);
return 0;
struct smtp_server_cmd_ctx *cmd;
struct smtp_server_cmd_rcpt *data;
- struct smtp_client_command *cmd_proxied;
+ struct smtp_client_command *cmd_relayed;
};
static void
relay_cmd_rcpt_replied(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct relay_cmd_rcpt_context *rcpt_cmd)
{
- if (rcpt_cmd->cmd_proxied != NULL)
- smtp_client_command_abort(&rcpt_cmd->cmd_proxied);
+ if (rcpt_cmd->cmd_relayed != NULL)
+ smtp_client_command_abort(&rcpt_cmd->cmd_relayed);
}
static void
-relay_cmd_rcpt_callback(const struct smtp_reply *proxy_reply,
+relay_cmd_rcpt_callback(const struct smtp_reply *relay_reply,
struct relay_cmd_rcpt_context *rcpt_cmd)
{
struct smtp_server_cmd_ctx *cmd = rcpt_cmd->cmd;
struct submission_backend_relay *backend = rcpt_cmd->backend;
struct smtp_reply reply;
- /* finished proxying MAIL command to relay server */
+ /* finished relaying MAIL command to relay server */
i_assert(rcpt_cmd != NULL);
- rcpt_cmd->cmd_proxied = NULL;
+ rcpt_cmd->cmd_relayed = NULL;
- if (!backend_relay_handle_relay_reply(backend, proxy_reply, &reply))
+ if (!backend_relay_handle_relay_reply(backend, relay_reply, &reply))
return;
- if ((proxy_reply->status / 100) == 2) {
+ if ((relay_reply->status / 100) == 2) {
/* the default 2.0.0 code won't do */
- if (!smtp_reply_has_enhanced_code(proxy_reply))
+ if (!smtp_reply_has_enhanced_code(relay_reply))
reply.enhanced_code = SMTP_REPLY_ENH_CODE(2, 1, 5);
}
smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED,
relay_cmd_rcpt_replied, rcpt_cmd);
- rcpt_cmd->cmd_proxied = smtp_client_command_rcpt_submit(
+ rcpt_cmd->cmd_relayed = smtp_client_command_rcpt_submit(
backend->conn, 0, data->path, &data->params,
relay_cmd_rcpt_callback, rcpt_cmd);
return 0;
struct smtp_server_cmd_ctx *cmd;
- struct smtp_client_command *cmd_proxied;
+ struct smtp_client_command *cmd_relayed;
};
static void
-relay_cmd_rset_callback(const struct smtp_reply *proxy_reply,
+relay_cmd_rset_callback(const struct smtp_reply *relay_reply,
struct relay_cmd_rset_context *rset_cmd)
{
struct smtp_server_cmd_ctx *cmd = rset_cmd->cmd;
struct submission_backend_relay *backend = rset_cmd->backend;
struct smtp_reply reply;
- /* finished proxying MAIL command to relay server */
+ /* finished relaying MAIL command to relay server */
i_assert(rset_cmd != NULL);
- rset_cmd->cmd_proxied = NULL;
+ rset_cmd->cmd_relayed = NULL;
- if (!backend_relay_handle_relay_reply(backend, proxy_reply, &reply))
+ if (!backend_relay_handle_relay_reply(backend, relay_reply, &reply))
return;
/* forward reply */
rset_cmd->backend = backend;
rset_cmd->cmd = cmd;
- rset_cmd->cmd_proxied = smtp_client_command_rset_submit(
+ rset_cmd->cmd_relayed = smtp_client_command_rset_submit(
backend->conn, 0, relay_cmd_rset_callback, rset_cmd);
return 0;
}
struct smtp_server_cmd_ctx *cmd;
struct smtp_server_transaction *trans;
- struct smtp_client_command *cmd_proxied;
+ struct smtp_client_command *cmd_relayed;
};
static void
-relay_cmd_data_callback(const struct smtp_reply *proxy_reply,
+relay_cmd_data_callback(const struct smtp_reply *relay_reply,
struct relay_cmd_data_context *data_ctx)
{
struct smtp_server_cmd_ctx *cmd = data_ctx->cmd;
struct client *client = backend->backend.client;
struct smtp_reply reply;
- /* finished proxying message to relay server */
+ /* finished relaying message to relay server */
/* check for fatal problems */
- if (!backend_relay_handle_relay_reply(backend, proxy_reply, &reply))
+ if (!backend_relay_handle_relay_reply(backend, relay_reply, &reply))
return;
- if (proxy_reply->status / 100 == 2) {
+ if (relay_reply->status / 100 == 2) {
i_info("Successfully relayed message: "
"from=<%s>, size=%"PRIuUOFF_T", "
"id=%s, nrcpt=%u, reply=`%s'",
smtp_address_encode(trans->mail_from),
client->state.data_size, trans->id,
array_count(&trans->rcpt_to),
- str_sanitize(smtp_reply_log(proxy_reply), 128));
+ str_sanitize(smtp_reply_log(relay_reply), 128));
} else {
i_info("Failed to relay message: "
"from=<%s>, size=%"PRIuUOFF_T", nrcpt=%u, reply=`%s'",
smtp_address_encode(trans->mail_from),
client->state.data_size, array_count(&trans->rcpt_to),
- str_sanitize(smtp_reply_log(proxy_reply), 128));
+ str_sanitize(smtp_reply_log(relay_reply), 128));
}
smtp_server_reply_forward(cmd, &reply);
data_ctx->trans = trans;
trans->context = (void*)data_ctx;
- data_ctx->cmd_proxied = smtp_client_command_data_submit(
+ data_ctx->cmd_relayed = smtp_client_command_data_submit(
backend->conn, 0, data_input, relay_cmd_data_callback,
data_ctx);
return 0;
struct submission_backend_relay *backend;
struct smtp_server_cmd_ctx *cmd;
- struct smtp_client_command *cmd_proxied;
+ struct smtp_client_command *cmd_relayed;
};
static void
-relay_cmd_vrfy_callback(const struct smtp_reply *proxy_reply,
+relay_cmd_vrfy_callback(const struct smtp_reply *relay_reply,
struct relay_cmd_vrfy_context *vrfy_cmd)
{
struct smtp_server_cmd_ctx *cmd = vrfy_cmd->cmd;
struct submission_backend_relay *backend = vrfy_cmd->backend;
struct smtp_reply reply;
- if (!backend_relay_handle_relay_reply(backend, proxy_reply, &reply))
+ if (!backend_relay_handle_relay_reply(backend, relay_reply, &reply))
return;
- if (!smtp_reply_has_enhanced_code(proxy_reply)) {
- switch (proxy_reply->status) {
+ if (!smtp_reply_has_enhanced_code(relay_reply)) {
+ switch (relay_reply->status) {
case 250:
case 251:
case 252:
vrfy_cmd->backend = backend;
vrfy_cmd->cmd = cmd;
- vrfy_cmd->cmd_proxied = smtp_client_command_vrfy_submit(
+ vrfy_cmd->cmd_relayed = smtp_client_command_vrfy_submit(
backend->conn, 0, param, relay_cmd_vrfy_callback, vrfy_cmd);
return 0;
}
struct submission_backend_relay *backend;
struct smtp_server_cmd_ctx *cmd;
- struct smtp_client_command *cmd_proxied;
+ struct smtp_client_command *cmd_relayed;
};
static void
-relay_cmd_noop_callback(const struct smtp_reply *proxy_reply,
+relay_cmd_noop_callback(const struct smtp_reply *relay_reply,
struct relay_cmd_noop_context *noop_cmd)
{
struct smtp_server_cmd_ctx *cmd = noop_cmd->cmd;
struct submission_backend_relay *backend = noop_cmd->backend;
struct smtp_reply reply;
- if (!backend_relay_handle_relay_reply(backend, proxy_reply, &reply))
+ if (!backend_relay_handle_relay_reply(backend, relay_reply, &reply))
return;
- if ((proxy_reply->status / 100) == 2) {
+ if ((relay_reply->status / 100) == 2) {
smtp_server_reply(cmd, 250, "2.0.0", "OK");
} else {
smtp_server_reply_forward(cmd, &reply);
noop_cmd->backend = backend;
noop_cmd->cmd = cmd;
- noop_cmd->cmd_proxied = smtp_client_command_noop_submit(
+ noop_cmd->cmd_relayed = smtp_client_command_noop_submit(
backend->conn, 0, relay_cmd_noop_callback, noop_cmd);
return 0;
}
struct submission_backend_relay *backend;
struct smtp_server_cmd_ctx *cmd;
- struct smtp_client_command *cmd_proxied;
+ struct smtp_client_command *cmd_relayed;
};
static void
relay_cmd_quit_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct relay_cmd_quit_context *quit_cmd)
{
- if (quit_cmd->cmd_proxied != NULL)
- smtp_client_command_abort(&quit_cmd->cmd_proxied);
+ if (quit_cmd->cmd_relayed != NULL)
+ smtp_client_command_abort(&quit_cmd->cmd_relayed);
}
static void
relay_cmd_quit_replied(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct relay_cmd_quit_context *quit_cmd)
{
- if (quit_cmd->cmd_proxied != NULL)
- smtp_client_command_abort(&quit_cmd->cmd_proxied);
+ if (quit_cmd->cmd_relayed != NULL)
+ smtp_client_command_abort(&quit_cmd->cmd_relayed);
}
static void relay_cmd_quit_finish(struct relay_cmd_quit_context *quit_cmd)
{
struct smtp_server_cmd_ctx *cmd = quit_cmd->cmd;
- if (quit_cmd->cmd_proxied != NULL)
- smtp_client_command_abort(&quit_cmd->cmd_proxied);
+ if (quit_cmd->cmd_relayed != NULL)
+ smtp_client_command_abort(&quit_cmd->cmd_relayed);
smtp_server_reply_quit(cmd);
}
static void
-relay_cmd_quit_callback(const struct smtp_reply *proxy_reply ATTR_UNUSED,
+relay_cmd_quit_callback(const struct smtp_reply *relay_reply ATTR_UNUSED,
struct relay_cmd_quit_context *quit_cmd)
{
- quit_cmd->cmd_proxied = NULL;
+ quit_cmd->cmd_relayed = NULL;
relay_cmd_quit_finish(quit_cmd);
}
-static void relay_cmd_quit_proxy(struct relay_cmd_quit_context *quit_cmd)
+static void relay_cmd_quit_relay(struct relay_cmd_quit_context *quit_cmd)
{
struct submission_backend_relay *backend = quit_cmd->backend;
struct smtp_server_cmd_ctx *cmd = quit_cmd->cmd;
- if (quit_cmd->cmd_proxied != NULL)
+ if (quit_cmd->cmd_relayed != NULL)
return;
if (smtp_client_connection_get_state(backend->conn)
< SMTP_CLIENT_CONNECTION_STATE_READY) {
- /* Don't bother proxying QUIT command when proxy is not
+ /* Don't bother relaying QUIT command when relay is not
fully initialized. */
smtp_server_reply_quit(cmd);
return;
until it sends a QUIT command, and it SHOULD wait until it receives
the reply (even if there was an error response to a previous
command). */
- quit_cmd->cmd_proxied =
+ quit_cmd->cmd_relayed =
smtp_client_command_new(backend->conn, 0,
relay_cmd_quit_callback, quit_cmd);
- smtp_client_command_write(quit_cmd->cmd_proxied, "QUIT");
- smtp_client_command_submit(quit_cmd->cmd_proxied);
+ smtp_client_command_write(quit_cmd->cmd_relayed, "QUIT");
+ smtp_client_command_submit(quit_cmd->cmd_relayed);
}
static void
struct relay_cmd_quit_context *quit_cmd)
{
/* QUIT command is next to reply */
- relay_cmd_quit_proxy(quit_cmd);
+ relay_cmd_quit_relay(quit_cmd);
}
int cmd_quit_relay(struct client *client, struct smtp_server_cmd_ctx *cmd)
if (smtp_client_connection_get_state(backend->conn)
>= SMTP_CLIENT_CONNECTION_STATE_READY)
- relay_cmd_quit_proxy(quit_cmd);
+ relay_cmd_quit_relay(quit_cmd);
return 0;
}
else
ssl_set.allow_invalid_cert = TRUE;
- /* make proxy connection */
+ /* make relay connection */
i_zero(&smtp_set);
smtp_set.my_hostname = set->hostname;
smtp_set.ssl = &ssl_set;
struct submission_backend_relay *backend = &client->backend;
enum smtp_capability caps;
- /* check proxy status */
+ /* check relay status */
if ((reply->status / 100) != 2) {
i_error("Failed to establish relay connection: %s",
smtp_reply_log(reply));