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 }