From: Stephan Bosch Date: Sun, 7 May 2017 12:58:05 +0000 (+0200) Subject: lib-smtp: smtp-submit: Added SSL support. X-Git-Tag: 2.3.0.rc1~354 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ac8f4f30d6c65f391ef4912ab4e87f4f26c891fa;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-submit: Added SSL support. --- diff --git a/src/lib-lda/mail-send.c b/src/lib-lda/mail-send.c index 3966ae40bd..13c08706a4 100644 --- a/src/lib-lda/mail-send.c +++ b/src/lib-lda/mail-send.c @@ -89,7 +89,7 @@ int mail_send_rejection(struct mail_deliver_context *ctx, vtable = get_var_expand_table(mail, recipient, reason); - smtp_submit = smtp_submit_init_simple(ctx->smtp_set, NULL); + smtp_submit = smtp_submit_init_simple(ctx->smtp_set, NULL, NULL); smtp_submit_add_rcpt(smtp_submit, return_addr); output = smtp_submit_send(smtp_submit); diff --git a/src/lib-smtp/smtp-submit-settings.c b/src/lib-smtp/smtp-submit-settings.c index bda8c44cce..b6e4241e6e 100644 --- a/src/lib-smtp/smtp-submit-settings.c +++ b/src/lib-smtp/smtp-submit-settings.c @@ -24,6 +24,8 @@ static const struct setting_define smtp_submit_setting_defines[] = { DEF(SET_STR_VARS, sendmail_path), DEF(SET_TIME, submission_timeout), + DEF(SET_ENUM, submission_ssl), + SETTING_DEFINE_LIST_END }; @@ -34,6 +36,8 @@ static const struct smtp_submit_settings smtp_submit_default_settings = { .submission_host = "", .sendmail_path = "/usr/sbin/sendmail", .submission_timeout = 30, + + .submission_ssl = "no:smtps:submissions:starttls", }; const struct setting_parser_info smtp_submit_setting_parser_info = { diff --git a/src/lib-smtp/smtp-submit-settings.h b/src/lib-smtp/smtp-submit-settings.h index 1ede5c8355..08c4243ccb 100644 --- a/src/lib-smtp/smtp-submit-settings.h +++ b/src/lib-smtp/smtp-submit-settings.h @@ -8,6 +8,8 @@ struct smtp_submit_settings { const char *submission_host; const char *sendmail_path; unsigned int submission_timeout; + + const char *submission_ssl; }; extern const struct setting_parser_info smtp_submit_setting_parser_info; diff --git a/src/lib-smtp/smtp-submit.c b/src/lib-smtp/smtp-submit.c index 799a652d24..a618e991a7 100644 --- a/src/lib-smtp/smtp-submit.c +++ b/src/lib-smtp/smtp-submit.c @@ -7,6 +7,7 @@ #include "istream.h" #include "ostream.h" #include "iostream-temp.h" +#include "iostream-ssl.h" #include "master-service.h" #include "program-client.h" #include "smtp-client.h" @@ -24,6 +25,7 @@ struct smtp_submit_session { pool_t pool; struct smtp_submit_settings set; + struct ssl_iostream_settings ssl_set; }; struct smtp_submit { @@ -52,7 +54,8 @@ struct smtp_submit { }; struct smtp_submit_session * -smtp_submit_session_init(const struct smtp_submit_settings *set) +smtp_submit_session_init(const struct smtp_submit_settings *set, + const struct ssl_iostream_settings *ssl_set) { struct smtp_submit_session *session; pool_t pool; @@ -62,9 +65,18 @@ smtp_submit_session_init(const struct smtp_submit_settings *set) session->pool = pool; session->set = *set; - session->set.hostname = p_strdup_empty(pool, set->hostname); - session->set.submission_host = p_strdup_empty(pool, set->submission_host); - session->set.sendmail_path = p_strdup_empty(pool, set->sendmail_path); + session->set.hostname = + p_strdup_empty(pool, set->hostname); + session->set.submission_host = + p_strdup_empty(pool, set->submission_host); + session->set.sendmail_path = + p_strdup_empty(pool, set->sendmail_path); + session->set.submission_ssl = + p_strdup_empty(pool, set->submission_ssl); + + if (ssl_set != NULL) + ssl_iostream_settings_init_from(pool, &session->ssl_set, ssl_set); + return session; } @@ -96,12 +108,13 @@ smtp_submit_init(struct smtp_submit_session *session, struct smtp_submit * smtp_submit_init_simple(const struct smtp_submit_settings *set, + const struct ssl_iostream_settings *ssl_set, const struct smtp_address *mail_from) { struct smtp_submit_session *session; struct smtp_submit *subm; - session = smtp_submit_session_init(set); + session = smtp_submit_session_init(set, ssl_set); subm = smtp_submit_init(session, mail_from); subm->simple = TRUE; return subm; @@ -270,6 +283,7 @@ smtp_submit_send_host(struct smtp_submit *subm) struct smtp_client *smtp_client; struct smtp_client_connection *smtp_conn; struct smtp_client_transaction *smtp_trans; + enum smtp_client_connection_ssl_mode ssl_mode; struct smtp_address *const *rcptp; const char *host; in_port_t port; @@ -286,11 +300,20 @@ smtp_submit_send_host(struct smtp_submit *subm) smtp_set.connect_timeout_msecs = set->submission_timeout*1000; smtp_set.command_timeout_msecs = set->submission_timeout*1000; smtp_set.debug = set->mail_debug; + smtp_set.ssl = &subm->session->ssl_set; + + ssl_mode = SMTP_CLIENT_SSL_MODE_NONE; + if (set->submission_ssl != NULL) { + if (strcasecmp(set->submission_ssl, "smtps") == 0 || + strcasecmp(set->submission_ssl, "submissions") == 0) + ssl_mode = SMTP_CLIENT_SSL_MODE_IMMEDIATE; + else if (strcasecmp(set->submission_ssl, "starttls") == 0) + ssl_mode = SMTP_CLIENT_SSL_MODE_STARTTLS; + } smtp_client = smtp_client_init(&smtp_set); smtp_conn = smtp_client_connection_create(smtp_client, - SMTP_PROTOCOL_SMTP, host, port, - SMTP_CLIENT_SSL_MODE_NONE, NULL); + SMTP_PROTOCOL_SMTP, host, port, ssl_mode, NULL); smtp_trans = smtp_client_transaction_create(smtp_conn, subm->mail_from, NULL, smtp_submit_send_host_finished, subm); diff --git a/src/lib-smtp/smtp-submit.h b/src/lib-smtp/smtp-submit.h index f1d466e2e6..a8883df30c 100644 --- a/src/lib-smtp/smtp-submit.h +++ b/src/lib-smtp/smtp-submit.h @@ -3,6 +3,7 @@ #include "smtp-submit-settings.h" +struct ssl_iostream_settings; struct smtp_address; struct smtp_submit_settings; struct smtp_submit_session; @@ -24,7 +25,8 @@ smtp_submit_callback_t(const struct smtp_submit_result *result, /* Use submit session to reuse resources (e.g. SMTP connections) between submissions (FIXME: actually implement this) */ struct smtp_submit_session * -smtp_submit_session_init(const struct smtp_submit_settings *set); +smtp_submit_session_init(const struct smtp_submit_settings *set, + const struct ssl_iostream_settings *ssl_set) ATTR_NULL(2); void smtp_submit_session_deinit(struct smtp_submit_session **_session); struct smtp_submit * @@ -32,7 +34,8 @@ smtp_submit_init(struct smtp_submit_session *session, const struct smtp_address *mail_from); struct smtp_submit * smtp_submit_init_simple(const struct smtp_submit_settings *set, - const struct smtp_address *mail_from); + const struct ssl_iostream_settings *ssl_set, + const struct smtp_address *mail_from) ATTR_NULL(2); void smtp_submit_deinit(struct smtp_submit **_submit); /* Add a new recipient */ diff --git a/src/lib-smtp/test-smtp-submit.c b/src/lib-smtp/test-smtp-submit.c index bfe6ea3da9..026c306a21 100644 --- a/src/lib-smtp/test-smtp-submit.c +++ b/src/lib-smtp/test-smtp-submit.c @@ -757,7 +757,7 @@ test_client_denied_second_rcpt(const struct smtp_submit_settings *submit_set) t_strdup_printf("127.0.0.1:%u", bind_ports[0]); smtp_submit_set.submission_timeout = 1000; - smtp_submit = smtp_submit_init_simple(&smtp_submit_set, + smtp_submit = smtp_submit_init_simple(&smtp_submit_set, NULL, SMTP_ADDRESS_LITERAL("sender", "example.com")); smtp_submit_add_rcpt(smtp_submit, @@ -1470,7 +1470,7 @@ test_client_parallel_delivery(const struct smtp_submit_settings *submit_set) /* submit 1 */ smtp_submit_set.submission_host = t_strdup_printf("127.0.0.1:%u", bind_ports[0]); - smtp_submit1 = smtp_submit_init_simple(&smtp_submit_set, + smtp_submit1 = smtp_submit_init_simple(&smtp_submit_set, NULL, SMTP_ADDRESS_LITERAL("sender", "example.com")); smtp_submit_add_rcpt(smtp_submit1, @@ -1484,7 +1484,7 @@ test_client_parallel_delivery(const struct smtp_submit_settings *submit_set) /* submit 2 */ smtp_submit_set.submission_host = t_strdup_printf("127.0.0.1:%u", bind_ports[1]); - smtp_submit2 = smtp_submit_init_simple(&smtp_submit_set, + smtp_submit2 = smtp_submit_init_simple(&smtp_submit_set, NULL, SMTP_ADDRESS_LITERAL("sender", "example.com")); smtp_submit_add_rcpt(smtp_submit2, @@ -1558,7 +1558,7 @@ test_client_failed_sendmail(const struct smtp_submit_settings *submit_set) smtp_submit_set.sendmail_path = sendmail_path; smtp_submit_set.submission_timeout = 5; - smtp_submit = smtp_submit_init_simple(&smtp_submit_set, + smtp_submit = smtp_submit_init_simple(&smtp_submit_set, NULL, SMTP_ADDRESS_LITERAL("sender", "example.com")); smtp_submit_add_rcpt(smtp_submit, @@ -1613,7 +1613,7 @@ test_client_successful_sendmail(const struct smtp_submit_settings *submit_set) smtp_submit_set.sendmail_path = sendmail_path; smtp_submit_set.submission_timeout = 5; - smtp_submit = smtp_submit_init_simple(&smtp_submit_set, + smtp_submit = smtp_submit_init_simple(&smtp_submit_set, NULL, SMTP_ADDRESS_LITERAL("sender", "example.com")); smtp_submit_add_rcpt(smtp_submit, @@ -1697,7 +1697,7 @@ test_client_parallel_sendmail(const struct smtp_submit_settings *submit_set) /* submit 1 */ smtp_submit_set.sendmail_path = sendmail_path1; - smtp_submit1 = smtp_submit_init_simple(&smtp_submit_set, + smtp_submit1 = smtp_submit_init_simple(&smtp_submit_set, NULL, SMTP_ADDRESS_LITERAL("sender", "example.com")); smtp_submit_add_rcpt(smtp_submit1, @@ -1710,7 +1710,7 @@ test_client_parallel_sendmail(const struct smtp_submit_settings *submit_set) /* submit 2 */ smtp_submit_set.sendmail_path = sendmail_path2; - smtp_submit2 = smtp_submit_init_simple(&smtp_submit_set, + smtp_submit2 = smtp_submit_init_simple(&smtp_submit_set, NULL, SMTP_ADDRESS_LITERAL("sender", "example.com")); smtp_submit_add_rcpt(smtp_submit2, @@ -1808,7 +1808,7 @@ test_client_smtp_send_simple(const struct smtp_submit_settings *smtp_set, smtp_submit_set = *smtp_set; smtp_submit_set.submission_host = host, - smtp_submit = smtp_submit_init_simple(&smtp_submit_set, + smtp_submit = smtp_submit_init_simple(&smtp_submit_set, NULL, SMTP_ADDRESS_LITERAL("sender", "example.com")); smtp_submit_add_rcpt(smtp_submit,