[anjal] Autoconfig email accounts via mozilla isp-db



commit d0a4aa0eac664d90f00a49c205e6e1f344a81880
Author: Srinivasa Ragavan <sragavan gnome org>
Date:   Fri Jan 29 20:58:14 2010 +0530

    Autoconfig email accounts via mozilla isp-db

 configure.ac             |    2 +-
 src/Makefile.am          |    8 +-
 src/mail-account-view.c  |   60 ++++++++++
 src/mail-guess-servers.c |  274 ++++++++++++++++++++++++++++++++++++++++++++++
 src/mail-guess-servers.h |   51 +++++++++
 5 files changed, 392 insertions(+), 3 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 4d77da8..03cc2c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -328,7 +328,7 @@ AC_SUBST(MANUAL_NSPR_LIBS)
 AC_SUBST(MANUAL_NSS_CFLAGS)
 AC_SUBST(MANUAL_NSS_LIBS)
 
-PKG_CHECK_MODULES(ANJAL, [gtk+-2.0 >= 2.8 libglade-2.0 >= 2.6.0 glib-2.0 gconf-2.0 libedataserver-1.2 libedataserverui-1.2 libebook-1.2 camel-1.2 evolution-mail >= 2.29.4 evolution-plugin libxml-2.0 sqlite3 libgtkhtml-3.14 gtkhtml-editor dbus-1])
+PKG_CHECK_MODULES(ANJAL, [gtk+-2.0 >= 2.8 libglade-2.0 >= 2.6.0 glib-2.0 gconf-2.0 libsoup-2.4 libedataserver-1.2 libedataserverui-1.2 libebook-1.2 camel-1.2 evolution-mail >= 2.29.4 evolution-plugin libxml-2.0 sqlite3 libgtkhtml-3.14 gtkhtml-editor dbus-1])
 EVO_VERSION="`$PKG_CONFIG --variable=execversion evolution-shell`"
 
 if test "x$EVO_VERSION" = "x2.26"; then
diff --git a/src/Makefile.am b/src/Makefile.am
index 5e88e04..7f83be7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -40,7 +40,9 @@ anjal_settings_SOURCES  = \
 	mail-decoration.c \
 	mail-decoration.h \
 	anjal-mail-view.h \
-	anjal-mail-view.c
+	anjal-mail-view.c \
+	mail-guess-servers.c \
+	mail-guess-servers.h
 
 anjal_settings_CFLAGS = -DANJAL_SETTINGS
 
@@ -85,7 +87,9 @@ anjal_SOURCES = \
 	em-format-mail-display.c \
 	em-format-mail-display.h \
 	mail-float-bar.c \
-	mail-float-bar.h
+	mail-float-bar.h \
+	mail-guess-servers.c \
+	mail-guess-servers.h
 
 #	mail-search.c \
 #	mail-search.h \
diff --git a/src/mail-account-view.c b/src/mail-account-view.c
index 8b8486f..b12d447 100644
--- a/src/mail-account-view.c
+++ b/src/mail-account-view.c
@@ -30,6 +30,7 @@
 #include "mail-view.h"
 #include "e-util/e-config.h"
 #include "mail/mail-config.h"
+#include "mail-guess-servers.h"
 
 extern gboolean anjal_icon_decoration;
 
@@ -579,6 +580,64 @@ mav_construct_page(MailAccountView *view, MAVPageType type)
 	return (GtkWidget *)page;
 }
 
