From: Timo Sirainen Date: Wed, 2 Aug 2017 07:49:33 +0000 (+0300) Subject: lib-imap-client: Support sending IMAP ID command including unique x-session-ext-id X-Git-Tag: 2.3.0.rc1~1193 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b7427fca4b403ad87bafc668e23cbb0a15fc975;p=thirdparty%2Fdovecot%2Fcore.git lib-imap-client: Support sending IMAP ID command including unique x-session-ext-id --- diff --git a/src/lib-imap-client/imapc-client.c b/src/lib-imap-client/imapc-client.c index e5487d8990..0918b66afb 100644 --- a/src/lib-imap-client/imapc-client.c +++ b/src/lib-imap-client/imapc-client.c @@ -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); diff --git a/src/lib-imap-client/imapc-client.h b/src/lib-imap-client/imapc-client.h index ad1e32f228..269e94bc55 100644 --- a/src/lib-imap-client/imapc-client.h +++ b/src/lib-imap-client/imapc-client.h @@ -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; diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index 3a69077960..1018464a82 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -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); }