[purple-facebookchat/f13/master] pre-release patch fix for chat incompatibility from trunk (Thanks to Rudolf Kastl)

Ismael Olea olea at fedoraproject.org
Fri Apr 15 19:03:33 UTC 2011


commit 01009d649cfe6c26bf7881de94624ba067c7a530
Author: Ismael Olea <ismael at olea.org>
Date:   Fri Apr 15 21:03:10 2011 +0200

    pre-release patch fix for chat incompatibility from trunk (Thanks to Rudolf Kastl)

 purple-facebookchat-fbchat-fix.patch |  231 ++++++++++++++++++++++++++++++++++
 purple-facebookchat.spec             |   13 ++-
 2 files changed, 242 insertions(+), 2 deletions(-)
---
diff --git a/purple-facebookchat-fbchat-fix.patch b/purple-facebookchat-fbchat-fix.patch
new file mode 100644
index 0000000..04220e1
--- /dev/null
+++ b/purple-facebookchat-fbchat-fix.patch
@@ -0,0 +1,231 @@
+diff -ru pidgin-facebookchat/fb_blist.c ../pidgin-facebookchat-read-only/fb_blist.c
+--- pidgin-facebookchat/fb_blist.c	2010-11-26 11:07:32.000000000 +0100
++++ ../pidgin-facebookchat-read-only/fb_blist.c	2011-04-15 10:53:37.145218926 +0200
+@@ -292,6 +292,7 @@
+ 	gsize uid_length;
+ 	FacebookBuddy *fbuddy;
+ 	PurpleBuddy *buddy;
++	GHashTable *processed_buddies;
+ 	
+ 	purple_debug_info("facebook", "parsing status message stream\n");
+ 	
+@@ -321,6 +322,8 @@
+ 			objnode, "html"));
+ 	//purple_debug_misc("facebook", "html data\n%s\n", html);
+ 	
++	processed_buddies = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
++	
+ 	messages = g_strsplit(html, "/h6>", -1);
+ 	for(i = 0; messages[i]; i++)
+ 	{
+@@ -348,7 +351,7 @@
+ 		if (!message_string)
+ 		{
+ 			g_free(uid_string);
+-			continue;	
++			continue;
+ 		}
+ 		message_string = strchr(message_string, '>');
+ 		if (!message_string)
+@@ -359,6 +362,15 @@
+ 		message_string += 1;
+ 		message_string = g_strndup(message_string, g_strrstr(message_string, "<")-message_string);
+ 		purple_debug_info("facebook", "message: %s\n", message_string);
++
++		if (g_hash_table_lookup(processed_buddies, uid_string))
++		{
++			// Already processed a status message for this buddy
++			g_free(uid_string);
++			g_free(message_string);
++			continue;
++		}
++		g_hash_table_insert(processed_buddies, uid_string, uid_string);
+ 		
+ 		buddy = purple_find_buddy(fba->account, uid_string);
+ 		if (buddy && buddy->proto_data)
+@@ -371,15 +383,14 @@
+ 			fbuddy->status = purple_markup_strip_html(message_string);
+ 			
+ 			purple_prpl_got_user_status(fba->account, buddy->name,
+-				purple_primitive_get_id_from_type(
+-					purple_presence_is_idle(purple_buddy_get_presence(buddy)) ? PURPLE_STATUS_AWAY :
+-						PURPLE_STATUS_AVAILABLE), "message", fbuddy->status, NULL);
++				purple_status_get_id(purple_presence_get_active_status(
++					purple_buddy_get_presence(buddy))), "message", fbuddy->status, NULL);
+ 		}
+ 		
+-		g_free(uid_string);
+ 		g_free(message_string);
+ 	}
+ 	g_strfreev(messages);
++	g_hash_table_destroy(processed_buddies);
+ 	
+ 	new_latest = json_node_get_int(json_object_get_member(
+ 			objnode, "newestStoryTime"));
+diff -ru pidgin-facebookchat/fb_connection.c ../pidgin-facebookchat-read-only/fb_connection.c
+--- pidgin-facebookchat/fb_connection.c	2010-10-20 22:52:01.000000000 +0200
++++ ../pidgin-facebookchat-read-only/fb_connection.c	2011-04-15 10:53:37.142218963 +0200
+@@ -477,6 +477,12 @@
+ 	if (host == NULL)
+ 		host = "www.facebook.com";
+ 
++	if (fba && fba->account)
++	{
++		if (purple_account_get_bool(fba->account, "use-https", FALSE))
++			method |= FB_METHOD_SSL;
++	}
++
+ 	if (fba && fba->account && !(method & FB_METHOD_SSL))
+ 	{
+ 		proxy_info = purple_proxy_get_setup(fba->account);
+@@ -556,43 +562,6 @@
+ 
+ 	g_free(cookies);
+ 
+-	/*
+-	 * Do a separate DNS lookup for the given host name and cache it
+-	 * for next time.
+-	 *
+-	 * TODO: It would be better if we did this before we call
+-	 *       purple_proxy_connect(), so we could re-use the result.
+-	 *       Or even better: Use persistent HTTP connections for servers
+-	 *       that we access continually.
+-	 *
+-	 * TODO: This cache of the hostname<-->IP address does not respect
+-	 *       the TTL returned by the DNS server.  We should expire things
+-	 *       from the cache after some amount of time.
+-	 */
+-	if (!is_proxy && !(method & FB_METHOD_SSL) && !g_hostname_is_ip_address(host))
+-	{
+-		/* Don't do this for proxy connections, since proxies do the DNS lookup */
+-		gchar *host_ip;
+-
+-		host_ip = g_hash_table_lookup(fba->hostname_ip_cache, host);
+-		if (host_ip != NULL) {
+-			host = host_ip;
+-		} else if (fba->account && !fba->account->disconnecting) {
+-			GSList *host_lookup_list = NULL;
+-			PurpleDnsQueryData *query;
+-
+-			host_lookup_list = g_slist_prepend(
+-					host_lookup_list, g_strdup(host));
+-			host_lookup_list = g_slist_prepend(
+-					host_lookup_list, fba);
+-
+-			query = purple_dnsquery_a(host, 80,
+-					fb_host_lookup_cb, host_lookup_list);
+-			fba->dns_queries = g_slist_prepend(fba->dns_queries, query);
+-			host_lookup_list = g_slist_append(host_lookup_list, query);
+-		}
+-	}
+-
+ 	fbconn = g_new0(FacebookConnection, 1);
+ 	fbconn->fba = fba;
+ 	fbconn->url = real_url;
+@@ -627,7 +596,20 @@
+ 
+ static void fb_attempt_connection(FacebookConnection *fbconn)
+ {
++	gboolean is_proxy = FALSE;
+ 	FacebookAccount *fba = fbconn->fba;
++	PurpleProxyInfo *proxy_info = NULL;
++
++	if (fba && fba->account && !(fbconn->method & FB_METHOD_SSL))
++	{
++		proxy_info = purple_proxy_get_setup(fba->account);
++		if (purple_proxy_info_get_type(proxy_info) == PURPLE_PROXY_USE_GLOBAL)
++			proxy_info = purple_global_proxy_get_info();
++		if (purple_proxy_info_get_type(proxy_info) == PURPLE_PROXY_HTTP)
++		{
++			is_proxy = TRUE;
++		}	
++	}
+ 
+ #if 0
+ 	/* Connection to attempt retries.  This code doesn't work perfectly, but
+@@ -651,6 +633,44 @@
+ 	
+ 	fba->conns = g_slist_prepend(fba->conns, fbconn);
+ 
++	/*
++	 * Do a separate DNS lookup for the given host name and cache it
++	 * for next time.
++	 *
++	 * TODO: It would be better if we did this before we call
++	 *       purple_proxy_connect(), so we could re-use the result.
++	 *       Or even better: Use persistent HTTP connections for servers
++	 *       that we access continually.
++	 *
++	 * TODO: This cache of the hostname<-->IP address does not respect
++	 *       the TTL returned by the DNS server.  We should expire things
++	 *       from the cache after some amount of time.
++	 */
++	if (!is_proxy && !(fbconn->method & FB_METHOD_SSL) && !g_hostname_is_ip_address(fbconn->hostname))
++	{
++		/* Don't do this for proxy connections, since proxies do the DNS lookup */
++		gchar *host_ip;
++
++		host_ip = g_hash_table_lookup(fba->hostname_ip_cache, fbconn->hostname);
++		if (host_ip != NULL) {
++			g_free(fbconn->hostname);
++			fbconn->hostname = g_strdup(host_ip);
++		} else if (fba->account && !fba->account->disconnecting) {
++			GSList *host_lookup_list = NULL;
++			PurpleDnsQueryData *query;
++
++			host_lookup_list = g_slist_prepend(
++					host_lookup_list, g_strdup(fbconn->hostname));
++			host_lookup_list = g_slist_prepend(
++					host_lookup_list, fba);
++
++			query = purple_dnsquery_a(fbconn->hostname, 80,
++					fb_host_lookup_cb, host_lookup_list);
++			fba->dns_queries = g_slist_prepend(fba->dns_queries, query);
++			host_lookup_list = g_slist_append(host_lookup_list, query);
++		}
++	}
++
+ 	if (fbconn->method & FB_METHOD_SSL) {
+ 		fbconn->ssl_conn = purple_ssl_connect(fba->account, fbconn->hostname,
+ 				443, fb_post_or_get_ssl_connect_cb,
+diff -ru pidgin-facebookchat/fb_messages.c ../pidgin-facebookchat-read-only/fb_messages.c
+--- pidgin-facebookchat/fb_messages.c	2010-10-09 12:33:13.000000000 +0200
++++ ../pidgin-facebookchat-read-only/fb_messages.c	2011-04-15 10:53:37.143218950 +0200
+@@ -332,7 +332,7 @@
+ 
+ 	purple_debug_info("facebook", "getting new messages\n");
+ 
+-	fetch_server = g_strdup_printf("%d.%s.facebook.com", 0, channel_number);
++	fetch_server = g_strdup_printf("%d-%s.facebook.com", 0, channel_number);
+ 	/* use the current time in the url to get past any transparent proxy caches */
+ 	fetch_url = g_strdup_printf("/x/%lu/%s/p_%" G_GINT64_FORMAT "=%d", (gulong)time(NULL), (fba->is_idle?"false":"true"), fba->uid, fba->message_fetch_sequence);
+ 
+@@ -398,9 +398,10 @@
+ 	jstime = g_strdup_printf("%ld%ld", msg->time.tv_sec, (msg->time.tv_usec/1000));
+ 
+ 	encoded_message = g_strdup(purple_url_encode(msg->message));
+-	postdata = g_strdup_printf("msg_text=%s&msg_id=%d&to=%s&client_time=%s&post_form_id=%s",
++	postdata = g_strdup_printf("msg_text=%s&msg_id=%d&to=%s&client_time=%s&post_form_id=%s&fb_dtsg=%s",
+ 			encoded_message, msg->msg_id, msg->who, jstime,
+-			msg->fba->post_form_id ? msg->fba->post_form_id : "0");
++			msg->fba->post_form_id ? msg->fba->post_form_id : "0",
++			msg->fba->dtsg ? msg->fba->dtsg : "(null)");
+ 	g_free(encoded_message);
+ 	g_free(jstime);
+ 
+diff -ru pidgin-facebookchat/libfacebook.c ../pidgin-facebookchat-read-only/libfacebook.c
+--- pidgin-facebookchat/libfacebook.c	2010-11-27 11:55:56.000000000 +0100
++++ ../pidgin-facebookchat-read-only/libfacebook.c	2011-04-15 10:53:37.153218826 +0200
+@@ -812,6 +812,12 @@
+ 		"facebook_manage_friends", FALSE);
+ 	prpl_info->protocol_options = g_list_append(
+ 		prpl_info->protocol_options, option);
++
++	option = purple_account_option_bool_new(
++		_("Always use HTTPS"),
++		"use-https", FALSE);
++	prpl_info->protocol_options = g_list_append(
++		prpl_info->protocol_options, option);
+ }
+ 
+ static PurplePluginProtocolInfo prpl_info = {
diff --git a/purple-facebookchat.spec b/purple-facebookchat.spec
index 10765ad..f334eb6 100644
--- a/purple-facebookchat.spec
+++ b/purple-facebookchat.spec
@@ -1,6 +1,6 @@
 Name:           purple-facebookchat
 Version:        1.69
-Release:        1%{?dist}
+Release:        2%{?dist}
 Summary:        Libpurple plug-in supporting facebook IM
 Group:          Applications/Internet
 License:        GPLv3+
@@ -15,6 +15,9 @@ BuildRequires:  json-glib-devel
 BuildRequires:  zlib-devel
 ExcludeArch:    s390x
 
+# pre-release patch fix for chat incompatibility from trunk (Thanks to Rudolf Kastl)
+Patch0:		purple-facebookchat-fbchat-fix.patch
+
 %description
 This is a Facebook chat plug-in for Pidgin and libpurple
 messengers. It connects to the new Facebook Chat IM service
@@ -30,6 +33,9 @@ http://code.google.com/p/pidgin-facebookchat/wiki/XMPPDifferences
 
 %prep
 %setup -q -n pidgin-facebookchat
+
+%patch0 -p1
+
 # Upstream Makefile is totally horrible, use our own instead.
 mv Makefile Makefile.orig
 install -p %{SOURCE3} Makefile
@@ -54,7 +60,10 @@ rm -rf $RPM_BUILD_ROOT
 %{_datadir}/pixmaps/pidgin/protocols/*/facebook.png
 
 %changelog
-* Tue Jan 4 2011 Ismael Olea <ismael at olea.org> 1.69-1
+* Fri Apr 15 2011 Ismael Olea <ismael at olea.org> 1.69-2
+- pre-release patch fix for chat incompatibility from trunk (Thanks to Rudolf Kastl)
+
+* Tue Jan 4 2011 Ismael Olea <ismael at olea.org> 1.69-1[A
 - updating to 1.69
 - added zlib-devel dependency
 


More information about the scm-commits mailing list