From: Stephan Bosch Date: Tue, 30 Mar 2021 19:33:17 +0000 (+0200) Subject: lib-smtp: smtp-client-connection - Change extra capability registration to use a... X-Git-Tag: 2.3.15~62 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=90d3a8714c4aedf8d0d914e45c6bef617277f2fc;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-client-connection - Change extra capability registration to use a struct. This is needed for adding additional features in later commit. --- diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index d6463903ca..c1d918dc49 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -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); } } diff --git a/src/lib-smtp/smtp-client-connection.h b/src/lib-smtp/smtp-client-connection.h index 44cc452a62..b406e2daf0 100644 --- a/src/lib-smtp/smtp-client-connection.h +++ b/src/lib-smtp/smtp-client-connection.h @@ -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); diff --git a/src/lib-smtp/smtp-client-private.h b/src/lib-smtp/smtp-client-private.h index b0a65d344f..5292a9d7f5 100644 --- a/src/lib-smtp/smtp-client-private.h +++ b/src/lib-smtp/smtp-client-private.h @@ -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 { diff --git a/src/lib-smtp/smtp-client.h b/src/lib-smtp/smtp-client.h index 4b030c71c5..1717a221d9 100644 --- a/src/lib-smtp/smtp-client.h +++ b/src/lib-smtp/smtp-client.h @@ -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; diff --git a/src/lmtp/lmtp-proxy.c b/src/lmtp/lmtp-proxy.c index 28434c7a81..7074949a8c 100644 --- a/src/lmtp/lmtp-proxy.c +++ b/src/lmtp/lmtp-proxy.c @@ -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(