]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm-mail-server: Support proxy fields properly
authorAki Tuomi <aki.tuomi@open-xchange.com>
Tue, 15 Oct 2019 10:32:23 +0000 (13:32 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 17 Oct 2019 07:40:51 +0000 (10:40 +0300)
src/doveadm/doveadm-mail-server.c
src/doveadm/doveadm-server.h
src/doveadm/server-connection.c

index 3a640e8b1829bf8d9754e25f9d20d9638d7d03ec..10f372e3b1ca58e41e3b6a5e0d2cf91db44d041b 100644 (file)
@@ -179,6 +179,8 @@ static int
 doveadm_mail_server_user_get_host(struct doveadm_mail_cmd_context *ctx,
                                  const struct mail_storage_service_input *input,
                                  const char **user_r, const char **host_r,
+                                 struct ip_addr *hostip_r, in_port_t *port_r,
+                                 enum doveadm_proxy_ssl_flags *ssl_flags_r,
                                  const char **error_r)
 {
        struct auth_master_connection *auth_conn;
@@ -238,10 +240,23 @@ doveadm_mail_server_user_get_host(struct doveadm_mail_cmd_context *ctx,
                        else if (str_begins(fields[i], "port=")) {
                                if (net_str2port(fields[i]+5, &proxy_port) < 0)
                                        proxy_port = 0;
+                       } else if (str_begins(fields[i], "ssl=")) {
+                               *ssl_flags_r |= PROXY_SSL_FLAG_YES;
+                               if (strcmp(fields[i]+4, "any-cert") == 0)
+                                      *ssl_flags_r |= PROXY_SSL_FLAG_ANY_CERT;
+                       } else if (str_begins(fields[i], "starttls=")) {
+                               *ssl_flags_r |= PROXY_SSL_FLAG_YES |
+                                       PROXY_SSL_FLAG_STARTTLS;
+                               if (strcmp(fields[i]+9, "any-cert") == 0)
+                                       *ssl_flags_r |= PROXY_SSL_FLAG_ANY_CERT;
                        }
                }
-               if (proxy_hostip != NULL)
-                       proxy_host = proxy_hostip;
+               if (proxy_hostip != NULL &&
+                   net_addr2ip(proxy_hostip, hostip_r) < 0) {
+                       *error_r = t_strdup_printf("%s Invalid hostip value '%s'",
+                                                  auth_socket_path, proxy_hostip);
+                       ret = -1;
+               }
                if (!proxying)
                        ret = 0;
                else if (proxy_host == NULL) {
@@ -254,6 +269,7 @@ doveadm_mail_server_user_get_host(struct doveadm_mail_cmd_context *ctx,
                        }
                        ret = -1;
                } else {
+                       *port_r = proxy_port;
                        *host_r = t_strdup_printf("%s:%u", proxy_host, proxy_port);
                }
        }
@@ -268,13 +284,18 @@ int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
        struct doveadm_server *server;
        struct server_connection *conn;
        const char *user, *host;
+       struct ip_addr hostip;
+       enum doveadm_proxy_ssl_flags ssl_flags = 0;
        char *username_dup;
        int ret;
+       in_port_t port;
 
        i_assert(cmd_ctx == ctx || cmd_ctx == NULL);
        cmd_ctx = ctx;
 
-       ret = doveadm_mail_server_user_get_host(ctx, input, &user, &host, error_r);
+       i_zero(&hostip);
+       ret = doveadm_mail_server_user_get_host(ctx, input, &user, &host, &hostip,
+                                               &port, &ssl_flags, error_r);
        if (ret < 0)
                return ret;
        if (ret == 0 &&
@@ -288,6 +309,9 @@ int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
        doveadm_print_unstick_headers();
 
        server = doveadm_server_get(ctx, host);
+       server->ip = hostip;
+       server->ssl_flags = ssl_flags;
+       server->port = port;
        conn = doveadm_server_find_unused_conn(server);
        if (conn != NULL)
                doveadm_mail_server_handle(conn, user);
index 6bf80aaaa6d9340f5a4c2a1c53bcfecba8f44d40..e111b4a85935ecf24a3cdc0ff7eb442e6710cf97 100644 (file)
@@ -14,10 +14,14 @@ enum doveadm_proxy_ssl_flags {
 };
 
 struct doveadm_server {
-       /* host:port */
+       /* hostname:port or socket name for logging */
        const char *name;
-       /* host only */
+       /* hostname without port */
        const char *hostname;
+       /* host ip to use */
+       struct ip_addr ip;
+       /* port to use */
+       in_port_t port;
 
        /* ssl related settings */
        enum doveadm_proxy_ssl_flags ssl_flags;
index c0928b10d6a357029523a8367fb91b75a1a5a4d7..9b13a3d4aa19c94ae0d03df593cd1e47e410048b 100644 (file)
@@ -554,6 +554,7 @@ int server_connection_create(struct doveadm_server *server,
                             struct server_connection **conn_r,
                             const char **error_r)
 {
+       const char *target;
        struct server_connection *conn;
        pool_t pool;
 
@@ -561,7 +562,12 @@ int server_connection_create(struct doveadm_server *server,
        conn = p_new(pool, struct server_connection, 1);
        conn->pool = pool;
        conn->server = server;
-       conn->fd = doveadm_connect_with_default_port(server->name,
+       if (server->ip.family != 0) {
+               (void)net_ipport2str(&server->ip, server->port, &target);
+       } else {
+               target = server->name;
+       }
+       conn->fd = doveadm_connect_with_default_port(target,
                                                     doveadm_settings->doveadm_port);
        net_set_nonblock(conn->fd, TRUE);
        conn->input = i_stream_create_fd(conn->fd, MAX_INBUF_SIZE);