]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-submit: Added SSL support.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sun, 7 May 2017 12:58:05 +0000 (14:58 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 26 Nov 2017 20:30:01 +0000 (22:30 +0200)
src/lib-lda/mail-send.c
src/lib-smtp/smtp-submit-settings.c
src/lib-smtp/smtp-submit-settings.h
src/lib-smtp/smtp-submit.c
src/lib-smtp/smtp-submit.h
src/lib-smtp/test-smtp-submit.c

index 3966ae40bdd212d9cd7a18ff97bd5c3cc6dee501..13c08706a479545448fa217288ebb514e01e7871 100644 (file)
@@ -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);
 
index bda8c44ccecac372c315c1c4dbb5607ae2d97975..b6e4241e6e02a82410f4b2fb029e64a77bbec6d9 100644 (file)
@@ -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 = {
index 1ede5c835509b07cf100305ace2b0d17b9ba5862..08c4243ccb505577f03766819b45d3fc8f541ca4 100644 (file)
@@ -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;
index 799a652d24fae1a3e848c09f1d7d3acb0d609f49..a618e991a795969918bf9118b29ec4553940709d 100644 (file)
@@ -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);
index f1d466e2e673e68c49ddb11d647beb6cb0fc16a3..a8883df30ccfd9154bdc9c0112cd1ee61e42a270 100644 (file)
@@ -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 */
index bfe6ea3da93323b76ecd71d36f235d78f3f29173..026c306a21a48bca3a030c012943c3e86c299601 100644 (file)
@@ -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,