]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
submission: client: Add API for adding extra (non-standard) capabilities.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Thu, 4 Oct 2018 22:26:56 +0000 (00:26 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:40:54 +0000 (15:40 +0200)
src/submission/submission-client.c
src/submission/submission-client.h
src/submission/submission-commands.c

index b08226f19d3f1b5c08b2d5fc936928ce02284837..ae67fc600b0d96824a1a13b008b56f301cc5db1a 100644 (file)
@@ -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) {
index a3a4bf12180ff9ef37deb71835ad2ded8be6983c..84ba7e065118791d808100b892eca168e83f92f6 100644 (file)
@@ -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);
 
index cbf3bab980779bebe8eab12867175e028c55f94d..ae449677ce00cb0735314fca1bb2a30322a67975 100644 (file)
  * 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);
 }