]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
submission: relay backend: Use backend-specific settings rather than the generic...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 15 Sep 2018 14:01:59 +0000 (16:01 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Tue, 9 Oct 2018 06:41:17 +0000 (06:41 +0000)
This way, several relay backends can be operated together with different
settings.

src/submission/submission-backend-relay.c
src/submission/submission-backend-relay.h
src/submission/submission-client.c

index b5c19fe950622ada92b3e175485076d792d14488..ab4ab2e617cc12fed849faca3c3d3ae3c5d95336 100644 (file)
@@ -17,6 +17,7 @@ struct submission_backend_relay {
        struct smtp_client_connection *conn;
 
        bool xclient_sent:1;
+       bool trusted:1;
 };
 
 static struct submission_backend_vfuncs backend_relay_vfuncs;
@@ -103,10 +104,9 @@ static void
 relay_cmd_helo_update_xclient(struct submission_backend_relay *backend,
                              struct smtp_server_cmd_helo *data)
 {
-       struct client *client = backend->backend.client;
        struct smtp_proxy_data proxy_data;
 
-       if (!client->set->submission_relay_trusted)
+       if (!backend->trusted)
                return;
 
        i_zero(&proxy_data);
@@ -216,7 +216,7 @@ relay_cmd_mail_update_xclient(struct submission_backend_relay *backend)
 
        if (backend->xclient_sent)
                return;
-       if (!client->set->submission_relay_trusted)
+       if (!backend->trusted)
                return;
        if (helo_data->domain == NULL)
                return;
@@ -754,14 +754,14 @@ backend_relay_cmd_quit(struct submission_backend *_backend,
  */
 
 struct submission_backend *
-submission_backend_relay_create(struct client *client,
-                               const struct submission_settings *set)
+submission_backend_relay_create(
+       struct client *client,
+       const struct submision_backend_relay_settings *set)
 {
        struct submission_backend_relay *backend;
        struct mail_user *user = client->user;
        struct ssl_iostream_settings ssl_set;
        struct smtp_client_settings smtp_set;
-       enum smtp_client_connection_ssl_mode ssl_mode;
 
        backend = i_new(struct submission_backend_relay, 1);
        submission_backend_init(&backend->backend, client,
@@ -769,21 +769,24 @@ submission_backend_relay_create(struct client *client,
 
        i_zero(&ssl_set);
        mail_user_init_ssl_client_settings(user, &ssl_set);
-       if (set->submission_relay_ssl_verify)
+       if (set->ssl_verify)
                ssl_set.verbose_invalid_cert = TRUE;
        else
                ssl_set.allow_invalid_cert = TRUE;
 
        /* make relay connection */
        i_zero(&smtp_set);
-       smtp_set.my_hostname = set->hostname;
+       smtp_set.my_hostname = set->my_hostname;
        smtp_set.ssl = &ssl_set;
        smtp_set.debug = user->mail_debug;
-       smtp_set.rawlog_dir =
-               mail_user_home_expand(user,
-                                     set->submission_relay_rawlog_dir);
 
-       if (set->submission_relay_trusted) {
+       if (set->rawlog_dir != NULL) {
+               smtp_set.rawlog_dir =
+                       mail_user_home_expand(user, set->rawlog_dir);
+       }
+
+       if (set->trusted) {
+               backend->trusted = TRUE;
                smtp_set.peer_trusted = TRUE;
 
                if (user->conn.remote_ip != NULL) {
@@ -795,24 +798,15 @@ submission_backend_relay_create(struct client *client,
                smtp_set.proxy_data.login = user->username;
        }
 
-       smtp_set.username = set->submission_relay_user;
-       smtp_set.master_user = set->submission_relay_master_user;
-       smtp_set.password = set->submission_relay_password;
-       smtp_set.connect_timeout_msecs =
-               set->submission_relay_connect_timeout;
-       smtp_set.command_timeout_msecs =
-               set->submission_relay_command_timeout;
-
-       if (strcmp(set->submission_relay_ssl, "smtps") == 0)
-               ssl_mode = SMTP_CLIENT_SSL_MODE_IMMEDIATE;
-       else if (strcmp(set->submission_relay_ssl, "starttls") == 0)
-               ssl_mode = SMTP_CLIENT_SSL_MODE_STARTTLS;
-       else
-               ssl_mode = SMTP_CLIENT_SSL_MODE_NONE;
+       smtp_set.username = set->user;
+       smtp_set.master_user = set->master_user;
+       smtp_set.password = set->password;
+       smtp_set.connect_timeout_msecs = set->connect_timeout_msecs;
+       smtp_set.command_timeout_msecs = set->command_timeout_msecs;
 
        backend->conn = smtp_client_connection_create(
-               smtp_client, SMTP_PROTOCOL_SMTP, set->submission_relay_host,
-               set->submission_relay_port, ssl_mode, &smtp_set);
+               smtp_client, set->protocol, set->host, set->port,
+               set->ssl_mode, &smtp_set);
 
        return &backend->backend;
 }
index d1313cdd36e3d7c69bef6e0bdddd000784922c29..ea9c66cf8d48609c2cfd5f6b597a527b747def4e 100644 (file)
@@ -1,14 +1,37 @@
 #ifndef SUBMISSION_BACKEND_RELAY_H
 #define SUBMISSION_BACKEND_RELAY_H
 
+#include "smtp-client-connection.h"
+
 #include "submission-backend.h"
 
 struct client;
 
-struct submission_settings;
+struct submision_backend_relay_settings {
+       const char *my_hostname;
+
+       enum smtp_protocol protocol;
+       const char *host;
+       in_port_t port;
+
+       const char *user, *master_user;
+       const char *password;
+
+       enum smtp_client_connection_ssl_mode ssl_mode;
+
+       const char *rawlog_dir;
+       unsigned int max_idle_time;
+
+       unsigned int connect_timeout_msecs;
+       unsigned int command_timeout_msecs;
+
+       bool ssl_verify:1;
+       bool trusted:1;
+};
 
 struct submission_backend *
-submission_backend_relay_create(struct client *client,
-                               const struct submission_settings *set);
+submission_backend_relay_create(
+       struct client *client,
+       const struct submision_backend_relay_settings *set);
 
 #endif
index 7e5860aabfe83bfab75d74319c035aad0e2dfd12..b6ee4403fbf04aeac0a785fde9c9e8ebd6350802 100644 (file)
@@ -19,6 +19,7 @@
 #include "mail-storage-service.h"
 #include "raw-storage.h"
 #include "imap-urlauth.h"
+#include "smtp-client-connection.h"
 
 #include "submission-backend-relay.h"
 #include "submission-recipient.h"
@@ -125,8 +126,32 @@ static void
 client_create_backend_default(struct client *client,
                              const struct submission_settings *set)
 {
+       struct submision_backend_relay_settings relay_set;
+
+       i_zero(&relay_set);
+       relay_set.my_hostname = set->hostname;
+       relay_set.protocol = SMTP_PROTOCOL_SMTP;
+       relay_set.host = set->submission_relay_host;
+       relay_set.port = set->submission_relay_port;
+       relay_set.user = set->submission_relay_user;
+       relay_set.master_user = set->submission_relay_master_user;
+       relay_set.password = set->submission_relay_password;
+       relay_set.rawlog_dir = set->submission_relay_rawlog_dir;
+       relay_set.max_idle_time = set->submission_relay_max_idle_time;
+       relay_set.connect_timeout_msecs = set->submission_relay_connect_timeout;
+       relay_set.command_timeout_msecs = set->submission_relay_command_timeout;
+       relay_set.trusted = set->submission_relay_trusted;
+
+       if (strcmp(set->submission_relay_ssl, "smtps") == 0)
+               relay_set.ssl_mode = SMTP_CLIENT_SSL_MODE_IMMEDIATE;
+       else if (strcmp(set->submission_relay_ssl, "starttls") == 0)
+               relay_set.ssl_mode = SMTP_CLIENT_SSL_MODE_STARTTLS;
+       else
+               relay_set.ssl_mode = SMTP_CLIENT_SSL_MODE_NONE;
+       relay_set.ssl_verify = set->submission_relay_ssl_verify;
+
        client->backend_default =
-               submission_backend_relay_create(client, set);
+               submission_backend_relay_create(client, &relay_set);
 }
 
 static void client_init_urlauth(struct client *client)