]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Added imapc_rawlog_dir setting.
authorTimo Sirainen <tss@iki.fi>
Wed, 21 Sep 2011 12:58:26 +0000 (15:58 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 21 Sep 2011 12:58:26 +0000 (15:58 +0300)
src/lib-storage/index/imapc/imapc-client.c
src/lib-storage/index/imapc/imapc-client.h
src/lib-storage/index/imapc/imapc-connection.c
src/lib-storage/index/imapc/imapc-settings.c
src/lib-storage/index/imapc/imapc-settings.h
src/lib-storage/index/imapc/imapc-storage.c

index 55180b62f0aa1fde9d8eb830f72ee83917dbd1e9..0f794017d5d6e8b2029da2141426f4017a79dc8d 100644 (file)
@@ -54,6 +54,7 @@ imapc_client_init(const struct imapc_client_settings *set)
                p_strdup(pool, set->dns_client_socket_path);
        client->set.temp_path_prefix =
                p_strdup(pool, set->temp_path_prefix);
+       client->set.rawlog_dir = p_strdup(pool, set->rawlog_dir);
 
        if (set->ssl_mode != IMAPC_CLIENT_SSL_MODE_NONE) {
                client->set.ssl_mode = set->ssl_mode;
index c11b21e02f0c1b192b1588e0c9db4c2a698fc127..663228061b47c2e0ae566abfb320e3052c2b1abd 100644 (file)
@@ -45,6 +45,7 @@ struct imapc_client_settings {
        enum imapc_client_ssl_mode ssl_mode;
        const char *ssl_ca_dir;
 
+       const char *rawlog_dir;
        bool debug;
 };
 
index 3dd87702c88f000cc795474274ce70eb2918df5f..6c9b2599493e7c0623ba553ec088075c3f120ff6 100644 (file)
@@ -9,6 +9,7 @@
 #include "write-full.h"
 #include "str.h"
 #include "dns-lookup.h"
+#include "iostream-rawlog.h"
 #include "iostream-ssl.h"
 #include "imap-quote.h"
 #include "imap-util.h"
@@ -70,8 +71,8 @@ struct imapc_connection {
 
        int fd;
        struct io *io;
-       struct istream *input;
-       struct ostream *output;
+       struct istream *input, *raw_input;
+       struct ostream *output, *raw_output;
        struct imap_parser *parser;
        struct timeout *to;
        struct timeout *to_output;
@@ -1026,6 +1027,16 @@ static int imapc_connection_ssl_init(struct imapc_connection *conn)
        if (conn->client->set.debug)
                i_debug("imapc(%s): Starting SSL handshake", conn->name);
 
+       if (conn->raw_input != conn->input) {
+               /* recreate rawlog after STARTTLS */
+               i_stream_ref(conn->raw_input);
+               o_stream_ref(conn->raw_output);
+               i_stream_destroy(&conn->input);
+               o_stream_destroy(&conn->output);
+               conn->input = conn->raw_input;
+               conn->output = conn->raw_output;
+       }
+
        source = t_strdup_printf("imapc(%s): ", conn->name);
        if (io_stream_create_ssl(conn->client->ssl_ctx, source, &ssl_set,
                                 &conn->input, &conn->output,
@@ -1038,9 +1049,16 @@ static int imapc_connection_ssl_init(struct imapc_connection *conn)
                                            imapc_connection_ssl_handshaked,
                                            conn);
        if (ssl_iostream_handshake(conn->ssl_iostream) < 0) {
-               i_error("imapc(%s): SSL handshake failed", conn->name);
+               i_error("imapc(%s): SSL handshake failed: %s", conn->name,
+                       ssl_iostream_get_last_error(conn->ssl_iostream));
                return -1;
        }
+
+       if (*conn->client->set.rawlog_dir != '\0') {
+               (void)iostream_rawlog_create(conn->client->set.rawlog_dir,
+                                            &conn->input, &conn->output);
+       }
+
        imap_parser_set_streams(conn->parser, conn->input, NULL);
        return 0;
 }
@@ -1120,8 +1138,15 @@ static void imapc_connection_connect_next_ip(struct imapc_connection *conn)
                return;
        }
        conn->fd = fd;
-       conn->input = i_stream_create_fd(fd, (size_t)-1, FALSE);
-       conn->output = o_stream_create_fd(fd, (size_t)-1, FALSE);
+       conn->input = conn->raw_input = i_stream_create_fd(fd, (size_t)-1, FALSE);
+       conn->output = conn->raw_output = o_stream_create_fd(fd, (size_t)-1, FALSE);
+
+       if (*conn->client->set.rawlog_dir != '\0' &&
+           conn->client->set.ssl_mode != IMAPC_CLIENT_SSL_MODE_IMMEDIATE) {
+               (void)iostream_rawlog_create(conn->client->set.rawlog_dir,
+                                            &conn->input, &conn->output);
+       }
+
        o_stream_set_flush_callback(conn->output, imapc_connection_output,
                                    conn);
        conn->io = io_add(fd, IO_WRITE, imapc_connection_connected, conn);
index c1667b89aa66cd6013473cf1981e9362799c2fc7..320b4f412a6cf2eaa992d1ad232ccad74ca48f85 100644 (file)
@@ -23,6 +23,8 @@ static const struct setting_define imapc_setting_defines[] = {
        DEF(SET_ENUM, imapc_ssl),
        DEF(SET_STR, imapc_ssl_ca_dir),
 
+       DEF(SET_STR, imapc_rawlog_dir),
+
        SETTING_DEFINE_LIST_END
 };
 
@@ -34,7 +36,9 @@ static const struct imapc_settings imapc_default_settings = {
        .imapc_password = "",
 
        .imapc_ssl = "no:imaps:starttls",
-       .imapc_ssl_ca_dir = ""
+       .imapc_ssl_ca_dir = "",
+
+       .imapc_rawlog_dir = ""
 };
 
 static const struct setting_parser_info imapc_setting_parser_info = {
index 26d912840fb095ed0d22f72d3a642a40b7d3529c..92f2b9990c8bcb39c1ef7aaefbbca36ad0b63b0e 100644 (file)
@@ -10,6 +10,8 @@ struct imapc_settings {
 
        const char *imapc_ssl;
        const char *imapc_ssl_ca_dir;
+
+       const char *imapc_rawlog_dir;
 };
 
 const struct setting_parser_info *imapc_get_setting_parser_info(void);
index 09d49e44cdba6e9985af6719ae6b734cf48b09c2..c20cc4e46d7e9650a91833e9f42b10f8b5c342a0 100644 (file)
@@ -257,6 +257,8 @@ imapc_storage_create(struct mail_storage *_storage,
                t_strconcat(_storage->user->set->base_dir, "/",
                            DNS_CLIENT_SOCKET_NAME, NULL);
        set.debug = _storage->set->mail_debug;
+       set.rawlog_dir = mail_user_home_expand(_storage->user,
+                                              storage->set->imapc_rawlog_dir);
 
        str = t_str_new(128);
        mail_user_set_get_temp_prefix(str, _storage->user->set);