[Commits] [SCM] claws branch, master, updated. 3.9.3-101-ga9065ae

colin at claws-mail.org colin at claws-mail.org
Fri Apr 25 17:54:50 CEST 2014


The branch master of project "claws" (Claws Mail) has been updated
       via  a9065aec26499a0e1294c73b6d9e6f039976521e (commit)
      from  4c7ed56f3b9027689df4a979df26c7ff62c7adf0 (commit)


- Log -----------------------------------------------------------------
commit a9065aec26499a0e1294c73b6d9e6f039976521e
Author: Colin Leroy <colin at colino.net>
Date:   Fri Apr 25 17:54:24 2014 +0200

    First implementation of auto-configuration (bug #3140)
    Wizard is still to do.

diff --git a/src/common/utils.c b/src/common/utils.c
index ef8c6b6..52f6bac 100644
--- a/src/common/utils.c
+++ b/src/common/utils.c
@@ -25,6 +25,7 @@
 #include "defs.h"
 
 #include <glib.h>
+#include <gio/gio.h>
 
 #include <glib/gi18n.h>
 
@@ -5514,3 +5515,45 @@ int cm_canonicalize_filename(const gchar *filename, gchar **canonical_name) {
 	slist_free_strings_full(canonical_parts);
 	return 0;
 }
+
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+gboolean auto_configure_service(const gchar *service, const gchar *domain, gchar **srvhost, guint16 *srvport)
+{
+	GResolver *resolver;
+	GList *answers, *cur;
+	GError *error = NULL;
+	gboolean result = FALSE;
+
+	cm_return_val_if_fail(service != NULL, FALSE);
+	cm_return_val_if_fail(domain != NULL, FALSE);
+
+	resolver = g_resolver_get_default();
+	if (resolver == NULL)
+		return FALSE;
+	
+	answers = g_resolver_lookup_service(resolver, service, "tcp", domain, NULL, &error);
+
+	*srvhost = NULL;
+	*srvport = 0;
+
+	if (answers) {
+		for (cur = g_srv_target_list_sort(answers); cur; cur = cur->next) {
+			GSrvTarget *target = (GSrvTarget *)cur->data;
+			const gchar *hostname = g_srv_target_get_hostname(target);
+			guint16 port = g_srv_target_get_port(target);
+			if (hostname && strcmp(hostname,"") && port > 0) {
+				result = TRUE;
+				*srvhost = g_strdup(hostname);
+				*srvport = port;
+				break;
+			}
+		}
+		g_resolver_free_targets(answers);
+	} else if (error) {
+		g_error_free(error);
+	}
+
+	g_object_unref(resolver);
+	return result;
+}
+#endif
\ No newline at end of file
diff --git a/src/common/utils.h b/src/common/utils.h
index a0c4619..d15c66a 100644
--- a/src/common/utils.h
+++ b/src/common/utils.h
@@ -598,6 +598,11 @@ GMutex *cm_mutex_new(void);
 void cm_mutex_free(GMutex *mutex);
 
 int cm_canonicalize_filename(const gchar *filename, gchar **canonical_name);
+
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+gboolean auto_configure_service(const gchar *service, const gchar *domain, gchar **srvhost, guint16 *srvport);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/prefs_account.c b/src/prefs_account.c
index f9232cd..e3aa20b 100644
--- a/src/prefs_account.c
+++ b/src/prefs_account.c
@@ -119,6 +119,8 @@ typedef struct BasicPage
 	GtkWidget *pass_label;
 	GtkWidget *uid_entry;
 	GtkWidget *pass_entry;
+	GtkWidget *auto_configure_btn;
+	GtkWidget *auto_configure_lbl;
 } BasicPage;
 
 typedef struct ReceivePage
