From 877917d9046ae5a6bbe617133b4b0993e7515d3b Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sat, 15 Sep 2018 13:53:07 +0200 Subject: [PATCH] submission: relay backend: Turn SMTP command functions into relay backend vfuncs. --- src/submission/submission-backend-relay.c | 97 ++++++++++++++++------- src/submission/submission-backend-relay.h | 15 ---- src/submission/submission-commands.c | 21 ++--- 3 files changed, 81 insertions(+), 52 deletions(-) diff --git a/src/submission/submission-backend-relay.c b/src/submission/submission-backend-relay.c index 43244d1b98..3572cb3416 100644 --- a/src/submission/submission-backend-relay.c +++ b/src/submission/submission-backend-relay.c @@ -9,9 +9,10 @@ #include "smtp-client-connection.h" #include "smtp-client-command.h" -#include "submission-commands.h" #include "submission-backend-relay.h" +static struct submission_backend_vfuncs backend_relay_vfuncs; + /* * Common */ @@ -120,7 +121,8 @@ relay_cmd_helo_reply(struct smtp_server_cmd_ctx *cmd, relay_cmd_helo_update_xclient(backend, helo->data); T_BEGIN { - submission_helo_reply_submit(cmd, helo->data); + submission_backend_helo_reply_submit(&backend->backend, cmd, + helo->data); } T_END; } @@ -160,13 +162,16 @@ relay_cmd_helo_start(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED, relay_cmd_helo_update_xclient(backend, helo->data); } -int cmd_helo_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_cmd_helo *data) +static int +backend_relay_cmd_helo(struct submission_backend *_backend, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_helo *data) { - struct submission_backend_relay *backend = &client->backend; + struct submission_backend_relay *backend = + (struct submission_backend_relay *)_backend; struct relay_cmd_helo_context *helo; - client_proxy_start(client); + client_proxy_start(_backend->client); helo = p_new(cmd->pool, struct relay_cmd_helo_context, 1); helo->backend = backend; @@ -305,13 +310,16 @@ relay_cmd_mail_parameter_size(struct submission_backend_relay *backend, return 0; } -int cmd_mail_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_cmd_mail *data) +static int +backend_relay_cmd_mail(struct submission_backend *_backend, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_mail *data) { - struct submission_backend_relay *backend = &client->backend; - struct relay_cmd_mail_context *mail_cmd; + struct submission_backend_relay *backend = + (struct submission_backend_relay *)_backend; enum smtp_capability relay_caps = smtp_client_connection_get_capabilities(backend->conn); + struct relay_cmd_mail_context *mail_cmd; /* check and adjust parameters where necessary */ if (relay_cmd_mail_parameter_auth(backend, cmd, relay_caps, data) < 0) @@ -321,7 +329,7 @@ int cmd_mail_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, relay_cmd_mail_update_xclient(backend); - client_proxy_start(client); + client_proxy_start(_backend->client); /* queue command (pipeline) */ mail_cmd = p_new(cmd->pool, struct relay_cmd_mail_context, 1); @@ -384,10 +392,13 @@ relay_cmd_rcpt_callback(const struct smtp_reply *relay_reply, smtp_server_reply_forward(cmd, &reply); } -int cmd_rcpt_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_cmd_rcpt *data) +static int +backend_relay_cmd_rcpt(struct submission_backend *_backend, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_rcpt *data) { - struct submission_backend_relay *backend = &client->backend; + struct submission_backend_relay *backend = + (struct submission_backend_relay *)_backend; struct relay_cmd_rcpt_context *rcpt_cmd; /* queue command (pipeline) */ @@ -436,9 +447,12 @@ relay_cmd_rset_callback(const struct smtp_reply *relay_reply, smtp_server_reply_forward(cmd, &reply); } -int cmd_rset_relay(struct client *client, struct smtp_server_cmd_ctx *cmd) +static int +backend_relay_cmd_rset(struct submission_backend *_backend, + struct smtp_server_cmd_ctx *cmd) { - struct submission_backend_relay *backend = &client->backend; + struct submission_backend_relay *backend = + (struct submission_backend_relay *)_backend; struct relay_cmd_rset_context *rset_cmd; rset_cmd = p_new(cmd->pool, struct relay_cmd_rset_context, 1); @@ -499,11 +513,14 @@ relay_cmd_data_callback(const struct smtp_reply *relay_reply, smtp_server_reply_forward(cmd, &reply); } -int cmd_data_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_transaction *trans, - struct istream *data_input) +static int +backend_relay_cmd_data(struct submission_backend *_backend, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_transaction *trans, + struct istream *data_input) { - struct submission_backend_relay *backend = &client->backend; + struct submission_backend_relay *backend = + (struct submission_backend_relay *)_backend; struct relay_cmd_data_context *data_ctx; /* start relaying to relay server */ @@ -557,10 +574,12 @@ relay_cmd_vrfy_callback(const struct smtp_reply *relay_reply, smtp_server_reply_forward(cmd, &reply); } -int cmd_vrfy_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, - const char *param) +static int +backend_relay_cmd_vrfy(struct submission_backend *_backend, + struct smtp_server_cmd_ctx *cmd, const char *param) { - struct submission_backend_relay *backend = &client->backend; + struct submission_backend_relay *backend = + (struct submission_backend_relay *)_backend; struct relay_cmd_vrfy_context *vrfy_cmd; vrfy_cmd = p_new(cmd->pool, struct relay_cmd_vrfy_context, 1); @@ -602,9 +621,12 @@ relay_cmd_noop_callback(const struct smtp_reply *relay_reply, } } -int cmd_noop_relay(struct client *client, struct smtp_server_cmd_ctx *cmd) +static int +backend_relay_cmd_noop(struct submission_backend *_backend, + struct smtp_server_cmd_ctx *cmd) { - struct submission_backend_relay *backend = &client->backend; + struct submission_backend_relay *backend = + (struct submission_backend_relay *)_backend; struct relay_cmd_noop_context *noop_cmd; noop_cmd = p_new(cmd->pool, struct relay_cmd_noop_context, 1); @@ -698,9 +720,12 @@ relay_cmd_quit_next(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED, relay_cmd_quit_relay(quit_cmd); } -int cmd_quit_relay(struct client *client, struct smtp_server_cmd_ctx *cmd) +static int +backend_relay_cmd_quit(struct submission_backend *_backend, + struct smtp_server_cmd_ctx *cmd) { - struct submission_backend_relay *backend = &client->backend; + struct submission_backend_relay *backend = + (struct submission_backend_relay *)_backend; struct relay_cmd_quit_context *quit_cmd; quit_cmd = p_new(cmd->pool, struct relay_cmd_quit_context, 1); @@ -734,7 +759,8 @@ void client_proxy_create(struct client *client, enum smtp_client_connection_ssl_mode ssl_mode; backend = &client->backend; - backend->backend.client = client; + submission_backend_init(&backend->backend, client, + &backend_relay_vfuncs); i_zero(&ssl_set); mail_user_init_ssl_client_settings(user, &ssl_set); @@ -848,3 +874,18 @@ uoff_t client_proxy_get_max_mail_size(struct client *client) return smtp_client_connection_get_size_capability(backend->conn); } + +static struct submission_backend_vfuncs backend_relay_vfuncs = { + .cmd_helo = backend_relay_cmd_helo, + + .cmd_mail = backend_relay_cmd_mail, + .cmd_rcpt = backend_relay_cmd_rcpt, + .cmd_rset = backend_relay_cmd_rset, + .cmd_data = backend_relay_cmd_data, + + .cmd_vrfy = backend_relay_cmd_vrfy, + .cmd_noop = backend_relay_cmd_noop, + + .cmd_quit = backend_relay_cmd_quit, +}; + diff --git a/src/submission/submission-backend-relay.h b/src/submission/submission-backend-relay.h index 94fe6b9f10..bd2b53ddd0 100644 --- a/src/submission/submission-backend-relay.h +++ b/src/submission/submission-backend-relay.h @@ -5,21 +5,6 @@ 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, - struct smtp_server_cmd_mail *data); -int cmd_rcpt_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_cmd_rcpt *data); -int cmd_rset_relay(struct client *client, struct smtp_server_cmd_ctx *cmd); -int cmd_data_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, - struct smtp_server_transaction *trans, - struct istream *data_input); -int cmd_vrfy_relay(struct client *client, struct smtp_server_cmd_ctx *cmd, - const char *param); -int cmd_noop_relay(struct client *client, struct smtp_server_cmd_ctx *cmd); -int cmd_quit_relay(struct client *client, struct smtp_server_cmd_ctx *cmd); - struct submission_settings; struct submission_backend_relay { diff --git a/src/submission/submission-commands.c b/src/submission/submission-commands.c index fec5e02b79..8637a514ae 100644 --- a/src/submission/submission-commands.c +++ b/src/submission/submission-commands.c @@ -82,8 +82,10 @@ int cmd_helo(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, if (!data->first || smtp_server_connection_get_state(client->conn) - >= SMTP_SERVER_STATE_READY) - return cmd_helo_relay(client, cmd, data); + >= SMTP_SERVER_STATE_READY) { + return submission_backend_cmd_helo(client->backend_default, + cmd, data); + } /* respond right away */ submission_helo_reply_submit(cmd, data); @@ -99,7 +101,7 @@ int cmd_mail(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, { struct client *client = conn_ctx; - return cmd_mail_relay(client, cmd, data); + return submission_backend_cmd_mail(client->backend_default, cmd, data); } /* @@ -142,7 +144,7 @@ int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, data->trans_context = rcpt; data->hook_finished = submission_rcpt_finished; - return cmd_rcpt_relay(client, cmd, data); + return submission_backend_cmd_rcpt(client->backend_default, cmd, data); } /* @@ -153,7 +155,7 @@ int cmd_rset(void *conn_ctx, struct smtp_server_cmd_ctx *cmd) { struct client *client = conn_ctx; - return cmd_rset_relay(client, cmd); + return submission_backend_cmd_rset(client->backend_default, cmd); } /* @@ -204,7 +206,8 @@ int cmd_data_continue(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, i_stream_unref(&inputs[0]); i_stream_unref(&inputs[1]); - ret = cmd_data_relay(client, cmd, trans, data_input); + ret = submission_backend_cmd_data(client->backend_default, cmd, + trans, data_input); i_stream_unref(&data_input); return ret; @@ -454,7 +457,7 @@ int cmd_vrfy(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, { struct client *client = conn_ctx; - return cmd_vrfy_relay(client, cmd, param); + return submission_backend_cmd_vrfy(client->backend_default, cmd, param); } /* @@ -465,7 +468,7 @@ int cmd_noop(void *conn_ctx, struct smtp_server_cmd_ctx *cmd) { struct client *client = conn_ctx; - return cmd_noop_relay(client, cmd); + return submission_backend_cmd_noop(client->backend_default, cmd); } /* @@ -510,6 +513,6 @@ int cmd_quit(void *conn_ctx, struct smtp_server_cmd_ctx *cmd) smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_NEXT, cmd_quit_next, quit_cmd); - return cmd_quit_relay(client, cmd); + return submission_backend_cmd_quit(client->backend_default, cmd); } -- 2.47.3