From: Stephan Bosch Date: Thu, 4 Oct 2018 22:26:56 +0000 (+0200) Subject: submission: client: Add API for adding extra (non-standard) capabilities. X-Git-Tag: 2.3.5~139 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ee006535a7559802b9b65765d1fdfd184825e39c;p=thirdparty%2Fdovecot%2Fcore.git submission: client: Add API for adding extra (non-standard) capabilities. --- diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index b08226f19d..ae67fc600b 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -19,6 +19,7 @@ #include "mail-storage-service.h" #include "raw-storage.h" #include "imap-urlauth.h" +#include "smtp-syntax.h" #include "smtp-client-connection.h" #include "submission-backend-relay.h" @@ -502,6 +503,29 @@ uoff_t client_get_max_mail_size(struct client *client) return max_size; } +void client_add_extra_capability(struct client *client, const char *capability, + const char *params) +{ + struct client_extra_capability cap; + + /* Don't add capabilties handled by lib-smtp here */ + i_assert(smtp_capability_find_by_name(capability) + == SMTP_CAPABILITY_NONE); + + /* Avoid committing protocol errors */ + i_assert(smtp_ehlo_keyword_is_valid(capability)); + i_assert(params == NULL || smtp_ehlo_params_are_valid(params)); + + i_zero(&cap); + cap.capability = p_strdup(client->pool, capability); + cap.params = p_strdup(client->pool, params); + + if (!array_is_created(&client->extra_capabilities)) + p_array_init(&client->extra_capabilities, client->pool, 5); + + array_append(&client->extra_capabilities, &cap, 1); +} + void clients_destroy_all(void) { while (submission_clients != NULL) { diff --git a/src/submission/submission-client.h b/src/submission/submission-client.h index a3a4bf1218..84ba7e0651 100644 --- a/src/submission/submission-client.h +++ b/src/submission/submission-client.h @@ -17,6 +17,11 @@ struct client_state { uoff_t data_size; }; +struct client_extra_capability { + const char *capability; + const char *params; +}; + struct submission_client_vfuncs { void (*destroy)(struct client *client, const char *prefix, const char *reason); @@ -79,6 +84,9 @@ struct client { struct submission_backend *backends; unsigned int backends_count; + /* Extra (non-standard) capabilities */ + ARRAY(struct client_extra_capability) extra_capabilities; + /* Module-specific contexts. */ ARRAY(union submission_module_context *) module_contexts; @@ -124,6 +132,9 @@ const char *client_state_get_name(struct client *client); uoff_t client_get_max_mail_size(struct client *client); +void client_add_extra_capability(struct client *client, const char *capability, + const char *params) ATTR_NULL(2); + int client_input_read(struct client *client); int client_handle_input(struct client *client); diff --git a/src/submission/submission-commands.c b/src/submission/submission-commands.c index cbf3bab980..ae449677ce 100644 --- a/src/submission/submission-commands.c +++ b/src/submission/submission-commands.c @@ -20,6 +20,25 @@ * EHLO, HELO commands */ +static void +submission_helo_reply_add_extra(struct client *client, + struct smtp_server_reply *reply) +{ + const struct client_extra_capability *cap; + + if (!array_is_created(&client->extra_capabilities)) + return; + + array_foreach(&client->extra_capabilities, cap) { + if (cap->params == NULL) { + smtp_server_reply_ehlo_add(reply, cap->capability); + } else { + smtp_server_reply_ehlo_add_param(reply, cap->capability, + "%s", cap->params); + } + } +} + void submission_helo_reply_submit(struct smtp_server_cmd_ctx *cmd, struct smtp_server_cmd_helo *data) { @@ -71,6 +90,8 @@ void submission_helo_reply_submit(struct smtp_server_cmd_ctx *cmd, smtp_server_reply_ehlo_add(reply, "SIZE"); } smtp_server_reply_ehlo_add(reply, "VRFY"); + + submission_helo_reply_add_extra(client, reply); } smtp_server_reply_submit(reply); }