Mercurial > dovecot > core-2.2
comparison src/lib-storage/index/imapc/imapc-connection.c @ 12624:893e0738733b
imapc: Added support for STARTTLS.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 31 Jan 2011 19:29:17 +0200 |
parents | 31eb7db0c4b9 |
children | 49f487b435bd |
comparison
equal
deleted
inserted
replaced
12623:dab0e52eb294 | 12624:893e0738733b |
---|---|
94 unsigned int idling:1; | 94 unsigned int idling:1; |
95 unsigned int idle_stopping:1; | 95 unsigned int idle_stopping:1; |
96 unsigned int idle_plus_waiting:1; | 96 unsigned int idle_plus_waiting:1; |
97 }; | 97 }; |
98 | 98 |
99 static int imapc_connection_ssl_init(struct imapc_connection *conn); | |
99 static void imapc_connection_disconnect(struct imapc_connection *conn); | 100 static void imapc_connection_disconnect(struct imapc_connection *conn); |
100 | 101 |
101 static void imapc_command_free(struct imapc_command *cmd); | 102 static void imapc_command_free(struct imapc_command *cmd); |
102 static void imapc_command_send_more(struct imapc_connection *conn, | 103 static void imapc_command_send_more(struct imapc_connection *conn, |
103 struct imapc_command *cmd); | 104 struct imapc_command *cmd); |
576 imapc_connection_login_cb, conn); | 577 imapc_connection_login_cb, conn); |
577 } | 578 } |
578 } | 579 } |
579 | 580 |
580 static void | 581 static void |
582 imapc_connection_starttls_cb(const struct imapc_command_reply *reply, | |
583 void *context) | |
584 { | |
585 struct imapc_connection *conn = context; | |
586 | |
587 if (reply->state != IMAPC_COMMAND_STATE_OK) { | |
588 imapc_connection_input_error(conn, "STARTTLS failed: %s", | |
589 reply->text_full); | |
590 return; | |
591 } | |
592 | |
593 if (imapc_connection_ssl_init(conn) < 0) | |
594 imapc_connection_disconnect(conn); | |
595 else | |
596 imapc_connection_authenticate(conn); | |
597 } | |
598 | |
599 static void imapc_connection_starttls(struct imapc_connection *conn) | |
600 { | |
601 if (conn->client->set.ssl_mode == IMAPC_CLIENT_SSL_MODE_STARTTLS && | |
602 conn->ssl_iostream == NULL) { | |
603 if ((conn->capabilities & IMAPC_CAPABILITY_STARTTLS) == 0) { | |
604 i_error("imapc(%s): Requested STARTTLS, " | |
605 "but server doesn't support it", | |
606 conn->name); | |
607 imapc_connection_disconnect(conn); | |
608 return; | |
609 } | |
610 imapc_connection_cmd(conn, "STARTTLS", | |
611 imapc_connection_starttls_cb, conn); | |
612 return; | |
613 } | |
614 imapc_connection_authenticate(conn); | |
615 } | |
616 | |
617 static void | |
581 imapc_connection_capability_cb(const struct imapc_command_reply *reply, | 618 imapc_connection_capability_cb(const struct imapc_command_reply *reply, |
582 void *context) | 619 void *context) |
583 { | 620 { |
584 struct imapc_connection *conn = context; | 621 struct imapc_connection *conn = context; |
585 | 622 |
588 "Failed to get capabilities: %s", reply->text_full); | 625 "Failed to get capabilities: %s", reply->text_full); |
589 } else if (conn->capabilities == 0) { | 626 } else if (conn->capabilities == 0) { |
590 imapc_connection_input_error(conn, | 627 imapc_connection_input_error(conn, |
591 "Capabilities not returned by server"); | 628 "Capabilities not returned by server"); |
592 } else { | 629 } else { |
593 imapc_connection_authenticate(conn); | 630 imapc_connection_starttls(conn); |
594 } | 631 } |
595 } | 632 } |
596 | 633 |
597 static int imapc_connection_input_banner(struct imapc_connection *conn) | 634 static int imapc_connection_input_banner(struct imapc_connection *conn) |
598 { | 635 { |
611 if (conn->capabilities == 0) { | 648 if (conn->capabilities == 0) { |
612 /* capabilities weren't sent in the banner. ask for them. */ | 649 /* capabilities weren't sent in the banner. ask for them. */ |
613 imapc_connection_cmd(conn, "CAPABILITY", | 650 imapc_connection_cmd(conn, "CAPABILITY", |
614 imapc_connection_capability_cb, conn); | 651 imapc_connection_capability_cb, conn); |
615 } else { | 652 } else { |
616 imapc_connection_authenticate(conn); | 653 imapc_connection_starttls(conn); |
617 } | 654 } |
618 conn->input_callback = NULL; | 655 conn->input_callback = NULL; |
619 imapc_connection_input_reset(conn); | 656 imapc_connection_input_reset(conn); |
620 return 1; | 657 return 1; |
621 } | 658 } |