@@ -904,6 +906,11 @@ static void prefs_account_signature_edit_cb	(GtkWidget	*widget,
 static void pop_bfr_smtp_tm_set_sens		(GtkWidget	*widget,
 						 gpointer	 data);
 
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+static void auto_configure_cb			(GtkWidget	*widget,
+						 gpointer	 data);
+
+#endif
 static void prefs_account_edit_custom_header	(void);
 
 
@@ -1012,6 +1019,8 @@ static void basic_create_widget_func(PrefsPage * _page,
 	GtkWidget *pass_label;
 	GtkWidget *uid_entry;
 	GtkWidget *pass_entry;
+	GtkWidget *auto_configure_btn;
+	GtkWidget *auto_configure_lbl;
 	GtkListStore *menu;
 	GtkTreeIter iter;
 
@@ -1121,6 +1130,18 @@ static void basic_create_widget_func(PrefsPage * _page,
 	gtk_label_set_justify(GTK_LABEL(optlabel), GTK_JUSTIFY_CENTER);
 	gtk_box_pack_start(GTK_BOX (optmenubox), optlabel, FALSE, FALSE, 0);
 
+	auto_configure_btn = gtk_button_new_with_label(_("Auto-configure"));
+	gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_btn, FALSE, FALSE, 0);
+	auto_configure_lbl = gtk_label_new("");
+	gtk_label_set_justify(GTK_LABEL(optlabel), 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);
+	gtk_widget_show(auto_configure_lbl);
+	g_signal_connect (G_OBJECT (auto_configure_btn), "clicked",
+			  G_CALLBACK (auto_configure_cb), NULL);
+#endif
+
 	no_imap_warn_icon = gtk_image_new_from_stock
                         (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
 	no_imap_warn_label = gtk_label_new(_("<span weight=\"bold\">Warning: this version of Claws Mail\n"
@@ -1305,6 +1326,8 @@ static void basic_create_widget_func(PrefsPage * _page,
 	page->pass_label       = pass_label;
 	page->uid_entry        = uid_entry;
 	page->pass_entry       = pass_entry;
+	page->auto_configure_btn = auto_configure_btn;
+	page->auto_configure_lbl = auto_configure_lbl;
 
 	if (new_account) {
 		PrefsAccount *def_ac;
@@ -3776,6 +3799,104 @@ static void prefs_account_select_folder_cb(GtkWidget *widget, gpointer data)
 	}
 }
 
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+static void auto_configure_cb (GtkWidget *widget, gpointer data)
+{
+	gchar *address = NULL;
+	const gchar *service = NULL;
+	const gchar *secure_service = NULL;
+	const gchar *domain = NULL;
+	gchar *hostname;
+	guint16 port = 0;
+	gboolean r = FALSE;
+	gboolean ssl = FALSE;
+	RecvProtocol protocol;
+	struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *) basic_page.protocol_optmenu;
+	GtkWidget *optmenu = protocol_optmenu->combobox;
+
+	protocol = combobox_get_active_data(GTK_COMBO_BOX(optmenu));
+
+	address = gtk_editable_get_chars(GTK_EDITABLE(basic_page.addr_entry), 0, -1);
+
+	if (strchr(address, '@') < 0) {
+		g_free(address);
+		gtk_label_set_text(GTK_LABEL(basic_page.auto_configure_lbl),
+			   _("Failed (wrong address)"));
+	}
+	domain = strchr(address, '@') + 1;
+
+	switch(protocol) {
+	case A_POP3:
+		secure_service = "pop3s";
+		service = "pop3";
+		break;
+	case A_IMAP4:
+		secure_service = "imaps";
+		service = "imap";
+		break;
+	default:
+		secure_service = NULL;
+		service = NULL;
+	}
+
+	gtk_label_set_text(GTK_LABEL(basic_page.auto_configure_lbl),
+			   _("Configuring..."));
+	GTK_EVENTS_FLUSH();
+
+	if (service) {
+		r = auto_configure_service(secure_service, domain, &hostname, &port);
+		if (r)
+			ssl = TRUE;
+		else
+			r = auto_configure_service(service, domain, &hostname, &port);
+	}
+
+	if (r) {
+		switch(protocol) {
+		case A_POP3:
+			gtk_entry_set_text(GTK_ENTRY(basic_page.recvserv_entry), hostname);
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(advanced_page.popport_checkbtn),
+				(ssl && port == 995) || (!ssl && port == 110));
+			gtk_spin_button_set_value(GTK_SPIN_BUTTON(advanced_page.popport_spinbtn), port);
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
+				ssl ? ssl_page.pop_ssltunnel_radiobtn : ssl_page.pop_starttls_radiobtn),
+				TRUE);
+			break;
+		case A_IMAP4:
+			gtk_entry_set_text(GTK_ENTRY(basic_page.recvserv_entry), hostname);
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(advanced_page.imapport_checkbtn),
+				(ssl && port == 993) || (!ssl && port == 143));
+			gtk_spin_button_set_value(GTK_SPIN_BUTTON(advanced_page.imapport_spinbtn), port);
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
+				ssl ? ssl_page.imap_ssltunnel_radiobtn : ssl_page.imap_starttls_radiobtn),
+				TRUE);
+			break;
+		default:
+			secure_service = NULL;
+			service = NULL;
+		}
+		g_free(hostname);
+	}
+	
+	r = auto_configure_service("submission", domain, &hostname, &port);
+
+	if (r) {
+		gtk_entry_set_text(GTK_ENTRY(basic_page.smtpserv_entry), hostname);
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(advanced_page.smtpport_checkbtn),
+			port == 25);
+		gtk_spin_button_set_value(GTK_SPIN_BUTTON(advanced_page.smtpport_spinbtn), port);
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ssl_page.smtp_starttls_radiobtn), TRUE);
+		gtk_label_set_text(GTK_LABEL(basic_page.auto_configure_lbl),
+			   _("Done."));
+	} else {
+		gtk_label_set_text(GTK_LABEL(basic_page.auto_configure_lbl),
+			   _("Auto-configuration failed."));
+	}
+	
+	g_free(address);
+}
+#endif
+
 static void prefs_account_sigfile_radiobtn_cb(GtkWidget *widget, gpointer data)
 {
 	gtk_widget_set_sensitive(GTK_WIDGET(signature_browse_button), TRUE);
@@ -4087,6 +4208,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
 
 	gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
 	gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
+
 	switch(protocol) {
 	case A_NNTP:
 #ifndef HAVE_LIBETPAN
@@ -4497,6 +4619,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
 		gtk_widget_hide(receive_page.low_bandwidth_checkbtn);
 		break;
 	case A_POP3:
+		/* continue to default: */
 	default:
 		gtk_widget_show(send_page.msgid_checkbtn);
 		gtk_widget_show(send_page.xmailer_checkbtn);

-----------------------------------------------------------------------

Summary of changes:
 src/common/utils.c  |   43 ++++++++++++++++++
 src/common/utils.h  |    5 +++
 src/prefs_account.c |  123 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 171 insertions(+)


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list