#if USE_SSL
static SockInfo *imap_open (const gchar *server,
gushort port,
- gboolean use_ssl);
+ SSLType ssl_type);
#else
static SockInfo *imap_open (const gchar *server,
gushort port);
#endif
static SockInfo *imap_open_tunnel(const gchar *server,
- const gchar *tunnelcmd);
+ const gchar *tunnelcmd,
+ SSLType ssl_type);
-static SockInfo *imap_init_sock(SockInfo *sock);
+static SockInfo *imap_init_sock(SockInfo *sock, SSLType ssl_type);
static gint imap_set_message_flags (IMAPSession *session,
guint32 first_uid,
const gchar *pass);
static gint imap_cmd_logout (SockInfo *sock);
static gint imap_cmd_noop (SockInfo *sock);
+static gint imap_cmd_starttls (SockInfo *sock);
static gint imap_cmd_namespace (SockInfo *sock,
gchar **ns_str);
static gint imap_cmd_list (SockInfo *sock,
#if USE_SSL
port = folder->account->set_imapport ? folder->account->imapport
- : folder->account->ssl_imap ? IMAPS_PORT : IMAP4_PORT;
+ : folder->account->ssl_imap == SSL_TUNNEL
+ ? IMAPS_PORT : IMAP4_PORT;
#else
port = folder->account->set_imapport ? folder->account->imapport
: IMAP4_PORT;
#ifdef USE_SSL
/* FIXME: IMAP over SSL only... */
- gboolean use_ssl;
+ SSLType ssl_type;
port = account->set_imapport ? account->imapport
: account->ssl_imap ? IMAPS_PORT : IMAP4_PORT;
- use_ssl = account->ssl_imap ? TRUE : FALSE;
+ ssl_type = account->ssl_imap ? TRUE : FALSE;
#else
port = account->set_imapport ? account->imapport
: IMAP4_PORT;
if (account->set_tunnelcmd) {
log_message(_("creating tunneled IMAP4 connection\n"));
if ((imap_sock = imap_open_tunnel(account->recv_server,
- account->tunnelcmd)) == NULL)
+ account->tunnelcmd,
+ ssl_type)) == NULL)
return NULL;
} else {
g_return_val_if_fail(account->recv_server != NULL, NULL);
#if USE_SSL
if ((imap_sock = imap_open(account->recv_server, port,
- use_ssl)) == NULL)
+ ssl_type)) == NULL)
#else
if ((imap_sock = imap_open(account->recv_server, port)) == NULL)
#endif
static SockInfo *imap_open_tunnel(const gchar *server,
- const gchar *tunnelcmd)
+ const gchar *tunnelcmd,
+ SSLType ssl_type)
{
SockInfo *sock;
server);
return NULL;
- return imap_init_sock(sock);
+ return imap_init_sock(sock, ssl_type);
}
#if USE_SSL
static SockInfo *imap_open(const gchar *server, gushort port,
- gboolean use_ssl)
+ SSLType ssl_type)
#else
static SockInfo *imap_open(const gchar *server, gushort port)
#endif
}
#if USE_SSL
- if (use_ssl && !ssl_init_socket(sock)) {
+ if (ssl_type == SSL_TUNNEL && !ssl_init_socket(sock)) {
log_warning(_("Can't establish IMAP4 session with: %s:%d\n"),
server, port);
sock_close(sock);
}
#endif
- return imap_init_sock(sock);
+ return imap_init_sock(sock, ssl_type);
}
-static SockInfo *imap_init_sock(SockInfo *sock)
+static SockInfo *imap_init_sock(SockInfo *sock, SSLType ssl_type)
{
imap_cmd_count = 0;
+#if USE_SSL
+ if (ssl_type == SSL_STARTTLS) {
+ gint ok;
+
+ ok = imap_cmd_starttls(sock);
+ if (ok != IMAP_SUCCESS) {
+ log_warning(_("Can't start TLS session.\n"));
+ sock_close(sock);
+ return NULL;
+ }
+ if (!ssl_init_socket_with_method(sock, SSL_METHOD_TLSv1)) {
+ sock_close(sock);
+ return NULL;
+ }
+ }
+#endif
if (imap_cmd_noop(sock) != IMAP_SUCCESS) {
- log_warning(_("Can't establish IMAP4 session\n"));
+ log_warning(_("Can't establish IMAP4 session. \n"));
sock_close(sock);
return NULL;
}
return imap_cmd_ok(sock, NULL);
}
+static gint imap_cmd_starttls(SockInfo *sock)
+{
+ imap_cmd_gen_send(sock, "STARTTLS");
+ return imap_cmd_ok(sock, NULL);
+}
+
#define THROW(err) { ok = err; goto catch; }
static gint imap_cmd_namespace(SockInfo *sock, gchar **ns_str)
#if USE_SSL
static struct SSLPrefs {
- GtkWidget *receive_frame;
- GtkWidget *pop_chkbtn;
- GtkWidget *imap_chkbtn;
- GtkWidget *nntp_chkbtn;
+ GtkWidget *pop_frame;
+ GtkWidget *pop_nossl_radiobtn;
+ GtkWidget *pop_ssltunnel_radiobtn;
+ GtkWidget *pop_starttls_radiobtn;
+
+ GtkWidget *nntp_frame;
+ GtkWidget *nntp_nossl_radiobtn;
+ GtkWidget *nntp_ssltunnel_radiobtn;
+ GtkWidget *nntp_starttls_radiobtn;
+
+ GtkWidget *imap_frame;
+ GtkWidget *imap_nossl_radiobtn;
+ GtkWidget *imap_ssltunnel_radiobtn;
+ GtkWidget *imap_starttls_radiobtn;
GtkWidget *send_frame;
GtkWidget *smtp_nossl_radiobtn;
GtkWidget *smtp_ssltunnel_radiobtn;
- GtkWidget *smtp_sslstarttls_radiobtn;
+ GtkWidget *smtp_starttls_radiobtn;
} ssl;
#endif /* USE_SSL */
#if USE_SSL
/* SSL */
+ {"ssl_pop", "0", &tmp_ac_prefs.ssl_pop, P_ENUM,
+ &ssl.pop_nossl_radiobtn,
+ prefs_account_enum_set_data_from_radiobtn,
+ prefs_account_enum_set_radiobtn},
+ {"ssl_imap", "0", &tmp_ac_prefs.ssl_imap, P_ENUM,
+ &ssl.imap_nossl_radiobtn,
+ prefs_account_enum_set_data_from_radiobtn,
+ prefs_account_enum_set_radiobtn},
{"ssl_smtp", "0", &tmp_ac_prefs.ssl_smtp, P_ENUM,
&ssl.smtp_nossl_radiobtn,
prefs_account_enum_set_data_from_radiobtn,
prefs_account_enum_set_radiobtn},
- {"ssl_pop", "FALSE", &tmp_ac_prefs.ssl_pop, P_BOOL,
- &ssl.pop_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
- {"ssl_imap", "FALSE", &tmp_ac_prefs.ssl_imap, P_BOOL,
- &ssl.imap_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
{"ssl_nntp", "FALSE", &tmp_ac_prefs.ssl_nntp, P_BOOL,
- &ssl.nntp_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
+ &ssl.nntp_nossl_radiobtn,
+ prefs_account_enum_set_data_from_radiobtn,
+ prefs_account_enum_set_radiobtn},
+
#endif /* USE_SSL */
/* Advanced */
#endif /* USE_GPGME */
#if USE_SSL
+
+#define CREATE_RADIO_BUTTONS(box, \
+ btn1, btn1_label, btn1_data, \
+ btn2, btn2_label, btn2_data, \
+ btn3, btn3_label, btn3_data) \
+{ \
+ btn1 = gtk_radio_button_new_with_label(NULL, btn1_label); \
+ gtk_widget_show (btn1); \
+ gtk_box_pack_start (GTK_BOX (box), btn1, FALSE, FALSE, 0); \
+ gtk_object_set_user_data (GTK_OBJECT (btn1), \
+ GINT_TO_POINTER (btn1_data)); \
+ \
+ btn2 = gtk_radio_button_new_with_label_from_widget \
+ (GTK_RADIO_BUTTON (btn1), btn2_label); \
+ gtk_widget_show (btn2); \
+ gtk_box_pack_start (GTK_BOX (box), btn2, FALSE, FALSE, 0); \
+ gtk_object_set_user_data (GTK_OBJECT (btn2), \
+ GINT_TO_POINTER (btn2_data)); \
+ \
+ btn3 = gtk_radio_button_new_with_label_from_widget \
+ (GTK_RADIO_BUTTON (btn1), btn3_label); \
+ gtk_widget_show (btn3); \
+ gtk_box_pack_start (GTK_BOX (box), btn3, FALSE, FALSE, 0); \
+ gtk_object_set_user_data (GTK_OBJECT (btn3), \
+ GINT_TO_POINTER (btn3_data)); \
+}
+
static void prefs_account_ssl_create(void)
{
GtkWidget *vbox1;
- GtkWidget *receive_frame;
+ GtkWidget *pop_frame;
GtkWidget *vbox2;
- GtkWidget *pop_chkbtn;
- GtkWidget *imap_chkbtn;
- GtkWidget *nntp_chkbtn;
+ GtkWidget *pop_nossl_radiobtn;
+ GtkWidget *pop_ssltunnel_radiobtn;
+ GtkWidget *pop_starttls_radiobtn;
- GtkWidget *send_frame;
+ GtkWidget *imap_frame;
GtkWidget *vbox3;
+ GtkWidget *imap_nossl_radiobtn;
+ GtkWidget *imap_ssltunnel_radiobtn;
+ GtkWidget *imap_starttls_radiobtn;
+
+ GtkWidget *nntp_frame;
+ GtkWidget *vbox4;
+ GtkWidget *nntp_nossl_radiobtn;
+ GtkWidget *nntp_ssltunnel_radiobtn;
+ GtkWidget *nntp_starttls_radiobtn;
+
+ GtkWidget *send_frame;
+ GtkWidget *vbox5;
GtkWidget *smtp_nossl_radiobtn;
GtkWidget *smtp_ssltunnel_radiobtn;
- GtkWidget *smtp_sslstarttls_radiobtn;
+ GtkWidget *smtp_starttls_radiobtn;
vbox1 = gtk_vbox_new (FALSE, VSPACING);
gtk_widget_show (vbox1);
gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
- PACK_FRAME (vbox1, receive_frame, _("Receive"));
-
+ PACK_FRAME (vbox1, pop_frame, _("POP3"));
vbox2 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox2);
- gtk_container_add (GTK_CONTAINER (receive_frame), vbox2);
+ gtk_container_add (GTK_CONTAINER (pop_frame), vbox2);
gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
- PACK_CHECK_BUTTON (vbox2, pop_chkbtn,
- _("Use SSL for POP3 connection"));
- PACK_CHECK_BUTTON (vbox2, imap_chkbtn,
- _("Use SSL for IMAP4 connection"));
- PACK_CHECK_BUTTON (vbox2, nntp_chkbtn,
- _("Use SSL for NNTP connection"));
-
- PACK_FRAME (vbox1, send_frame, _("Send (SMTP)"));
+ CREATE_RADIO_BUTTONS(vbox2,
+ pop_nossl_radiobtn,
+ _("Don't use SSL"),
+ SSL_NONE,
+ pop_ssltunnel_radiobtn,
+ _("Use SSL for POP3 connection"),
+ SSL_TUNNEL,
+ pop_starttls_radiobtn,
+ _("Use STARTTLS command to start SSL session"),
+ SSL_STARTTLS);
+ PACK_FRAME (vbox1, imap_frame, _("IMAP4"));
vbox3 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox3);
- gtk_container_add (GTK_CONTAINER (send_frame), vbox3);
+ gtk_container_add (GTK_CONTAINER (imap_frame), vbox3);
gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
- smtp_nossl_radiobtn =
- gtk_radio_button_new_with_label(NULL, _("Don't use SSL"));
- gtk_widget_show (smtp_nossl_radiobtn);
- gtk_box_pack_start (GTK_BOX (vbox3), smtp_nossl_radiobtn,
- FALSE, FALSE, 0);
- gtk_object_set_user_data (GTK_OBJECT (smtp_nossl_radiobtn),
- GINT_TO_POINTER (SSL_SMTP_NONE));
-
- smtp_ssltunnel_radiobtn = gtk_radio_button_new_with_label_from_widget
- (GTK_RADIO_BUTTON (smtp_nossl_radiobtn),
- _("Use SSL for SMTP connection"));
- gtk_widget_show (smtp_ssltunnel_radiobtn);
- gtk_box_pack_start (GTK_BOX (vbox3), smtp_ssltunnel_radiobtn,
- FALSE, FALSE, 0);
- gtk_object_set_user_data (GTK_OBJECT (smtp_ssltunnel_radiobtn),
- GINT_TO_POINTER (SSL_SMTP_TUNNEL));
-
- smtp_sslstarttls_radiobtn = gtk_radio_button_new_with_label_from_widget
- (GTK_RADIO_BUTTON (smtp_nossl_radiobtn),
- _("Use STARTTLS command to start SSL session"));
- gtk_widget_show (smtp_sslstarttls_radiobtn);
- gtk_box_pack_start (GTK_BOX (vbox3), smtp_sslstarttls_radiobtn,
- FALSE, FALSE, 0);
- gtk_object_set_user_data (GTK_OBJECT (smtp_sslstarttls_radiobtn),
- GINT_TO_POINTER (SSL_SMTP_STARTTLS));
-
- ssl.receive_frame = receive_frame;
- ssl.pop_chkbtn = pop_chkbtn;
- ssl.imap_chkbtn = imap_chkbtn;
- ssl.nntp_chkbtn = nntp_chkbtn;
-
- ssl.send_frame = send_frame;
- ssl.smtp_nossl_radiobtn = smtp_nossl_radiobtn;
- ssl.smtp_ssltunnel_radiobtn = smtp_ssltunnel_radiobtn;
- ssl.smtp_sslstarttls_radiobtn = smtp_sslstarttls_radiobtn;
+ CREATE_RADIO_BUTTONS(vbox3,
+ imap_nossl_radiobtn,
+ _("Don't use SSL"),
+ SSL_NONE,
+ imap_ssltunnel_radiobtn,
+ _("Use SSL for IMAP4 connection"),
+ SSL_TUNNEL,
+ imap_starttls_radiobtn,
+ _("Use STARTTLS command to start SSL session"),
+ SSL_STARTTLS);
+
+ PACK_FRAME (vbox1, nntp_frame, _("NNTP"));
+ vbox4 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox4);
+ gtk_container_add (GTK_CONTAINER (nntp_frame), vbox4);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox4), 8);
+
+ CREATE_RADIO_BUTTONS(vbox4,
+ nntp_nossl_radiobtn,
+ _("Don't use SSL"),
+ SSL_NONE,
+ nntp_ssltunnel_radiobtn,
+ _("Use SSL for NNTP connection"),
+ SSL_TUNNEL,
+ nntp_starttls_radiobtn,
+ _("Use STARTTLS command to start SSL session"),
+ SSL_STARTTLS);
+
+ PACK_FRAME (vbox1, send_frame, _("Send (SMTP)"));
+ vbox5 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox5);
+ gtk_container_add (GTK_CONTAINER (send_frame), vbox5);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox5), 8);
+
+ CREATE_RADIO_BUTTONS(vbox5,
+ smtp_nossl_radiobtn,
+ _("Don't use SSL"),
+ SSL_NONE,
+ smtp_ssltunnel_radiobtn,
+ _("Use SSL for SMTP connection"),
+ SSL_TUNNEL,
+ smtp_starttls_radiobtn,
+ _("Use STARTTLS command to start SSL session"),
+ SSL_STARTTLS);
+
+ ssl.pop_frame = pop_frame;
+ ssl.pop_nossl_radiobtn = pop_nossl_radiobtn;
+ ssl.pop_ssltunnel_radiobtn = pop_ssltunnel_radiobtn;
+ ssl.pop_starttls_radiobtn = pop_starttls_radiobtn;
+
+ ssl.imap_frame = imap_frame;
+ ssl.imap_nossl_radiobtn = imap_nossl_radiobtn;
+ ssl.imap_ssltunnel_radiobtn = imap_ssltunnel_radiobtn;
+ ssl.imap_starttls_radiobtn = imap_starttls_radiobtn;
+
+ ssl.nntp_frame = nntp_frame;
+ ssl.nntp_nossl_radiobtn = nntp_nossl_radiobtn;
+ ssl.nntp_ssltunnel_radiobtn = nntp_ssltunnel_radiobtn;
+ ssl.nntp_starttls_radiobtn = nntp_starttls_radiobtn;
+
+ ssl.send_frame = send_frame;
+ ssl.smtp_nossl_radiobtn = smtp_nossl_radiobtn;
+ ssl.smtp_ssltunnel_radiobtn = smtp_ssltunnel_radiobtn;
+ ssl.smtp_starttls_radiobtn = smtp_starttls_radiobtn;
}
+
+#undef CREATE_RADIO_BUTTONS
#endif /* USE_SSL */
static void crosspost_color_toggled(void)
}
#if USE_SSL
- gtk_widget_set_sensitive(ssl.receive_frame, TRUE);
- gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
- gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
- gtk_widget_set_sensitive(ssl.nntp_chkbtn, TRUE);
- gtk_widget_set_sensitive(ssl.send_frame, FALSE);
+ gtk_widget_set_sensitive(ssl.pop_frame, FALSE);
+ gtk_widget_set_sensitive(ssl.imap_frame, FALSE);
+ gtk_widget_set_sensitive(ssl.nntp_frame, TRUE);
+ gtk_widget_set_sensitive(ssl.send_frame, TRUE);
#endif
gtk_widget_hide(advanced.popport_hbox);
gtk_widget_hide(advanced.imapport_hbox);
}
#if USE_SSL
- gtk_widget_set_sensitive(ssl.receive_frame, FALSE);
- gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
- gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
- gtk_widget_set_sensitive(ssl.nntp_chkbtn, FALSE);
+ gtk_widget_set_sensitive(ssl.pop_frame, FALSE);
+ gtk_widget_set_sensitive(ssl.imap_frame, FALSE);
+ gtk_widget_set_sensitive(ssl.nntp_frame, FALSE);
gtk_widget_set_sensitive(ssl.send_frame, TRUE);
#endif
gtk_widget_hide(advanced.popport_hbox);
}
#if USE_SSL
- gtk_widget_set_sensitive(ssl.receive_frame, TRUE);
- gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
- gtk_widget_set_sensitive(ssl.imap_chkbtn, TRUE);
- gtk_widget_set_sensitive(ssl.nntp_chkbtn, FALSE);
+ gtk_widget_set_sensitive(ssl.pop_frame, FALSE);
+ gtk_widget_set_sensitive(ssl.imap_frame, TRUE);
+ gtk_widget_set_sensitive(ssl.nntp_frame, FALSE);
gtk_widget_set_sensitive(ssl.send_frame, TRUE);
#endif
gtk_widget_hide(advanced.popport_hbox);
}
#if USE_SSL
- gtk_widget_set_sensitive(ssl.receive_frame, TRUE);
- gtk_widget_set_sensitive(ssl.pop_chkbtn, TRUE);
- gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
- gtk_widget_set_sensitive(ssl.nntp_chkbtn, FALSE);
+ gtk_widget_set_sensitive(ssl.pop_frame, TRUE);
+ gtk_widget_set_sensitive(ssl.imap_frame, FALSE);
+ gtk_widget_set_sensitive(ssl.nntp_frame, FALSE);
gtk_widget_set_sensitive(ssl.send_frame, TRUE);
#endif
gtk_widget_show(advanced.popport_hbox);