From: Karl Fleischmann Date: Thu, 12 Oct 2023 13:38:21 +0000 (+0200) Subject: lib-smtp: Trigger SNI callback on TLS handshake X-Git-Tag: 2.4.1~1284 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=077aff696ccd0932909f4dbef9aa69d9f54ad424;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: Trigger SNI callback on TLS handshake Allow individual implementations to handle SNI callback in response to a TLS handshake. --- diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index 0317009267..ebd96d2b5d 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -342,6 +342,26 @@ smtp_server_connection_handle_command(struct smtp_server_connection *conn, return (!smtp_server_command_unref(&cmd) || finished); } +static int +smtp_server_connection_sni_callback(const char *name, const char **error_r, + void *context) +{ + struct smtp_server_connection *conn = context; + struct ssl_iostream_context *ssl_ctx; + + if (conn->callbacks->conn_tls_sni_callback != NULL && + conn->callbacks->conn_tls_sni_callback(name, error_r, conn) < 0) + return -1; + + if (ssl_iostream_server_context_cache_get(conn->set.ssl, &ssl_ctx, + error_r) < 0) + return -1; + + ssl_iostream_change_context(conn->ssl_iostream, ssl_ctx); + ssl_iostream_context_unref(&ssl_ctx); + return 0; +} + int smtp_server_connection_ssl_init(struct smtp_server_connection *conn) { struct ssl_iostream_context *ssl_ctx; @@ -380,6 +400,8 @@ int smtp_server_connection_ssl_init(struct smtp_server_connection *conn) conn->conn.name, error); return -1; } + ssl_iostream_set_sni_callback( + conn->ssl_iostream, smtp_server_connection_sni_callback, conn); smtp_server_connection_input_resume(conn); conn->ssl_secured = TRUE; diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index ab04078032..a153f648a0 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -298,6 +298,8 @@ struct smtp_server_callbacks { void (*conn_proxy_data_updated)(void *conn_ctx, const struct smtp_proxy_data *data); + /* TLS SNI Callback. */ + int (*conn_tls_sni_callback)(const char *name, const char **error_r, void *context); /* Connection */ int (*conn_start_tls)(void *conn_ctx, struct istream **input, struct ostream **output);