]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap-client: Support sending IMAP ID command including unique x-session-ext-id
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 2 Aug 2017 07:49:33 +0000 (10:49 +0300)
committerTimo Sirainen <tss@dovecot.fi>
Tue, 8 Aug 2017 16:01:15 +0000 (19:01 +0300)
src/lib-imap-client/imapc-client.c
src/lib-imap-client/imapc-client.h
src/lib-imap-client/imapc-connection.c

index e5487d89903dd69710b336433778329c922e4829..0918b66afb37cbf0927375e21e62e9b271872168 100644 (file)
@@ -32,6 +32,7 @@ const struct imapc_capability_name imapc_capability_names[] = {
        { "ESEARCH", IMAPC_CAPABILITY_ESEARCH },
        { "WITHIN", IMAPC_CAPABILITY_WITHIN },
        { "QUOTA", IMAPC_CAPABILITY_QUOTA },
+       { "ID", IMAPC_CAPABILITY_ID },
 
        { "IMAP4REV1", IMAPC_CAPABILITY_IMAP4REV1 },
        { NULL, 0 }
@@ -68,6 +69,7 @@ imapc_client_init(const struct imapc_client_settings *set)
        client->set.username = p_strdup(pool, set->username);
        client->set.password = p_strdup(pool, set->password);
        client->set.sasl_mechanisms = p_strdup(pool, set->sasl_mechanisms);
+       client->set.session_id_prefix = p_strdup(pool, set->session_id_prefix);
        client->set.use_proxyauth = set->use_proxyauth;
        client->set.dns_client_socket_path =
                p_strdup(pool, set->dns_client_socket_path);
index ad1e32f228d8d110657c3d37dcb2232fc0928621..269e94bc55a66bea02a6d43fd77db757b63d3a18 100644 (file)
@@ -32,6 +32,7 @@ enum imapc_capability {
        IMAPC_CAPABILITY_ESEARCH        = 0x800,
        IMAPC_CAPABILITY_WITHIN         = 0x1000,
        IMAPC_CAPABILITY_QUOTA          = 0x2000,
+       IMAPC_CAPABILITY_ID             = 0x4000,
 
        IMAPC_CAPABILITY_IMAP4REV1      = 0x40000000
 };
@@ -85,6 +86,9 @@ struct imapc_client_settings {
        const char *sasl_mechanisms;
        bool use_proxyauth; /* Use Sun/Oracle PROXYAUTH command */
        unsigned int max_idle_time;
+       /* If ID capability is advertised, send a unique "x-session-ext-id",
+          which begins with this prefix. */
+       const char *session_id_prefix;
 
        const char *dns_client_socket_path;
        const char *temp_path_prefix;
index 3a69077960baef5b78d4b9e846699cc6add628f5..1018464a8299a9eaf97ec9f6086733b5bba0d941 100644 (file)
@@ -1081,6 +1081,28 @@ imapc_connection_starttls_cb(const struct imapc_command_reply *reply,
        }
 }
 
+static void
+imapc_connection_id_callback(const struct imapc_command_reply *reply ATTR_UNUSED,
+                            void *context ATTR_UNUSED)
+{
+}
+
+static void imapc_connection_send_id(struct imapc_connection *conn)
+{
+       static unsigned int global_id_counter = 0;
+       struct imapc_command *cmd;
+
+       if ((conn->capabilities & IMAPC_CAPABILITY_ID) == 0 ||
+           conn->client->set.session_id_prefix == NULL)
+               return;
+
+       cmd = imapc_connection_cmd(conn, imapc_connection_id_callback, conn);
+       imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_PRELOGIN);
+       imapc_command_send(cmd, t_strdup_printf(
+               "ID (\"name\" \"Dovecot\" \"x-session-ext-id\" \"%s-%u\")",
+               conn->client->set.session_id_prefix, ++global_id_counter));
+}
+
 static void imapc_connection_starttls(struct imapc_connection *conn)
 {
        struct imapc_command *cmd;
@@ -1100,6 +1122,7 @@ static void imapc_connection_starttls(struct imapc_connection *conn)
                imapc_command_send(cmd, "STARTTLS");
                return;
        }
+       imapc_connection_send_id(conn);
        imapc_connection_authenticate(conn);
 }