From 9f41081ff199f4600bd82b848421ab80ecd77eff Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sun, 15 Jul 2018 20:49:05 +0200 Subject: [PATCH] submission: Move relay-related client fields to separate backend struct. --- src/submission/Makefile.am | 1 + src/submission/submission-backend-relay.c | 84 +++++++++++++++-------- src/submission/submission-backend-relay.h | 12 ++++ src/submission/submission-backend.h | 8 +++ src/submission/submission-client.h | 5 +- src/submission/submission-commands.c | 3 +- 6 files changed, 80 insertions(+), 33 deletions(-) create mode 100644 src/submission/submission-backend.h diff --git a/src/submission/Makefile.am b/src/submission/Makefile.am index 0b92fad66d..276539c30d 100644 --- a/src/submission/Makefile.am +++ b/src/submission/Makefile.am @@ -42,6 +42,7 @@ submission_SOURCES = \ noinst_HEADERS = \ submission-common.h \ + submission-backend.h \ submission-backend-relay.h \ submission-commands.h \ submission-client.h \ diff --git a/src/submission/submission-backend-relay.c b/src/submission/submission-backend-relay.c index 4ac1b45d58..512f76ab91 100644 --- a/src/submission/submission-backend-relay.c +++ b/src/submission/submission-backend-relay.c @@ -87,6 +87,7 @@ struct cmd_helo_context { static void cmd_helo_update_xclient(struct client *client, struct smtp_server_cmd_helo *data) { + struct submission_backend_relay *backend = &client->backend; struct smtp_proxy_data proxy_data; if (!client->set->submission_relay_trusted) @@ -97,9 +98,8 @@ static void cmd_helo_update_xclient(struct client *client, proxy_data.proto = (data->helo.old_smtp ? SMTP_PROXY_PROTOCOL_SMTP : SMTP_PROXY_PROTOCOL_ESMTP); - (void)smtp_client_connection_send_xclient - (client->proxy_conn, &proxy_data); - client->xclient_sent = TRUE; + (void)smtp_client_connection_send_xclient(backend->conn, &proxy_data); + backend->xclient_sent = TRUE; } static void @@ -154,6 +154,7 @@ cmd_helo_start(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED, int cmd_helo_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_helo *data) { + struct submission_backend_relay *backend = &client->backend; struct cmd_helo_context *helo; helo = p_new(cmd->pool, struct cmd_helo_context, 1); @@ -166,7 +167,7 @@ int cmd_helo_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, cmd->cmd, SMTP_SERVER_COMMAND_HOOK_NEXT, cmd_helo_start, helo); helo->cmd_proxied = smtp_client_command_rset_submit - (client->proxy_conn, 0, cmd_helo_proxy_cb, helo); + (backend->conn, 0, cmd_helo_proxy_cb, helo); return 0; } @@ -184,11 +185,12 @@ struct cmd_mail_context { static void cmd_mail_update_xclient(struct client *client) { + struct submission_backend_relay *backend = &client->backend; struct smtp_proxy_data proxy_data; struct smtp_server_helo_data *helo_data = smtp_server_connection_get_helo_data(client->conn); - if (client->xclient_sent) + if (backend->xclient_sent) return; if (!client->set->submission_relay_trusted) return; @@ -199,9 +201,8 @@ static void cmd_mail_update_xclient(struct client *client) proxy_data.helo = helo_data->domain; proxy_data.proto = SMTP_PROXY_PROTOCOL_ESMTP; - (void)smtp_client_connection_send_xclient( - client->proxy_conn, &proxy_data); - client->xclient_sent = TRUE; + (void)smtp_client_connection_send_xclient(backend->conn, &proxy_data); + backend->xclient_sent = TRUE; } static void @@ -292,9 +293,10 @@ cmd_mail_parameter_size(struct client *client, int cmd_mail_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_mail *data) { + struct submission_backend_relay *backend = &client->backend; struct cmd_mail_context *mail_cmd; enum smtp_capability proxy_caps = - smtp_client_connection_get_capabilities(client->proxy_conn); + smtp_client_connection_get_capabilities(backend->conn); /* check and adjust parameters where necessary */ if (cmd_mail_parameter_auth(client, cmd, proxy_caps, data) < 0) @@ -314,7 +316,7 @@ int cmd_mail_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, cmd_mail_replied, mail_cmd); mail_cmd->cmd_proxied = smtp_client_command_mail_submit( - client->proxy_conn, 0, data->path, &data->params, + backend->conn, 0, data->path, &data->params, cmd_mail_proxy_cb, mail_cmd); return 0; } @@ -366,6 +368,7 @@ static void cmd_rcpt_proxy_cb(const struct smtp_reply *proxy_reply, int cmd_rcpt_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_rcpt *data) { + struct submission_backend_relay *backend = &client->backend; struct cmd_rcpt_context *rcpt_cmd; /* queue command (pipeline) */ @@ -378,7 +381,7 @@ int cmd_rcpt_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, cmd_rcpt_replied, rcpt_cmd); rcpt_cmd->cmd_proxied = smtp_client_command_rcpt_submit( - client->proxy_conn, 0, data->path, &data->params, + backend->conn, 0, data->path, &data->params, cmd_rcpt_proxy_cb, rcpt_cmd); return 0; } @@ -414,14 +417,15 @@ static void cmd_rset_proxy_cb(const struct smtp_reply *proxy_reply, int cmd_rset_relay(struct client *client, struct smtp_server_cmd_ctx *cmd) { + struct submission_backend_relay *backend = &client->backend; struct cmd_rset_context *rset_cmd; rset_cmd = p_new(cmd->pool, struct cmd_rset_context, 1); rset_cmd->cmd = cmd; rset_cmd->client = client; - rset_cmd->cmd_proxied = smtp_client_command_rset_submit - (client->proxy_conn, 0, cmd_rset_proxy_cb, rset_cmd); + rset_cmd->cmd_proxied = smtp_client_command_rset_submit( + backend->conn, 0, cmd_rset_proxy_cb, rset_cmd); return 0; } @@ -475,6 +479,7 @@ int cmd_data_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, struct smtp_server_transaction *trans, struct istream *data_input) { + struct submission_backend_relay *backend = &client->backend; struct cmd_data_context *data_ctx; /* start relaying to relay server */ @@ -485,7 +490,7 @@ int cmd_data_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, trans->context = (void*)data_ctx; data_ctx->cmd_proxied = smtp_client_command_data_submit( - client->proxy_conn, 0, data_input, cmd_data_proxy_cb, data_ctx); + backend->conn, 0, data_input, cmd_data_proxy_cb, data_ctx); return 0; } @@ -527,6 +532,7 @@ static void cmd_vrfy_proxy_cb(const struct smtp_reply *proxy_reply, int cmd_vrfy_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, const char *param) { + struct submission_backend_relay *backend = &client->backend; struct cmd_vrfy_context *vrfy_cmd; vrfy_cmd = p_new(cmd->pool, struct cmd_vrfy_context, 1); @@ -534,7 +540,7 @@ int cmd_vrfy_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, vrfy_cmd->cmd = cmd; vrfy_cmd->cmd_proxied = smtp_client_command_vrfy_submit( - client->proxy_conn, 0, param, cmd_vrfy_proxy_cb, vrfy_cmd); + backend->conn, 0, param, cmd_vrfy_proxy_cb, vrfy_cmd); return 0; } @@ -567,14 +573,15 @@ static void cmd_noop_proxy_cb(const struct smtp_reply *proxy_reply, int cmd_noop_relay(struct client *client, struct smtp_server_cmd_ctx *cmd) { + struct submission_backend_relay *backend = &client->backend; struct cmd_noop_context *noop_cmd; noop_cmd = p_new(cmd->pool, struct cmd_noop_context, 1); noop_cmd->client = client; noop_cmd->cmd = cmd; - noop_cmd->cmd_proxied = smtp_client_command_noop_submit - (client->proxy_conn, 0, cmd_noop_proxy_cb, noop_cmd); + noop_cmd->cmd_proxied = smtp_client_command_noop_submit( + backend->conn, 0, cmd_noop_proxy_cb, noop_cmd); return 0; } @@ -624,12 +631,13 @@ relay_cmd_quit_proxy_cb(const struct smtp_reply *proxy_reply ATTR_UNUSED, static void relay_cmd_quit_proxy(struct relay_cmd_quit_context *quit_cmd) { struct client *client = quit_cmd->client; + struct submission_backend_relay *backend = &client->backend; struct smtp_server_cmd_ctx *cmd = quit_cmd->cmd; if (quit_cmd->cmd_proxied != NULL) return; - if (smtp_client_connection_get_state(client->proxy_conn) + if (smtp_client_connection_get_state(backend->conn) < SMTP_CLIENT_CONNECTION_STATE_READY) { /* Don't bother proxying QUIT command when proxy is not fully initialized. */ @@ -644,7 +652,7 @@ static void relay_cmd_quit_proxy(struct relay_cmd_quit_context *quit_cmd) the reply (even if there was an error response to a previous command). */ quit_cmd->cmd_proxied = - smtp_client_command_new(client->proxy_conn, 0, + smtp_client_command_new(backend->conn, 0, relay_cmd_quit_proxy_cb, quit_cmd); smtp_client_command_write(quit_cmd->cmd_proxied, "QUIT"); smtp_client_command_submit(quit_cmd->cmd_proxied); @@ -660,6 +668,7 @@ relay_cmd_quit_next(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED, int cmd_quit_relay(struct client *client, struct smtp_server_cmd_ctx *cmd) { + struct submission_backend_relay *backend = &client->backend; struct relay_cmd_quit_context *quit_cmd; quit_cmd = p_new(cmd->pool, struct relay_cmd_quit_context, 1); @@ -673,7 +682,7 @@ int cmd_quit_relay(struct client *client, struct smtp_server_cmd_ctx *cmd) smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY, relay_cmd_quit_destroy, quit_cmd); - if (smtp_client_connection_get_state(client->proxy_conn) + if (smtp_client_connection_get_state(backend->conn) >= SMTP_CLIENT_CONNECTION_STATE_READY) relay_cmd_quit_proxy(quit_cmd); return 0; @@ -686,11 +695,15 @@ int cmd_quit_relay(struct client *client, struct smtp_server_cmd_ctx *cmd) void client_proxy_create(struct client *client, const struct submission_settings *set) { + struct submission_backend_relay *backend; struct mail_user *user = client->user; struct ssl_iostream_settings ssl_set; struct smtp_client_settings smtp_set; enum smtp_client_connection_ssl_mode ssl_mode; + backend = &client->backend; + backend->backend.client = client; + i_zero(&ssl_set); mail_user_init_ssl_client_settings(user, &ssl_set); if (set->submission_relay_ssl_verify) @@ -734,21 +747,24 @@ void client_proxy_create(struct client *client, else ssl_mode = SMTP_CLIENT_SSL_MODE_NONE; - client->proxy_conn = smtp_client_connection_create(smtp_client, + backend->conn = smtp_client_connection_create(smtp_client, SMTP_PROTOCOL_SMTP, set->submission_relay_host, set->submission_relay_port, ssl_mode, &smtp_set); } void client_proxy_destroy(struct client *client) { - if (client->proxy_conn != NULL) - smtp_client_connection_close(&client->proxy_conn); + struct submission_backend_relay *backend = &client->backend; + + if (backend->conn != NULL) + smtp_client_connection_close(&backend->conn); } static void client_proxy_ready_cb(const struct smtp_reply *reply, void *context) { struct client *client = context; + struct submission_backend_relay *backend = &client->backend; enum smtp_capability caps; /* check proxy status */ @@ -761,7 +777,7 @@ static void client_proxy_ready_cb(const struct smtp_reply *reply, } /* propagate capabilities */ - caps = smtp_client_connection_get_capabilities(client->proxy_conn); + caps = smtp_client_connection_get_capabilities(backend->conn); caps |= SMTP_CAPABILITY_AUTH | SMTP_CAPABILITY_PIPELINING | SMTP_CAPABILITY_SIZE | SMTP_CAPABILITY_ENHANCEDSTATUSCODES | SMTP_CAPABILITY_CHUNKING | SMTP_CAPABILITY_BURL | @@ -775,23 +791,31 @@ static void client_proxy_ready_cb(const struct smtp_reply *reply, void client_proxy_start(struct client *client) { - smtp_client_connection_connect(client->proxy_conn, + struct submission_backend_relay *backend = &client->backend; + + smtp_client_connection_connect(backend->conn, client_proxy_ready_cb, client); } /* try to proxy pipelined commands in a similarly pipelined fashion */ void client_proxy_input_pre(struct client *client) { - if (client->proxy_conn != NULL) - smtp_client_connection_cork(client->proxy_conn); + struct submission_backend_relay *backend = &client->backend; + + if (backend->conn != NULL) + smtp_client_connection_cork(backend->conn); } void client_proxy_input_post(struct client *client) { - if (client->proxy_conn != NULL) - smtp_client_connection_uncork(client->proxy_conn); + struct submission_backend_relay *backend = &client->backend; + + if (backend->conn != NULL) + smtp_client_connection_uncork(backend->conn); } uoff_t client_proxy_get_max_mail_size(struct client *client) { - return smtp_client_connection_get_size_capability(client->proxy_conn); + struct submission_backend_relay *backend = &client->backend; + + return smtp_client_connection_get_size_capability(backend->conn); } diff --git a/src/submission/submission-backend-relay.h b/src/submission/submission-backend-relay.h index dc46725499..9aa6d0f8a6 100644 --- a/src/submission/submission-backend-relay.h +++ b/src/submission/submission-backend-relay.h @@ -1,6 +1,10 @@ #ifndef SUBMISSION_BACKEND_RELAY_H #define SUBMISSION_BACKEND_RELAY_H +#include "submission-backend.h" + +struct client; + int cmd_helo_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_helo *data); int cmd_mail_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, @@ -18,6 +22,14 @@ int cmd_quit_relay(struct client *client, struct smtp_server_cmd_ctx *cmd); struct submission_settings; +struct submission_backend_relay { + struct submission_backend backend; + + struct smtp_client_connection *conn; + + bool xclient_sent:1; +}; + void client_proxy_create(struct client *client, const struct submission_settings *set); void client_proxy_destroy(struct client *client); diff --git a/src/submission/submission-backend.h b/src/submission/submission-backend.h new file mode 100644 index 0000000000..0a3e6ea9e6 --- /dev/null +++ b/src/submission/submission-backend.h @@ -0,0 +1,8 @@ +#ifndef SUBMISSION_BACKEND_H +#define SUBMISSION_BACKEND_H + +struct submission_backend { + struct client *client; +}; + +#endif diff --git a/src/submission/submission-client.h b/src/submission/submission-client.h index 82a59e1163..44aa5868ba 100644 --- a/src/submission/submission-client.h +++ b/src/submission/submission-client.h @@ -2,6 +2,7 @@ #define CLIENT_H #include "net.h" +#include "submission-backend-relay.h" struct smtp_reply; @@ -29,13 +30,13 @@ struct client { /* IMAP URLAUTH context (RFC4467) for BURL (RFC4468) */ struct imap_urlauth_context *urlauth_ctx; - struct smtp_client_connection *proxy_conn; struct timeout *to_quit; struct smtp_server_stats stats; + struct submission_backend_relay backend; + bool standalone:1; - bool xclient_sent:1; bool disconnected:1; bool destroyed:1; bool anvil_sent:1; diff --git a/src/submission/submission-commands.c b/src/submission/submission-commands.c index 114bc4c5e9..fff3ab5374 100644 --- a/src/submission/submission-commands.c +++ b/src/submission/submission-commands.c @@ -25,8 +25,9 @@ void submission_helo_reply_submit(struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_helo *data) { struct client *client = smtp_server_connection_get_context(cmd->conn); + struct submission_backend_relay *backend = &client->backend; enum smtp_capability proxy_caps = - smtp_client_connection_get_capabilities(client->proxy_conn); + smtp_client_connection_get_capabilities(backend->conn); struct smtp_server_reply *reply; uoff_t cap_size; -- 2.47.3