Mercurial > dovecot > core-2.2
changeset 12624:893e0738733b
imapc: Added support for STARTTLS.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 31 Jan 2011 19:29:17 +0200 |
parents | dab0e52eb294 |
children | 495fb0e9f7cc |
files | src/lib-storage/index/imapc/imapc-client.c src/lib-storage/index/imapc/imapc-client.h src/lib-storage/index/imapc/imapc-connection.c |
diffstat | 3 files changed, 41 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-client.c Mon Jan 31 19:29:04 2011 +0200 +++ b/src/lib-storage/index/imapc/imapc-client.c Mon Jan 31 19:29:17 2011 +0200 @@ -26,6 +26,7 @@ { "IDLE", IMAPC_CAPABILITY_IDLE }, { "UIDPLUS", IMAPC_CAPABILITY_UIDPLUS }, { "AUTH=PLAIN", IMAPC_CAPABILITY_AUTH_PLAIN }, + { "STARTTLS", IMAPC_CAPABILITY_STARTTLS }, { "IMAP4REV1", IMAPC_CAPABILITY_IMAP4REV1 }, { NULL, 0 }
--- a/src/lib-storage/index/imapc/imapc-client.h Mon Jan 31 19:29:04 2011 +0200 +++ b/src/lib-storage/index/imapc/imapc-client.h Mon Jan 31 19:29:17 2011 +0200 @@ -15,6 +15,7 @@ IMAPC_CAPABILITY_IDLE = 0x08, IMAPC_CAPABILITY_UIDPLUS = 0x10, IMAPC_CAPABILITY_AUTH_PLAIN = 0x20, + IMAPC_CAPABILITY_STARTTLS = 0x40, IMAPC_CAPABILITY_IMAP4REV1 = 0x400000000 };
--- a/src/lib-storage/index/imapc/imapc-connection.c Mon Jan 31 19:29:04 2011 +0200 +++ b/src/lib-storage/index/imapc/imapc-connection.c Mon Jan 31 19:29:17 2011 +0200 @@ -96,6 +96,7 @@ unsigned int idle_plus_waiting:1; }; +static int imapc_connection_ssl_init(struct imapc_connection *conn); static void imapc_connection_disconnect(struct imapc_connection *conn); static void imapc_command_free(struct imapc_command *cmd); @@ -578,6 +579,42 @@ } static void +imapc_connection_starttls_cb(const struct imapc_command_reply *reply, + void *context) +{ + struct imapc_connection *conn = context; + + if (reply->state != IMAPC_COMMAND_STATE_OK) { + imapc_connection_input_error(conn, "STARTTLS failed: %s", + reply->text_full); + return; + } + + if (imapc_connection_ssl_init(conn) < 0) + imapc_connection_disconnect(conn); + else + imapc_connection_authenticate(conn); +} + +static void imapc_connection_starttls(struct imapc_connection *conn) +{ + if (conn->client->set.ssl_mode == IMAPC_CLIENT_SSL_MODE_STARTTLS && + conn->ssl_iostream == NULL) { + if ((conn->capabilities & IMAPC_CAPABILITY_STARTTLS) == 0) { + i_error("imapc(%s): Requested STARTTLS, " + "but server doesn't support it", + conn->name); + imapc_connection_disconnect(conn); + return; + } + imapc_connection_cmd(conn, "STARTTLS", + imapc_connection_starttls_cb, conn); + return; + } + imapc_connection_authenticate(conn); +} + +static void imapc_connection_capability_cb(const struct imapc_command_reply *reply, void *context) { @@ -590,7 +627,7 @@ imapc_connection_input_error(conn, "Capabilities not returned by server"); } else { - imapc_connection_authenticate(conn); + imapc_connection_starttls(conn); } } @@ -613,7 +650,7 @@ imapc_connection_cmd(conn, "CAPABILITY", imapc_connection_capability_cb, conn); } else { - imapc_connection_authenticate(conn); + imapc_connection_starttls(conn); } conn->input_callback = NULL; imapc_connection_input_reset(conn);