From: Stephan Bosch Date: Sat, 15 Sep 2018 19:47:42 +0000 (+0200) Subject: submission: Implement client vfuncs for all normal SMTP commands. X-Git-Tag: 2.3.5~144 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=83d37361d455b22e849aada8be47c2d693bb6972;p=thirdparty%2Fdovecot%2Fcore.git submission: Implement client vfuncs for all normal SMTP commands. --- diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index e01a861345..474f74223d 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -520,4 +520,16 @@ static const struct smtp_server_callbacks smtp_callbacks = { static const struct submission_client_vfuncs submission_client_vfuncs = { client_default_destroy, + + .cmd_helo = client_default_cmd_helo, + + .cmd_mail = client_default_cmd_mail, + .cmd_rcpt = client_default_cmd_rcpt, + .cmd_rset = client_default_cmd_rset, + .cmd_data = client_default_cmd_data, + + .cmd_vrfy = client_default_cmd_vrfy, + + .cmd_noop = client_default_cmd_noop, + .cmd_quit = client_default_cmd_quit, }; diff --git a/src/submission/submission-client.h b/src/submission/submission-client.h index 98fb9d1242..8329d4700b 100644 --- a/src/submission/submission-client.h +++ b/src/submission/submission-client.h @@ -20,6 +20,27 @@ struct client_state { struct submission_client_vfuncs { void (*destroy)(struct client *client, const char *prefix, const char *reason); + + int (*cmd_helo)(struct client *client, struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_helo *data); + + int (*cmd_mail)(struct client *client, struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_mail *data); + int (*cmd_rcpt)(struct client *client, + struct submission_recipient *rcpt, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_rcpt *data); + int (*cmd_rset)(struct client *client, struct smtp_server_cmd_ctx *cmd); + int (*cmd_data)(struct client *client, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_transaction *trans, + struct istream *data_input, uoff_t data_size); + + int (*cmd_vrfy)(struct client *client, struct smtp_server_cmd_ctx *cmd, + const char *param); + + int (*cmd_noop)(struct client *client, struct smtp_server_cmd_ctx *cmd); + int (*cmd_quit)(struct client *client, struct smtp_server_cmd_ctx *cmd); }; struct client { diff --git a/src/submission/submission-commands.c b/src/submission/submission-commands.c index 865c5251ed..cbf3bab980 100644 --- a/src/submission/submission-commands.c +++ b/src/submission/submission-commands.c @@ -82,16 +82,22 @@ 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 submission_backend_cmd_helo(client->backend_default, - cmd, data); - } + >= SMTP_SERVER_STATE_READY) + return client->v.cmd_helo(client, cmd, data); /* respond right away */ submission_helo_reply_submit(cmd, data); return 1; } +int client_default_cmd_helo(struct client *client, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_helo *data) +{ + return submission_backend_cmd_helo(client->backend_default, cmd, data); +} + + /* * MAIL command */ @@ -103,6 +109,13 @@ int cmd_mail(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, client->state.backend = client->backend_default; + return client->v.cmd_mail(client, cmd, data); +} + +int client_default_cmd_mail(struct client *client, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_mail *data) +{ return submission_backend_cmd_mail(client->state.backend, cmd, data); } @@ -136,7 +149,6 @@ int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_rcpt *data) { struct client *client = conn_ctx; - struct smtp_server_transaction *trans; struct submission_recipient *rcpt; rcpt = submission_recipient_create(client, data->path); @@ -147,6 +159,16 @@ int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, data->trans_context = rcpt; data->hook_finished = submission_rcpt_finished; + return client->v.cmd_rcpt(client, rcpt, cmd, data); +} + +int client_default_cmd_rcpt(struct client *client ATTR_UNUSED, + struct submission_recipient *rcpt, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_rcpt *data) +{ + struct smtp_server_transaction *trans; + trans = smtp_server_connection_get_transaction(cmd->conn); if (trans != NULL) submission_backend_trans_start(rcpt->backend, trans); @@ -161,6 +183,13 @@ int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, int cmd_rset(void *conn_ctx, struct smtp_server_cmd_ctx *cmd) { struct client *client = conn_ctx; + + return client->v.cmd_rset(client, cmd); +} + +int client_default_cmd_rset(struct client *client, + struct smtp_server_cmd_ctx *cmd) +{ struct submission_backend *backend = client->state.backend; if (backend == NULL) @@ -221,8 +250,7 @@ int cmd_data_continue(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, i_stream_unref(&inputs[0]); i_stream_unref(&inputs[1]); - ret = submission_backends_cmd_data(client, cmd, trans, - data_input, data_size); + ret = client->v.cmd_data(client, cmd, trans, data_input, data_size); i_stream_unref(&data_input); return ret; @@ -247,6 +275,15 @@ int cmd_data_begin(void *conn_ctx, return 0; } +int client_default_cmd_data(struct client *client, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_transaction *trans, + struct istream *data_input, uoff_t data_size) +{ + return submission_backends_cmd_data(client, cmd, trans, + data_input, data_size); +} + /* * BURL command */ @@ -472,6 +509,12 @@ int cmd_vrfy(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, { struct client *client = conn_ctx; + return client->v.cmd_vrfy(client, cmd, param); +} + +int client_default_cmd_vrfy(struct client *client, + struct smtp_server_cmd_ctx *cmd, const char *param) +{ return submission_backend_cmd_vrfy(client->backend_default, cmd, param); } @@ -483,6 +526,12 @@ int cmd_noop(void *conn_ctx, struct smtp_server_cmd_ctx *cmd) { struct client *client = conn_ctx; + return client->v.cmd_noop(client, cmd); +} + +int client_default_cmd_noop(struct client *client, + struct smtp_server_cmd_ctx *cmd) +{ return submission_backend_cmd_noop(client->backend_default, cmd); } @@ -528,6 +577,13 @@ 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 client->v.cmd_quit(client, cmd); +} + +int client_default_cmd_quit(struct client *client, + struct smtp_server_cmd_ctx *cmd) +{ return submission_backend_cmd_quit(client->backend_default, cmd); } + diff --git a/src/submission/submission-commands.h b/src/submission/submission-commands.h index 6bb1af5b30..c54e689bea 100644 --- a/src/submission/submission-commands.h +++ b/src/submission/submission-commands.h @@ -1,28 +1,99 @@ #ifndef SUBMISSION_COMMANDS_H #define SUBMISSION_COMMANDS_H +/* + * HELO command + */ + void submission_helo_reply_submit(struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_helo *data); + int cmd_helo(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_helo *data); +int client_default_cmd_helo(struct client *client, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_helo *data); + +/* + * MAIL command + */ + int cmd_mail(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_mail *data); + +int client_default_cmd_mail(struct client *client, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_mail *data); + +/* + * RCPT command + */ + int cmd_rcpt(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_rcpt *data); + +int client_default_cmd_rcpt(struct client *client ATTR_UNUSED, + struct submission_recipient *rcpt, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_cmd_rcpt *data); + +/* + * RSET command + */ + int cmd_rset(void *conn_ctx, struct smtp_server_cmd_ctx *cmd); +int client_default_cmd_rset(struct client *client, + struct smtp_server_cmd_ctx *cmd); + +/* + * DATA/BDAT commands + */ + int cmd_data_begin(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct smtp_server_transaction *trans, struct istream *data_input); int cmd_data_continue(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, struct smtp_server_transaction *trans); + +int client_default_cmd_data(struct client *client, + struct smtp_server_cmd_ctx *cmd, + struct smtp_server_transaction *trans, + struct istream *data_input, uoff_t data_size); + +/* + * BURL command + */ + void cmd_burl(struct smtp_server_cmd_ctx *cmd, const char *params); +/* + * VRFY command + */ + int cmd_vrfy(void *conn_ctx, struct smtp_server_cmd_ctx *cmd, const char *param); +int client_default_cmd_vrfy(struct client *client, + struct smtp_server_cmd_ctx *cmd, const char *param); + +/* + * NOOP command + */ + int cmd_noop(void *conn_ctx, struct smtp_server_cmd_ctx *cmd); + +int client_default_cmd_noop(struct client *client, + struct smtp_server_cmd_ctx *cmd); + +/* + * QUIT command + */ + int cmd_quit(void *conn_ctx, struct smtp_server_cmd_ctx *cmd); +int client_default_cmd_quit(struct client *client, + struct smtp_server_cmd_ctx *cmd); + #endif