]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client-connection - Change extra capability registration to use a...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 30 Mar 2021 19:33:17 +0000 (21:33 +0200)
committerMarkus Valentin <markus.valentin@open-xchange.com>
Tue, 20 Apr 2021 10:30:17 +0000 (12:30 +0200)
This is needed for adding additional features in later commit.

src/lib-smtp/smtp-client-connection.c
src/lib-smtp/smtp-client-connection.h
src/lib-smtp/smtp-client-private.h
src/lib-smtp/smtp-client.h
src/lmtp/lmtp-proxy.c

index d6463903caa90a112cad5b41d7de3fbd98bc1959..c1d918dc499dd122f9e37d7f04c6e9d04a308e52 100644 (file)
@@ -61,13 +61,16 @@ uoff_t smtp_client_connection_get_size_capability(
 }
 
 void smtp_client_connection_accept_extra_capability(
-       struct smtp_client_connection *conn, const char *cap_name)
+       struct smtp_client_connection *conn,
+       const struct smtp_client_capability_extra *cap)
 {
-       cap_name = p_strdup(conn->pool, cap_name);
+       struct smtp_client_capability_extra cap_new = {
+               .name = p_strdup(conn->pool, cap->name),
+       };
 
        if (!array_is_created(&conn->extra_capabilities))
                p_array_init(&conn->extra_capabilities, conn->pool, 8);
-       array_push_back(&conn->extra_capabilities, &cap_name);
+       array_push_back(&conn->extra_capabilities, &cap_new);
 }
 
 const struct smtp_capability_extra *
@@ -877,19 +880,19 @@ smtp_client_connection_starttls(struct smtp_client_connection *conn)
        return smtp_client_connection_authenticate(conn);
 }
 
-static bool
-smtp_client_connection_has_extra_capability(struct smtp_client_connection *conn,
-                                          const char *cap_name)
+static const struct smtp_client_capability_extra *
+smtp_client_connection_find_extra_capability(
+       struct smtp_client_connection *conn, const char *cap_name)
 {
-       const char *const *cap_idx;
+       const struct smtp_client_capability_extra *cap;
 
        if (!array_is_created(&conn->extra_capabilities))
-               return FALSE;
-       array_foreach(&conn->extra_capabilities, cap_idx) {
-               if (strcasecmp(*cap_idx, cap_name) == 0)
-                       return TRUE;
+               return NULL;
+       array_foreach(&conn->extra_capabilities, cap) {
+               if (strcasecmp(cap->name, cap_name) == 0)
+                       return cap;
        }
-       return FALSE;
+       return NULL;
 }
 
 static void
@@ -897,17 +900,20 @@ smtp_client_connection_record_extra_capability(
        struct smtp_client_connection *conn, const char *cap_name,
        const char *const *params)
 {
+       const struct smtp_client_capability_extra *ccap_extra;
        struct smtp_capability_extra cap_extra;
        pool_t pool = conn->cap_pool;
 
-       if (!smtp_client_connection_has_extra_capability(conn, cap_name))
+       ccap_extra = smtp_client_connection_find_extra_capability(
+               conn, cap_name);
+       if (ccap_extra == NULL)
                return;
 
        if (!array_is_created(&conn->caps.extra))
                p_array_init(&conn->caps.extra, pool, 4);
 
        i_zero(&cap_extra);
-       cap_extra.name = p_strdup(pool, cap_name);
+       cap_extra.name = p_strdup(pool, ccap_extra->name);
        cap_extra.params = p_strarray_dup(pool, params);
 
        array_push_back(&conn->caps.extra, &cap_extra);
@@ -1969,8 +1975,11 @@ smtp_client_connection_do_create(struct smtp_client *client, const char *name,
                p_array_init(&conn->extra_capabilities, pool,
                             str_array_length(set->extra_capabilities) + 8);
                for (extp = set->extra_capabilities; *extp != NULL; extp++) {
-                       const char *ext = p_strdup(pool, *extp);
-                       array_push_back(&conn->extra_capabilities, &ext);
+                       struct smtp_client_capability_extra cap = {
+                               .name = p_strdup(pool, *extp),
+                       };
+
+                       array_push_back(&conn->extra_capabilities, &cap);
                }
        }
 
index 44cc452a62cef16774678271e5c8acb1d5f113d0..b406e2daf04c33d142abe12f637b512b5d91f6ac 100644 (file)
@@ -10,6 +10,7 @@ enum smtp_capability;
 
 struct smtp_reply;
 struct smtp_client;
+struct smtp_client_capability_extra;
 struct smtp_client_settings;
 struct smtp_client_command;
 
@@ -80,7 +81,8 @@ smtp_client_connection_get_capabilities(struct smtp_client_connection *conn);
 uoff_t smtp_client_connection_get_size_capability(
        struct smtp_client_connection *conn);
 void smtp_client_connection_accept_extra_capability(
-       struct smtp_client_connection *conn, const char *cap_name);
+       struct smtp_client_connection *conn,
+       const struct smtp_client_capability_extra *cap);
 const struct smtp_capability_extra *
 smtp_client_connection_get_extra_capability(struct smtp_client_connection *conn,
                                            const char *name);
index b0a65d344f98a524ce42a538060083b56f856852..5292a9d7f5a466152c44d54384e2710d61204ad4 100644 (file)
@@ -174,7 +174,7 @@ struct smtp_client_connection {
 
        struct smtp_client_settings set;
        char *password;
-       ARRAY_TYPE(const_string) extra_capabilities;
+       ARRAY(struct smtp_client_capability_extra) extra_capabilities;
 
        pool_t cap_pool;
        struct {
index 4b030c71c523572abcfb25627a1144cd93115947..1717a221d9f9d73016edebb7cb447ab61fd14eb4 100644 (file)
@@ -37,6 +37,10 @@ enum smtp_client_command_error {
        SMTP_CLIENT_COMMAND_ERROR_TIMED_OUT
 };
 
+struct smtp_client_capability_extra {
+       const char *name;
+};
+
 struct smtp_client_settings {
        struct ip_addr my_ip;
        const char *my_hostname;
index 28434c7a815fcded8b9ebfdc071405c3ab1efa51..7074949a8c2deb8897ac52d6a733016436d2bb9d 100644 (file)
@@ -222,6 +222,9 @@ static struct lmtp_proxy_connection *
 lmtp_proxy_get_connection(struct lmtp_proxy *proxy,
                          const struct lmtp_proxy_rcpt_settings *set)
 {
+       static const struct smtp_client_capability_extra cap_rcpt_forward = {
+               .name = LMTP_RCPT_FORWARD_CAPABILITY,
+       };
        struct smtp_client_settings lmtp_set;
        struct smtp_server_transaction *trans = proxy->trans;
        struct lmtp_proxy_connection *const *conns, *conn;
@@ -274,8 +277,8 @@ lmtp_proxy_get_connection(struct lmtp_proxy *proxy,
                        conn->set.host, conn->set.port,
                        ssl_mode, &lmtp_set);
        }
-       smtp_client_connection_accept_extra_capability(
-               conn->lmtp_conn, LMTP_RCPT_FORWARD_CAPABILITY);
+       smtp_client_connection_accept_extra_capability(conn->lmtp_conn,
+                                                      &cap_rcpt_forward);
        smtp_client_connection_connect(conn->lmtp_conn, NULL, NULL);
 
        conn->lmtp_trans = smtp_client_transaction_create(