+static ServerData *
+emae_check_servers (const gchar *email)
+{
+	ServerData *sdata = g_new0(ServerData, 1);
+	EmailProvider *provider = g_new0(EmailProvider, 1);
+	char *dupe = g_strdup(email);
+	char *tmp;
+
+	/* FIXME: Find a way to free the provider once given to account settings. */
+	provider->email = (char *)email;
+	tmp = strchr(email, '@');
+	tmp++;
+	provider->domain = tmp;
+	tmp = strchr(dupe, '@');
+	*tmp = 0;
+	provider->username = (char *)g_quark_to_string(g_quark_from_string(dupe));
+	g_free(dupe);
+
+	if (!mail_guess_servers (provider)) {
+		g_free (provider);
+		g_free (sdata);
+		return NULL;
+	}
+	/*printf("Recv: %s\n%s(%s), %s by %s \n Send: %s\n%s(%s), %s by %s\n via %s to %s\n", 
+	  provider->recv_type, provider->recv_hostname, provider->recv_port, provider->recv_username, provider->recv_auth,
+	  provider->send_type, provider->send_hostname, provider->send_port, provider->send_username, provider->send_auth,
+	  provider->recv_socket_type, provider->send_socket_type); */
+	
+	sdata->recv = provider->recv_hostname;
+	sdata->recv_port = provider->recv_port;
+	sdata->send = provider->send_hostname;
+	sdata->send_port = provider->send_port;
+	if (strcmp(provider->recv_type, "pop3") == 0)
+		sdata->proto = g_strdup("pop");
+	else
+		sdata->proto = provider->recv_type;
+	if (provider->recv_socket_type) {
+		if(g_ascii_strcasecmp(provider->recv_socket_type, "SSL") == 0)
+			sdata->ssl = g_strdup("always");
+		else if(g_ascii_strcasecmp(provider->recv_socket_type, "secure") == 0)
+			sdata->ssl = g_strdup("always");
+		else if(g_ascii_strcasecmp(provider->recv_socket_type, "STARTTLS") == 0)
+			sdata->ssl = g_strdup("when-possible");		
+		else if(g_ascii_strcasecmp(provider->recv_socket_type, "TLS") == 0)
+			sdata->ssl = g_strdup("when-possible");
+		else 
+			sdata->ssl = g_strdup("never");
+
+	}
+	sdata->send_user = provider->send_username;
+	sdata->recv_user = provider->recv_username;
+
+	
+	g_free (provider);
+
+	return sdata;
+}
+
 void
 mail_account_view_construct (MailAccountView *view)
 {
@@ -602,6 +661,7 @@ mail_account_view_construct (MailAccountView *view)
 	view->current_page = 0;
 	gtk_box_pack_start ((GtkBox *)view, view->scroll, TRUE, TRUE, 0);
 	view->edit = em_account_editor_new_for_pages (view->original, EMAE_PAGES, "org.gnome.evolution.mail.config.accountWizard", view->wpages);
+	view->edit->emae_check_servers = emae_check_servers;
 	if (!view->original) {
 		e_account_set_bool (em_account_editor_get_modified_account(view->edit), E_ACCOUNT_SOURCE_SAVE_PASSWD, TRUE);
 		e_account_set_bool (em_account_editor_get_modified_account(view->edit), E_ACCOUNT_TRANSPORT_SAVE_PASSWD, TRUE);
diff --git a/src/mail-guess-servers.c b/src/mail-guess-servers.c
new file mode 100644
index 0000000..26fc630
--- /dev/null
+++ b/src/mail-guess-servers.c
@@ -0,0 +1,274 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>  
+ *
+ *
+ * Authors:
+ *		Srinivasa Ragavan <srini linux intel com>
+ *
+ * Copyright (C) 2009 Intel Corporation (www.intel.com)
+ *
+ */
+
+/* Template of the code is taken from libsoup tests/ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <libsoup/soup.h>
+
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlmemory.h>
+
+#include "mail-guess-servers.h"
+
+static char *
+xml_to_gchar (xmlChar *xml, EmailProvider *provider)
+{
+	char *gxml = NULL;
+	char *tmp; 	
+	char *repl = NULL, *sec_part;
+
+	tmp = xml ? strstr(xml, "\%EMAIL") : NULL;
+
+	if (!tmp) {
+		gxml = xml ? g_strdup(xml) : NULL ;
+	} else {
+	decodepart:
+		*tmp = 0;
+		tmp+=6;
+		if(*tmp == 'A') 
+			repl = provider->email;
+		else if (*tmp == 'L')
+			repl = provider->username;
+		else if (*tmp == 'D')
+			repl = provider->domain;
+		sec_part = strstr(tmp, "\%");
+		sec_part++;
+		if (!*sec_part)
+			sec_part = "";
+	
+		gxml = g_strdup_printf("%s%s%s", gxml ? gxml: xml, repl, sec_part);
+		tmp = strstr (gxml, "\%EMAIL");
+		if(tmp) {
+			goto decodepart;
+		}
+	}
+
+	xmlFree(xml);
+	
+	return gxml;
+}
+
+static SoupMessage *
+get_url (SoupSession *session, const char *url)
+{
+	const char *name;
+	SoupMessage *msg;
+	const char *header;
+
+	msg = soup_message_new (SOUP_METHOD_GET, url);
+	soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
+
+	soup_session_send_message (session, msg);
+
+	name = soup_message_get_uri (msg)->path;
+
+
+	if (SOUP_STATUS_IS_REDIRECTION (msg->status_code)) {
+		header = soup_message_headers_get_one (msg->response_headers,
+						       "Location");
+		if (header) {
+			return get_url (session, header);
+		}
+	} else if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
+		return msg;
+	}
+
+	return NULL;
+}
+
+
+static void 
+handle_incoming (xmlNodePtr head, EmailProvider *provider)
+{
+	xmlNodePtr node = head->children;
+
+	provider->recv_type = xml_to_gchar(xmlGetProp(head, "type"), provider);
+
+	while (node) {
+		if (strcmp ((gchar *)node->name, "hostname") == 0) {
+			provider->recv_hostname = xml_to_gchar(xmlNodeGetContent(node), provider);
+		} else if (strcmp ((gchar *)node->name, "port") == 0) {
+			provider->recv_port = xml_to_gchar(xmlNodeGetContent(node), provider);
+		} else if (strcmp ((gchar *)node->name, "socketType") == 0) {
+			provider->recv_socket_type = xml_to_gchar(xmlNodeGetContent(node), provider);
+		} else if (strcmp ((gchar *)node->name, "username") == 0) {
+			provider->recv_username = xml_to_gchar(xmlNodeGetContent(node), provider);			
+		} else if (strcmp ((gchar *)node->name, "authentication") == 0) {
+		 	provider->recv_auth = xml_to_gchar(xmlNodeGetContent(node), provider);			
+		}
+
+		node = node->next;
+	}
+}
+
+static void 
+handle_outgoing (xmlNodePtr head, EmailProvider *provider)
+{
+	xmlNodePtr node = head->children;
+
+	provider->send_type = xml_to_gchar(xmlGetProp(head, "type"), provider);
+
+	while (node) {
+		if (strcmp ((gchar *)node->name, "hostname") == 0) {
+			provider->send_hostname = xml_to_gchar(xmlNodeGetContent(node), provider);
+		} else if (strcmp ((gchar *)node->name, "port") == 0) {
+			provider->send_port = xml_to_gchar(xmlNodeGetContent(node), provider);
+		} else if (strcmp ((gchar *)node->name, "socketType") == 0) {
+			provider->send_socket_type = xml_to_gchar(xmlNodeGetContent(node), provider);
+		} else if (strcmp ((gchar *)node->name, "username") == 0) {
+			provider->send_username = xml_to_gchar(xmlNodeGetContent(node), provider);			
+		} else if (strcmp ((gchar *)node->name, "authentication") == 0) {
+		 	provider->send_auth = xml_to_gchar(xmlNodeGetContent(node), provider);			
+		}
+
+		node = node->next;
+	}
+}
+
+static void
+parse_msg (SoupMessage *msg, EmailProvider *provider)
+{
+	xmlDocPtr doc;
+	xmlNodePtr node, top;
+
+	doc = xmlReadMemory ((xmlChar *) msg->response_body->data, msg->response_body->length, "file.xml", NULL, 0);
+
+	node = doc->children;
+	while (node) {
+		if (strcmp ((gchar *)node->name, "clientConfig") == 0) {
+			break;
+		}
+		node = node->next;
+	}
+
+	if (!node) {
+		g_warning ("Incorrect data: ClientConfig not found ... Quitting\n");
+		return;
+	}
+
+	node = node->children;
+	while (node) {
+		if (strcmp ((gchar *)node->name, "emailProvider") == 0) {
+			break;
+		}
+		node = node->next;
+	}
+
+	if (!node) {
+		g_warning ("Incorrect data: ClientConfig not found ... Quitting\n");
+		return;
+	}
+
+	top = node;
+	node = node->children;
+	while (node) {
+		if (strcmp ((gchar *)node->name, "incomingServer") == 0) {
+			/* Handle Incoming */
+			handle_incoming (node, provider);
+		} else if (strcmp ((gchar *)node->name, "outgoingServer") == 0) {
+			/* Handle Outgoing */
+			handle_outgoing (node, provider);
+		} 
+
+		node = node->next;
+	}
+
+	xmlFreeDoc(doc);
+}
+
+gboolean
+mail_guess_servers(EmailProvider *provider)
+{
+	const char *cafile = NULL, *url;
+	SoupURI *proxy = NULL, *parsed;
+	int opt;
+	SoupMessage *msg;
+	SoupSession *session;
+
+	url = g_strdup_printf("%s/%s", "https://live.mozillamessaging.com/autoconfig";, provider->domain); 
+	parsed = soup_uri_new (url);
+	soup_uri_free (parsed);
+
+
+	session = soup_session_sync_new_with_options (
+		SOUP_SESSION_SSL_CA_FILE, cafile,
+		SOUP_SESSION_USER_AGENT, "get ",
+		NULL);
+
+	if (proxy) {
+		g_object_set (G_OBJECT (session), 
+			      SOUP_SESSION_PROXY_URI, proxy,
+			      NULL);
+	}
+
+	msg = get_url (session, url);
+	if (!msg)
+		return FALSE;
+
+	parse_msg(msg, provider);
+	
+	g_object_unref (msg);
+	g_object_unref(session);
+	g_free(url);
+
+	return TRUE;
+
+}
+
+#ifdef TEST
+int
+main (int argc, char **argv)
+{
+	EmailProvider *provider;
+	g_thread_init (NULL);
+	g_type_init ();
+
+	provider = g_new0(EmailProvider, 1);
+
+	provider->email = "sragavan iijmio-mail jp";
+	provider->domain = "iijmio-mail.jp";
+	provider->username = "sragavan";
+
+	mail_guess_servers (provider);
+
+	printf("Recv: %s\n%s(%s), %s by %s \n Send: %s\n%s(%s), %s by %s\n via %s to %s\n", 
+	  provider->recv_type, provider->recv_hostname, provider->recv_port, provider->recv_username, provider->recv_auth,
+	  provider->send_type, provider->send_hostname, provider->send_port, provider->send_username, provider->send_auth,
+	  provider->recv_socket_type, provider->send_socket_type);	  
+	return 0;
+}
+#endif
diff --git a/src/mail-guess-servers.h b/src/mail-guess-servers.h
new file mode 100644
index 0000000..b1d6746
--- /dev/null
+++ b/src/mail-guess-servers.h
@@ -0,0 +1,51 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>  
+ *
+ *
+ * Authors:
+ *		Srinivasa Ragavan <srini linux intel com>
+ *
+ * Copyright (C) 2009 Intel Corporation (www.intel.com)
+ *
+ */
+
+#ifndef _MAIL_GUESS_SERVERS_
+#define _MAIL_GUESS_SERVERS_
+
+typedef struct _EmailProvider {
+	/* Input */
+	char *domain;
+	char *email;
+	char *username;
+
+	/* Receiving server*/
+	char *recv_type;
+	char *recv_hostname;
+	char *recv_port;
+	char *recv_socket_type;
+	char *recv_username;
+	char *recv_auth;
+
+	/* Sending server */
+	char *send_type;
+	char *send_hostname;
+	char *send_port;
+	char *send_socket_type;
+	char *send_username;
+	char *send_auth;
+} EmailProvider;
+
+gboolean mail_guess_servers (EmailProvider *provider);
+
+#endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]