]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: server: Add proper infrastructure for adding custom MAIL/RCPT command param...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Thu, 13 Sep 2018 21:30:26 +0000 (23:30 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:40:51 +0000 (15:40 +0200)
src/lib-smtp/smtp-server-cmd-mail.c
src/lib-smtp/smtp-server-cmd-rcpt.c
src/lib-smtp/smtp-server-connection.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server.h

index b4b5b8a482480c4787edcc235bc9a49038b73b48..dc086e0a5646786cc3a4fc9bc24128143b3ffad2 100644 (file)
@@ -78,6 +78,7 @@ void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd,
        struct smtp_server_command *command = cmd->cmd;
        struct smtp_server_cmd_mail *mail_data;
        enum smtp_address_parse_flags path_parse_flags;
+       const char *const *param_extensions = NULL;
        struct smtp_address *path;
        enum smtp_param_parse_error pperror;
        const char *error;
@@ -139,9 +140,11 @@ void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd,
        mail_data = p_new(cmd->pool, struct smtp_server_cmd_mail, 1);
 
        /* [SP Mail-parameters] */
-       if (smtp_params_mail_parse(cmd->pool, params, caps,
-                                  set->mail_param_extensions, NULL,
-                                  &mail_data->params, &pperror, &error) < 0) {
+       if (array_is_created(&conn->mail_param_extensions))
+               param_extensions = array_idx(&conn->mail_param_extensions, 0);
+       if (smtp_params_mail_parse(cmd->pool, params, caps, param_extensions,
+                                  NULL, &mail_data->params, &pperror,
+                                  &error) < 0) {
                switch (pperror) {
                case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX:
                        smtp_server_reply(cmd, 501, "5.5.4", "%s", error);
index f05f05d96a002352062af7385886541160c215e8..93114762c8b15ad6a6b4ced6e40306b4f2421961 100644 (file)
@@ -95,6 +95,7 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd,
        struct smtp_server_command *command = cmd->cmd;
        struct smtp_server_cmd_rcpt *rcpt_data;
        enum smtp_address_parse_flags path_parse_flags;
+       const char *const *param_extensions = NULL;
        struct smtp_address *path;
        enum smtp_param_parse_error pperror;
        const char *error;
@@ -155,8 +156,9 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd,
        rcpt_data = p_new(cmd->pool, struct smtp_server_cmd_rcpt, 1);
 
        /* [SP Rcpt-parameters] */
-       if (smtp_params_rcpt_parse(cmd->pool, params, caps,
-                                  set->rcpt_param_extensions,
+       if (array_is_created(&conn->rcpt_param_extensions))
+               param_extensions = array_idx(&conn->rcpt_param_extensions, 0);
+       if (smtp_params_rcpt_parse(cmd->pool, params, caps, param_extensions,
                                   &rcpt_data->params, &pperror, &error) < 0) {
                switch (pperror) {
                case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX:
index 82689498be00d474c53ca8e8a005915184a2555a..7deafd7ed7c5d5510f35b0982215fa12b72be027 100644 (file)
@@ -906,6 +906,29 @@ smtp_server_connection_alloc(struct smtp_server *server,
                conn->set.debug = conn->set.debug || set->debug;
        }
 
+       if (set != NULL && set->mail_param_extensions != NULL) {
+               const char *const *extp;
+
+               p_array_init(&conn->mail_param_extensions, pool,
+                            str_array_length(set->mail_param_extensions) + 8);
+               for (extp = set->mail_param_extensions; *extp != NULL; extp++) {
+                       const char *ext = p_strdup(pool, *extp);
+                       array_append(&conn->mail_param_extensions, &ext, 1);
+               }
+               array_append_zero(&conn->mail_param_extensions);
+       }
+       if (set != NULL && set->rcpt_param_extensions != NULL) {
+               const char *const *extp;
+
+               p_array_init(&conn->rcpt_param_extensions, pool,
+                            str_array_length(set->rcpt_param_extensions) + 8);
+               for (extp = set->rcpt_param_extensions; *extp != NULL; extp++) {
+                       const char *ext = p_strdup(pool, *extp);
+                       array_append(&conn->rcpt_param_extensions, &ext, 1);
+               }
+               array_append_zero(&conn->rcpt_param_extensions);
+       }
+
        conn->remote_pid = (pid_t)-1;
        conn->remote_uid = (uid_t)-1;
        if (remote_ip != NULL && remote_ip->family != 0) {
@@ -1492,6 +1515,42 @@ void smtp_server_connection_set_proxy_data(struct smtp_server_connection *conn,
        }
 }
 
+void smtp_server_connection_register_mail_param(
+       struct smtp_server_connection *conn, const char *param)
+{
+       param = p_strdup(conn->pool, param);
+
+       if (!array_is_created(&conn->mail_param_extensions)) {
+               p_array_init(&conn->mail_param_extensions, conn->pool, 8);
+               array_append(&conn->mail_param_extensions, &param, 1);
+       } else {
+               unsigned int count = array_count(&conn->mail_param_extensions);
+
+               i_assert(count > 0);
+               array_idx_set(&conn->mail_param_extensions,
+                             count - 1, &param);
+       }
+       array_append_zero(&conn->mail_param_extensions);
+}
+
+void smtp_server_connection_register_rcpt_param(
+       struct smtp_server_connection *conn, const char *param)
+{
+       param = p_strdup(conn->pool, param);
+
+       if (!array_is_created(&conn->rcpt_param_extensions)) {
+               p_array_init(&conn->rcpt_param_extensions, conn->pool, 8);
+               array_append(&conn->rcpt_param_extensions, &param, 1);
+       } else {
+               unsigned int count = array_count(&conn->rcpt_param_extensions);
+
+               i_assert(count > 0);
+               array_idx_set(&conn->rcpt_param_extensions,
+                             count - 1, &param);
+       }
+       array_append_zero(&conn->rcpt_param_extensions);
+}
+
 void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn)
 {
        if (conn->to_idle != NULL)
index dad37cdfe1f4e1010c73f9bf9a907c5940bdd105..2a80948765a6e2a251d4d837c83f450be86c8a85 100644 (file)
@@ -125,6 +125,10 @@ struct smtp_server_connection {
        unsigned int refcount;
 
        struct smtp_server_settings set;
+
+       ARRAY_TYPE(const_string) mail_param_extensions; /* NULL-terminated */
+       ARRAY_TYPE(const_string) rcpt_param_extensions; /* NULL-terminated */
+
        const struct smtp_server_callbacks *callbacks;
        void *context;
 
index 9e5a9058e905927457e29bbf0137e3ef58106317..9800ef94683fba8ff9fce80ca2be38e2636c2945 100644 (file)
@@ -381,6 +381,11 @@ void smtp_server_connection_get_proxy_data(struct smtp_server_connection *conn,
 void smtp_server_connection_set_capabilities(
        struct smtp_server_connection *conn, enum smtp_capability capabilities);
 
+void smtp_server_connection_register_mail_param(
+       struct smtp_server_connection *conn, const char *param);
+void smtp_server_connection_register_rcpt_param(
+       struct smtp_server_connection *conn, const char *param);
+
 bool smtp_server_connection_is_ssl_secured(struct smtp_server_connection *conn);
 bool smtp_server_connection_is_trusted(struct smtp_server_connection *conn);