commit 94ec77b15d34079fa6752fcd1a6a687782b07f9c
parent a3b08204f9687fcf35d833bd46b61059bf6bd2b7
Author: Colin Leroy <colin@colino.net>
Date: Wed, 30 Apr 2014 11:19:05 +0200
Implement autoconfiguration in wizard
Diffstat:
3 files changed, 159 insertions(+), 7 deletions(-)
diff --git a/src/gtk/gtkutils.c b/src/gtk/gtkutils.c
@@ -1895,10 +1895,16 @@ static void auto_configure_done(const gchar *hostname, gint port, gboolean ssl,
g_free(tmp);
}
- if (ssl && data->ssl_checkbtn)
+ if (ssl && data->ssl_checkbtn) {
gtk_toggle_button_set_active(data->ssl_checkbtn, TRUE);
- else if (data->tls_checkbtn)
+ gtk_toggle_button_set_active(data->tls_checkbtn, FALSE);
+ } else if (data->tls_checkbtn) {
+ if (!GTK_IS_RADIO_BUTTON(data->ssl_checkbtn)) {
+ /* Wizard where TLS is [x]SSL + [x]TLS */
+ gtk_toggle_button_set_active(data->ssl_checkbtn, TRUE);
+ }
gtk_toggle_button_set_active(data->tls_checkbtn, TRUE);
+ }
gtk_label_set_text(data->info_label, _("Done."));
} else {
@@ -1943,7 +1949,7 @@ static void resolve_done(GObject *source, GAsyncResult *result, gpointer user_da
}
if (found) {
- auto_configure_done(hostname, port, TRUE, data);
+ auto_configure_done(hostname, port, data->ssl_service != NULL, data);
} else if (data->ssl_service && !abort) {
/* Fallback to TLS */
data->ssl_service = NULL;
diff --git a/src/prefs_account.c b/src/prefs_account.c
@@ -1124,7 +1124,7 @@ static void basic_create_widget_func(PrefsPage * _page,
auto_configure_cancel_btn = gtk_button_new_with_label(_("Cancel"));
gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_cancel_btn, FALSE, FALSE, 0);
auto_configure_lbl = gtk_label_new("");
- gtk_label_set_justify(GTK_LABEL(optlabel), GTK_JUSTIFY_LEFT);
+ gtk_label_set_justify(GTK_LABEL(auto_configure_lbl), GTK_JUSTIFY_LEFT);
gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_lbl, FALSE, FALSE, 0);
#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
gtk_widget_show(auto_configure_btn);
@@ -3871,14 +3871,14 @@ static void auto_configure_cb (GtkWidget *widget, gpointer data)
}
auto_configure_service(recv_data);
}
-
+
send_data = g_new0(AutoConfigureData, 1);
send_data->configure_button = GTK_BUTTON(basic_page.auto_configure_btn);
send_data->cancel_button = GTK_BUTTON(basic_page.auto_configure_cancel_btn);
send_data->info_label = GTK_LABEL(basic_page.auto_configure_lbl);
send_data->cancel = send_cancel;
- send_data->ssl_service = "submissions";
+ send_data->ssl_service = NULL;
send_data->tls_service = "submission";
send_data->domain = g_strdup(domain);
send_data->hostname_entry = GTK_ENTRY(basic_page.smtpserv_entry);
diff --git a/src/wizard.c b/src/wizard.c
@@ -112,6 +112,11 @@ typedef struct
GtkWidget *smtp_cert_table;
GtkWidget *recv_cert_table;
#endif
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+ GtkWidget *auto_configure_lbl;
+ GtkWidget *auto_configure_btn;
+ GtkWidget *auto_configure_cancel_btn;
+#endif
gboolean create_mailbox;
gboolean finished;
gboolean result;
@@ -1234,6 +1239,11 @@ static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
gtk_widget_show(wizard->recv_use_tls);
gtk_widget_show(wizard->recv_cert_table);
#endif
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+ gtk_widget_show(wizard->auto_configure_btn);
+ gtk_widget_hide(wizard->auto_configure_cancel_btn);
+ gtk_widget_show(wizard->auto_configure_lbl);
+#endif
gtk_label_set_text(GTK_LABEL(wizard->recv_label), _("<span weight=\"bold\">Server address:</span>"));
gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, TRUE);
@@ -1259,6 +1269,11 @@ static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
gtk_widget_show(wizard->recv_use_tls);
gtk_widget_show(wizard->recv_cert_table);
#endif
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+ gtk_widget_show(wizard->auto_configure_btn);
+ gtk_widget_hide(wizard->auto_configure_cancel_btn);
+ gtk_widget_show(wizard->auto_configure_lbl);
+#endif
gtk_label_set_text(GTK_LABEL(wizard->recv_label), _("<span weight=\"bold\">Server address:</span>"));
gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, TRUE);
@@ -1299,6 +1314,11 @@ static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
gtk_widget_hide(wizard->recv_password);
gtk_widget_hide(wizard->recv_username_label);
gtk_widget_hide(wizard->recv_password_label);
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+ gtk_widget_hide(wizard->auto_configure_btn);
+ gtk_widget_hide(wizard->auto_configure_cancel_btn);
+ gtk_widget_hide(wizard->auto_configure_lbl);
+#endif
#ifdef USE_GNUTLS
gtk_widget_hide(wizard->recv_use_ssl);
gtk_widget_hide(wizard->recv_use_tls);
@@ -1320,6 +1340,102 @@ static void wizard_protocol_changed(GtkComboBox *combo, gpointer data)
wizard_protocol_change(wizard, protocol);
}
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+static void auto_configure_cb (GtkWidget *widget, gpointer data)
+{
+ gchar *address = NULL;
+ const gchar *domain = NULL;
+ AutoConfigureData *recv_data;
+ AutoConfigureData *send_data;
+ static GCancellable *recv_cancel = NULL;
+ static GCancellable *send_cancel = NULL;
+ WizardWindow *wizard = (WizardWindow *)data;
+ RecvProtocol protocol = combobox_get_active_data(GTK_COMBO_BOX(wizard->recv_type));
+
+ if (!recv_cancel) {
+ recv_cancel = g_cancellable_new();
+ send_cancel = g_cancellable_new();
+ }
+
+ if (widget == wizard->auto_configure_cancel_btn) {
+ g_cancellable_cancel(recv_cancel);
+ g_cancellable_cancel(send_cancel);
+ g_object_unref(recv_cancel);
+ g_object_unref(send_cancel);
+ recv_cancel = NULL;
+ send_cancel = NULL;
+ return;
+ }
+
+ address = gtk_editable_get_chars(GTK_EDITABLE(wizard->email), 0, -1);
+
+ if (strchr(address, '@') < 0) {
+ g_free(address);
+ gtk_label_set_text(GTK_LABEL(wizard->auto_configure_lbl),
+ _("Failed (wrong address)"));
+ }
+ domain = strchr(address, '@') + 1;
+
+ if (protocol == A_POP3 || protocol == A_IMAP4) {
+ recv_data = g_new0(AutoConfigureData, 1);
+ recv_data->configure_button = GTK_BUTTON(wizard->auto_configure_btn);
+ recv_data->cancel_button = GTK_BUTTON(wizard->auto_configure_cancel_btn);
+ recv_data->info_label = GTK_LABEL(wizard->auto_configure_lbl);
+ recv_data->cancel = recv_cancel;
+ switch(protocol) {
+ case A_POP3:
+ recv_data->ssl_service = "pop3s";
+ recv_data->tls_service = "pop3";
+ recv_data->domain = g_strdup(domain);
+ recv_data->hostname_entry = GTK_ENTRY(wizard->recv_server);
+ recv_data->set_port = NULL;
+ recv_data->port = NULL;
+ recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(wizard->recv_use_tls);
+ recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(wizard->recv_use_ssl);
+ recv_data->default_port = 110;
+ recv_data->default_ssl_port = 995;
+ break;
+ case A_IMAP4:
+ recv_data->ssl_service = "imaps";
+ recv_data->tls_service = "imap";
+ recv_data->domain = g_strdup(domain);
+ recv_data->hostname_entry = GTK_ENTRY(wizard->recv_server);
+ recv_data->set_port = NULL;
+ recv_data->port = NULL;
+ recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(wizard->recv_use_tls);
+ recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(wizard->recv_use_ssl);
+ recv_data->default_port = 143;
+ recv_data->default_ssl_port = 993;
+ break;
+ default:
+ cm_return_if_fail(FALSE);
+ }
+ auto_configure_service(recv_data);
+ }
+
+ send_data = g_new0(AutoConfigureData, 1);
+ send_data->configure_button = GTK_BUTTON(wizard->auto_configure_btn);
+ send_data->cancel_button = GTK_BUTTON(wizard->auto_configure_cancel_btn);
+ send_data->info_label = GTK_LABEL(wizard->auto_configure_lbl);
+ send_data->cancel = send_cancel;
+
+ send_data->ssl_service = NULL;
+ send_data->tls_service = "submission";
+ send_data->domain = g_strdup(domain);
+ send_data->hostname_entry = GTK_ENTRY(wizard->smtp_server);
+ send_data->set_port = NULL;
+ send_data->port = NULL;
+ send_data->tls_checkbtn = GTK_TOGGLE_BUTTON(wizard->smtp_use_tls);
+ send_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(wizard->smtp_use_ssl);
+ send_data->default_port = 25;
+ send_data->default_ssl_port = -1;
+
+ auto_configure_service(send_data);
+
+ g_free(address);
+}
+#endif
+
static GtkWidget* recv_page (WizardWindow * wizard)
{
GtkWidget *table = gtk_table_new(1,1, FALSE);
@@ -1332,6 +1448,11 @@ static GtkWidget* recv_page (WizardWindow * wizard)
GtkWidget *button;
GtkWidget *recv_cert_table;
#endif
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+ GtkWidget *auto_configure_btn;
+ GtkWidget *auto_configure_cancel_btn;
+ GtkWidget *auto_configure_lbl;
+#endif
GtkListStore *store;
GtkTreeIter iter;
gchar *text;
@@ -1347,8 +1468,31 @@ static GtkWidget* recv_page (WizardWindow * wizard)
GTK_EXPAND|GTK_FILL, 0, 0, 0);
recv_table = gtk_table_new(4, 2, FALSE);
+
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+ hbox = gtk_hbox_new(FALSE, VSPACING_NARROW);
+ auto_configure_btn = gtk_button_new_with_label(_("Auto-configure"));
+ gtk_box_pack_start(GTK_BOX (hbox), auto_configure_btn, FALSE, FALSE, 0);
+ auto_configure_cancel_btn = gtk_button_new_with_label(_("Cancel"));
+ gtk_box_pack_start(GTK_BOX (hbox), auto_configure_cancel_btn, FALSE, FALSE, 0);
+ auto_configure_lbl = gtk_label_new("");
+ gtk_label_set_justify(GTK_LABEL(auto_configure_lbl), GTK_JUSTIFY_LEFT);
+ gtk_box_pack_start(GTK_BOX (hbox), auto_configure_lbl, FALSE, FALSE, 0);
+ gtk_widget_show(auto_configure_btn);
+ gtk_widget_show(auto_configure_lbl);
+ gtk_widget_show(hbox);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+ wizard->auto_configure_lbl = auto_configure_lbl;
+ wizard->auto_configure_btn = auto_configure_btn;
+ wizard->auto_configure_cancel_btn = auto_configure_cancel_btn;
+ g_signal_connect (G_OBJECT (auto_configure_btn), "clicked",
+ G_CALLBACK (auto_configure_cb), wizard);
+ g_signal_connect (G_OBJECT (auto_configure_cancel_btn), "clicked",
+ G_CALLBACK (auto_configure_cb), wizard);
+#endif
gtk_box_pack_start(GTK_BOX(vbox), recv_table, FALSE, FALSE, 0);
+
label = gtk_label_new(_("<span weight=\"bold\">Server type:</span>"));
gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
@@ -1769,7 +1913,9 @@ gboolean run_wizard(MainWindow *mainwin, gboolean create_mailbox) {
gtk_widget_hide(wizard->recv_imap_label);
gtk_widget_hide(wizard->recv_imap_subdir);
gtk_widget_hide(wizard->subsonly_checkbtn);
-
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+ gtk_widget_hide(wizard->auto_configure_cancel_btn);
+#endif
wizard_protocol_change(wizard, tmpl.recvtype);
while (!wizard->finished)