changeset 29642:e81b708a8986

propagate from branch 'im.pidgin.pidgin' (head 7bdc0d34e54e09101ba68ba39703a8fd5081e8eb) to branch 'im.pidgin.cpw.attention_ui' (head a3a3ff8b7620f28f0d050e0edb1794384b43f486)
author Marcus Lundblad <ml@update.uu.se>
date Mon, 27 Oct 2008 23:08:32 +0000
parents 2a4f96dc074e (diff) a5b5391ab963 (current diff)
children bb9f7ba4f299
files
diffstat 23 files changed, 335 insertions(+), 172 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Oct 20 21:30:36 2008 +0000
+++ b/ChangeLog	Mon Oct 27 23:08:32 2008 +0000
@@ -1,6 +1,12 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
 version 2.5.3 (??/??/????):
+	libpurple:
+	* Fix an error with MSN offline messages by shipping the *new*
+	  "Microsoft Secure Server Authority" and the
+	  "Microsoft Internet Authority" certificates.  People that use
+	  --with-system-ssl-certs and GnuTLS need to include these in the
+	  system certs directory.
 
 version 2.5.2 (10/19/2008):
 	libpurple:
--- a/configure.ac	Mon Oct 20 21:30:36 2008 +0000
+++ b/configure.ac	Mon Oct 27 23:08:32 2008 +0000
@@ -74,7 +74,7 @@
 
 AC_CANONICAL_SYSTEM
 AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE([dist-bzip2])
+AM_INIT_AUTOMAKE([1.9 -Wno-portability dist-bzip2])
 
 PURPLE_MAJOR_VERSION=purple_major_version
 PURPLE_MINOR_VERSION=purple_minor_version
--- a/finch/gntblist.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/finch/gntblist.c	Mon Oct 27 23:08:32 2008 +0000
@@ -1288,6 +1288,17 @@
 }
 
 static void
+toggle_show_offline(GntMenuItem *item, gpointer buddy)
+{
+	purple_blist_node_set_bool(buddy, "show_offline",
+			!purple_blist_node_get_bool(buddy, "show_offline"));
+	if (!ggblist->manager->can_add_node(buddy))
+		node_remove(purple_get_blist(), buddy);
+	else
+		node_update(purple_get_blist(), buddy);
+}
+
+static void
 create_buddy_menu(GntMenu *menu, PurpleBuddy *buddy)
 {
 	PurpleAccount *account;
@@ -1322,10 +1333,10 @@
 	gnt_menuitem_set_callback(item, toggle_block_buddy, buddy);
 	gnt_menu_add_item(menu, item);
 
-#if 0
-	add_custom_action(tree, _("View Log"),
-			PURPLE_CALLBACK(finch_blist_view_log_cb)), buddy);
-#endif
+	item = gnt_menuitem_check_new(_("Show when offline"));
+	gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), purple_blist_node_get_bool((PurpleBlistNode*)buddy, "show_offline"));
+	gnt_menuitem_set_callback(item, toggle_show_offline, buddy);
+	gnt_menu_add_item(menu, item);
 
 	/* Protocol actions */
 	append_proto_menu(menu,
--- a/libpurple/circbuffer.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/circbuffer.c	Mon Oct 27 23:08:32 2008 +0000
@@ -109,13 +109,12 @@
 	else
 		len_stored = len;
 
-	memcpy(buf->inptr, src, len_stored);
+	if (len_stored > 0)
+		memcpy(buf->inptr, src, len_stored);
 
 	if (len_stored < len) {
 		memcpy(buf->buffer, (char*)src + len_stored, len - len_stored);
 		buf->inptr = buf->buffer + (len - len_stored);
-	} else if ((buf->buffer - buf->inptr) == len_stored) {
-		buf->inptr = buf->buffer;
 	} else {
 		buf->inptr += len_stored;
 	}
--- a/libpurple/core.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/core.c	Mon Oct 27 23:08:32 2008 +0000
@@ -361,7 +361,7 @@
 #endif
 	if (g_rename(path, new_name))
 	{
-		purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at http://developer.pidgin.im\n",
+		purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 		                   path, new_name, g_strerror(errno));
 		g_free(new_name);
 		return FALSE;
@@ -374,7 +374,7 @@
 	old_name = g_build_filename(old_base, basename, NULL);
 	if (symlink(new_name, old_name))
 	{
-		purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n",
+		purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 		                     old_name, new_name, g_strerror(errno));
 	}
 	g_free(old_name);
@@ -430,7 +430,7 @@
 	{
 		if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
 		{
-			purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n",
+			purple_debug_error("core", "Error creating directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 			                   user_dir, g_strerror(errno));
 			g_free(status_file);
 			g_free(old_user_dir);
@@ -442,7 +442,7 @@
 	 * incomplete migrations and properly retry. */
 	if (!(fp = g_fopen(status_file, "w")))
 	{
-		purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n",
+		purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 		                   status_file, g_strerror(errno));
 		g_free(status_file);
 		g_free(old_user_dir);
@@ -454,7 +454,7 @@
 	err = NULL;
 	if (!(dir = g_dir_open(old_user_dir, 0, &err)))
 	{
-		purple_debug_error("core", "Error opening directory %s: %s. Please report this at http://developer.pidgin.im\n",
+		purple_debug_error("core", "Error opening directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 		                   status_file,
 		                   (err ? err->message : "Unknown error"));
 		if (err)
@@ -483,7 +483,7 @@
 				if ((link = g_file_read_link(name, &err)) == NULL)
 				{
 					char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL);
-					purple_debug_error("core", "Error reading symlink %s: %s. Please report this at http://developer.pidgin.im\n",
+					purple_debug_error("core", "Error reading symlink %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 					                   name_utf8 ? name_utf8 : name, err->message);
 					g_free(name_utf8);
 					g_error_free(err);
@@ -500,7 +500,7 @@
 				if ((linklen = readlink(name, buf, sizeof(buf) - 1) == -1))
 				{
 					char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL);
-					purple_debug_error("core", "Error reading symlink %s: %s. Please report this at http://developer.pidgin.im\n",
+					purple_debug_error("core", "Error reading symlink %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 					                   name_utf8, g_strerror(errno));
 					g_free(name_utf8);
 					g_free(name);
@@ -538,7 +538,7 @@
 				 * guaranteed.  Oh well. */
 				if (symlink(link, logs_dir))
 				{
-					purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n",
+					purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 					                   logs_dir, link, g_strerror(errno));
 					g_free(link);
 					g_free(name);
@@ -577,7 +577,7 @@
 				err = NULL;
 				if (!(icons_dir = g_dir_open(name, 0, &err)))
 				{
-					purple_debug_error("core", "Error opening directory %s: %s. Please report this at http://developer.pidgin.im\n",
+					purple_debug_error("core", "Error opening directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 					                   name,
 					                   (err ? err->message : "Unknown error"));
 					if (err)
@@ -595,7 +595,7 @@
 				{
 					if (g_mkdir(new_icons_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
 					{
-						purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n",
+						purple_debug_error("core", "Error creating directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 						                   new_icons_dir, g_strerror(errno));
 						g_free(new_icons_dir);
 						g_dir_close(icons_dir);
@@ -658,7 +658,7 @@
 
 			if (!(fp = g_fopen(name, "rb")))
 			{
-				purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at http://developer.pidgin.im\n",
+				purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 				                   name, g_strerror(errno));
 				g_free(name);
 				g_dir_close(dir);
@@ -670,7 +670,7 @@
 			new_name = g_build_filename(user_dir, entry, NULL);
 			if (!(new_file = g_fopen(new_name, "wb")))
 			{
-				purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n",
+				purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 				                   new_name, g_strerror(errno));
 				fclose(fp);
 				g_free(new_name);
@@ -689,7 +689,7 @@
 				size = fread(buf, 1, sizeof(buf), fp);
 				if (size != sizeof(buf) && !feof(fp))
 				{
-					purple_debug_error("core", "Error reading %s: %s. Please report this at http://developer.pidgin.im\n",
+					purple_debug_error("core", "Error reading %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 					                   name, g_strerror(errno));
 					fclose(new_file);
 					fclose(fp);
@@ -703,7 +703,7 @@
 
 				if (!fwrite(buf, size, 1, new_file) && ferror(new_file) != 0)
 				{
-					purple_debug_error("core", "Error writing %s: %s. Please report this at http://developer.pidgin.im\n",
+					purple_debug_error("core", "Error writing %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 					                   new_name, g_strerror(errno));
 					fclose(new_file);
 					fclose(fp);
@@ -718,7 +718,7 @@
 
 			if (fclose(new_file))
 			{
-				purple_debug_error("core", "Error writing: %s: %s. Please report this at http://developer.pidgin.im\n",
+				purple_debug_error("core", "Error writing: %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 				                   new_name, g_strerror(errno));
 			}
 			if (fclose(fp))
@@ -737,7 +737,7 @@
 	/* The migration was successful, so delete the status file. */
 	if (g_unlink(status_file))
 	{
-		purple_debug_error("core", "Error unlinking file %s: %s. Please report this at http://developer.pidgin.im\n",
+		purple_debug_error("core", "Error unlinking file %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
 		                   status_file, g_strerror(errno));
 		g_free(status_file);
 		return FALSE;
--- a/libpurple/network.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/network.c	Mon Oct 27 23:08:32 2008 +0000
@@ -66,6 +66,8 @@
 static DBusGConnection *nm_conn = NULL;
 static DBusGProxy *nm_proxy = NULL;
 static DBusGProxy *dbus_proxy = NULL;
+static NMState nm_state = NM_STATE_UNKNOWN;
+static gboolean have_nm_state = FALSE;
 
 #elif defined _WIN32
 static int current_network_count;
@@ -596,13 +598,15 @@
 purple_network_is_available(void)
 {
 #ifdef HAVE_NETWORKMANAGER
-	NMState state = nm_get_network_state();
-	if (state == NM_STATE_UNKNOWN)
+	if (!have_nm_state)
 	{
-		purple_debug_warning("network", "NetworkManager not active. Assuming connection exists.\n");
-		return TRUE;
+		have_nm_state = TRUE;
+		nm_state = nm_get_network_state();
+		if (nm_state == NM_STATE_UNKNOWN)
+			purple_debug_warning("network", "NetworkManager not active. Assuming connection exists.\n");
 	}
-	else if (state == NM_STATE_CONNECTED)
+
+	if (nm_state == NM_STATE_UNKNOWN || nm_state == NM_STATE_CONNECTED)
 		return TRUE;
 
 	return FALSE;
@@ -618,9 +622,12 @@
 static void
 nm_update_state(NMState state)
 {
-	static NMState prev = NM_STATE_UNKNOWN;
+	NMState prev = nm_state;
 	PurpleConnectionUiOps *ui_ops = purple_connections_get_ui_ops();
 
+	have_nm_state = TRUE;
+	nm_state = state;
+
 	purple_signal_emit(purple_network_get_handle(), "network-configuration-changed", NULL);
 
 	switch(state)
@@ -630,16 +637,14 @@
 			res_init();
 			if (ui_ops != NULL && ui_ops->network_connected != NULL)
 				ui_ops->network_connected();
-			prev = state;
 			break;
 		case NM_STATE_ASLEEP:
 		case NM_STATE_CONNECTING:
 		case NM_STATE_DISCONNECTED:
-			if (prev != NM_STATE_CONNECTED)
+			if (prev != NM_STATE_CONNECTED && prev != NM_STATE_UNKNOWN)
 				break;
 			if (ui_ops != NULL && ui_ops->network_disconnected != NULL)
 				ui_ops->network_disconnected();
-			prev = state;
 			break;
 		case NM_STATE_UNKNOWN:
 		default:
@@ -664,7 +669,6 @@
 		return NM_STATE_UNKNOWN;
 
 	if (!dbus_g_proxy_call(nm_proxy, "state", &err, G_TYPE_INVALID, G_TYPE_UINT, &state, G_TYPE_INVALID)) {
-		/* XXX: Print an error? */
 		g_error_free(err);
 		return NM_STATE_UNKNOWN;
 	}
--- a/libpurple/plugins/ssl/Makefile.am	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/plugins/ssl/Makefile.am	Mon Oct 27 23:08:32 2008 +0000
@@ -9,10 +9,31 @@
 
 if PLUGINS
 
+# I'm sorry to report that Automake Conditionals don't support
+#   if USE_GNUTLS && USE_NSS
+# but only support testing a single variable. Hence:
+
+if USE_GNUTLS
+if USE_NSS
 plugin_LTLIBRARIES = \
 	ssl.la           \
 	ssl-gnutls.la    \
 	ssl-nss.la
+else
+plugin_LTLIBRARIES = \
+	ssl.la           \
+	ssl-gnutls.la
+endif
+else
+if USE_NSS
+plugin_LTLIBRARIES = \
+	ssl.la           \
+	ssl-nss.la
+else
+plugin_LTLIBRARIES = \
+	ssl.la
+endif
+endif
 
 ssl_la_SOURCES        = ssl.c
 ssl_gnutls_la_SOURCES = ssl-gnutls.c
--- a/libpurple/plugins/ssl/ssl-gnutls.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/plugins/ssl/ssl-gnutls.c	Mon Oct 27 23:08:32 2008 +0000
@@ -29,8 +29,6 @@
 
 #define SSL_GNUTLS_PLUGIN_ID "ssl-gnutls"
 
-#ifdef HAVE_GNUTLS
-
 #include <gnutls/gnutls.h>
 #include <gnutls/x509.h>
 
@@ -943,12 +941,9 @@
 	NULL
 };
 
-#endif /* HAVE_GNUTLS */
-
 static gboolean
 plugin_load(PurplePlugin *plugin)
 {
-#ifdef HAVE_GNUTLS
 	if(!purple_ssl_get_ops()) {
 		purple_ssl_set_ops(&ssl_ops);
 	}
@@ -960,21 +955,16 @@
 	purple_certificate_register_scheme( &x509_gnutls );
 
 	return TRUE;
-#else
-	return FALSE;
-#endif
 }
 
 static gboolean
 plugin_unload(PurplePlugin *plugin)
 {
-#ifdef HAVE_GNUTLS
 	if(purple_ssl_get_ops() == &ssl_ops) {
 		purple_ssl_set_ops(NULL);
 	}
 
 	purple_certificate_unregister_scheme( &x509_gnutls );
-#endif
 
 	return TRUE;
 }
--- a/libpurple/plugins/ssl/ssl-nss.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/plugins/ssl/ssl-nss.c	Mon Oct 27 23:08:32 2008 +0000
@@ -29,8 +29,6 @@
 
 #define SSL_NSS_PLUGIN_ID "ssl-nss"
 
-#ifdef HAVE_NSS
-
 #undef HAVE_LONG_LONG /* Make Mozilla less angry. If angry, Mozilla SMASH! */
 
 #include <nspr.h>
@@ -891,13 +889,10 @@
 	NULL
 };
 
-#endif /* HAVE_NSS */
-
 
 static gboolean
 plugin_load(PurplePlugin *plugin)
 {
-#ifdef HAVE_NSS
 	if (!purple_ssl_get_ops()) {
 		purple_ssl_set_ops(&ssl_ops);
 	}
@@ -909,22 +904,17 @@
 	purple_certificate_register_scheme(&x509_nss);
 
 	return TRUE;
-#else
-	return FALSE;
-#endif
 }
 
 static gboolean
 plugin_unload(PurplePlugin *plugin)
 {
-#ifdef HAVE_NSS
 	if (purple_ssl_get_ops() == &ssl_ops) {
 		purple_ssl_set_ops(NULL);
 	}
 
 	/* Unregister our X.509 functions */
 	purple_certificate_unregister_scheme(&x509_nss);
-#endif
 
 	return TRUE;
 }
--- a/libpurple/protocols/jabber/iq.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/protocols/jabber/iq.c	Mon Oct 27 23:08:32 2008 +0000
@@ -105,8 +105,7 @@
 
 void jabber_iq_set_id(JabberIq *iq, const char *id)
 {
-	if(iq->id)
-		g_free(iq->id);
+	g_free(iq->id);
 
 	if(id) {
 		xmlnode_set_attrib(iq->node, "id", id);
@@ -320,9 +319,42 @@
 	from = xmlnode_get_attrib(packet, "from");
 	id = xmlnode_get_attrib(packet, "id");
 
+	if(type == NULL || !(!strcmp(type, "get") || !strcmp(type, "set")
+			|| !strcmp(type, "result") || !strcmp(type, "error"))) {
+		purple_debug_error("jabber", "IQ with invalid type ('%s') - ignoring.\n",
+						   type ? type : "(null)");
+		return;
+	}
+
+	/* All IQs must have an ID, so send an error for a set/get that doesn't */
+	if(!id || !*id) {
+
+		if(!strcmp(type, "set") || !strcmp(type, "get")) {
+			JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR);
+
+			xmlnode_free(iq->node);
+			iq->node = xmlnode_copy(packet);
+			xmlnode_set_attrib(iq->node, "to", from);
+			xmlnode_remove_attrib(iq->node, "from");
+			xmlnode_set_attrib(iq->node, "type", "error");
+			/* This id is clearly not useful, but we must put something there for a valid stanza */
+			iq->id = jabber_get_next_id(js);
+			xmlnode_set_attrib(iq->node, "id", iq->id);
+			error = xmlnode_new_child(iq->node, "error");
+			xmlnode_set_attrib(error, "type", "modify");
+			x = xmlnode_new_child(error, "bad-request");
+			xmlnode_set_namespace(x, "urn:ietf:params:xml:ns:xmpp-stanzas");
+
+			jabber_iq_send(iq);
+		} else
+			purple_debug_error("jabber", "IQ of type '%s' missing id - ignoring.\n", type);
+
+		return;
+	}
+
 	/* First, lets see if a special callback got registered */
 
-	if(type && (!strcmp(type, "result") || !strcmp(type, "error"))) {
+	if(!strcmp(type, "result") || !strcmp(type, "error")) {
 		if(id && *id && (jcd = g_hash_table_lookup(js->iq_callbacks, id))) {
 			jcd->callback(js, packet, jcd->data);
 			jabber_iq_remove_callback_by_id(js, id);
@@ -332,7 +364,7 @@
 
 	/* Apparently not, so lets see if we have a pre-defined handler */
 
-	if(type && query && (xmlns = xmlnode_get_namespace(query))) {
+	if(query && (xmlns = xmlnode_get_namespace(query))) {
 		if((jih = g_hash_table_lookup(iq_handlers, xmlns))) {
 			jih(js, packet);
 			return;
@@ -348,7 +380,7 @@
 		jabber_gmail_poke(js, packet);
 		return;
 	}
-	
+
 	purple_debug_info("jabber", "jabber_iq_parse\n");
 
 	if(xmlnode_get_child_with_namespace(packet, "ping", "urn:xmpp:ping")) {
@@ -362,7 +394,7 @@
 	}
 
 	/* If we get here, send the default error reply mandated by XMPP-CORE */
-	if(type && (!strcmp(type, "set") || !strcmp(type, "get"))) {
+	if(!strcmp(type, "set") || !strcmp(type, "get")) {
 		JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR);
 
 		xmlnode_free(iq->node);
--- a/libpurple/proxy.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/proxy.c	Mon Oct 27 23:08:32 2008 +0000
@@ -2152,6 +2152,8 @@
 			break;
 
 		default:
+			purple_debug_error("proxy", "Invalid Proxy type (%d) specified.\n",
+							   purple_proxy_info_get_type(connect_data->gpi));
 			purple_proxy_connect_data_destroy(connect_data);
 			return NULL;
 	}
@@ -2160,6 +2162,7 @@
 			connectport, connection_host_resolved, connect_data);
 	if (connect_data->query_data == NULL)
 	{
+		purple_debug_error("proxy", "dns query failed unexpectedly.\n");
 		purple_proxy_connect_data_destroy(connect_data);
 		return NULL;
 	}
--- a/libpurple/prpl.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/prpl.c	Mon Oct 27 23:08:32 2008 +0000
@@ -23,6 +23,7 @@
 #include "internal.h"
 #include "conversation.h"
 #include "debug.h"
+#include "network.h"
 #include "notify.h"
 #include "prpl.h"
 #include "request.h"
@@ -317,7 +318,8 @@
 	PurplePluginProtocolInfo *prpl_info;
 
 	if (purple_status_is_online(new_status) &&
-		purple_account_is_disconnected(account))
+		purple_account_is_disconnected(account) &&
+		purple_network_is_available())
 	{
 		purple_account_connect(account);
 		return;
--- a/libpurple/server.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/server.c	Mon Oct 27 23:08:32 2008 +0000
@@ -261,14 +261,18 @@
 		conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, b->name, account);
 		if(conv != NULL && alias != NULL && strcmp(alias, who))
 		{
+			char *escaped = g_markup_escape_text(who, -1);
+			char *escaped2 = g_markup_escape_text(alias, -1);
 			char *tmp = g_strdup_printf(_("%s is now known as %s.\n"),
-										who, alias);
+										escaped, escaped2);
 
 			purple_conversation_write(conv, NULL, tmp,
 					PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LINKIFY,
 					time(NULL));
 
 			g_free(tmp);
+			g_free(escaped2);
+			g_free(escaped);
 		}
 	}
 }
--- a/libpurple/util.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/libpurple/util.c	Mon Oct 27 23:08:32 2008 +0000
@@ -3979,6 +3979,13 @@
 					     callback, user_data);
 }
 
+static gboolean
+url_fetch_connect_failed(gpointer data)
+{
+	url_fetch_connect_cb(data, -1, "");
+	return FALSE;
+}
+
 PurpleUtilFetchUrlData *
 purple_util_fetch_url_request_len(const char *url, gboolean full,
 		const char *user_agent, gboolean http11,
@@ -4016,9 +4023,8 @@
 
 	if (gfud->connect_data == NULL)
 	{
-		purple_util_fetch_url_error(gfud, _("Unable to connect to %s"),
-				gfud->website.address);
-		return NULL;
+		/* Trigger the connect_cb asynchronously. */
+		purple_timeout_add(10, url_fetch_connect_failed, gfud);
 	}
 
 	return gfud;
--- a/pidgin.spec.in	Mon Oct 20 21:30:36 2008 +0000
+++ b/pidgin.spec.in	Mon Oct 27 23:08:32 2008 +0000
@@ -263,6 +263,7 @@
 rm -f $RPM_BUILD_ROOT%{_libdir}/purple-2/libjabber.so
 rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
 rm -f $RPM_BUILD_ROOT%{perl_archlib}/perllocal.pod
+find $RPM_BUILD_ROOT -type f -name '*.a' -exec rm -f {} ';'
 find $RPM_BUILD_ROOT -type f -name .packlist -exec rm -f {} ';'
 find $RPM_BUILD_ROOT -type f -name '*.bs' -empty -exec rm -f {} ';'
 
--- a/pidgin/gtkconn.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/pidgin/gtkconn.c	Mon Oct 27 23:08:32 2008 +0000
@@ -208,9 +208,7 @@
 	while (l) {
 		PurpleAccount *a = (PurpleAccount*)l->data;
 		if (!purple_account_is_disconnected(a)) {
-			purple_connection_error_reason(purple_account_get_connection(a),
-			                               PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-			                               _("Network disconnected"));
+			purple_account_disconnect(a);
 		}
 		l = l->next;
 	}
--- a/pidgin/gtkdialogs.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/pidgin/gtkdialogs.c	Mon Oct 27 23:08:32 2008 +0000
@@ -69,37 +69,35 @@
 
 /* Order: Alphabetical by Last Name */
 static const struct developer developers[] = {
-	{"Daniel 'datallah' Atallah",	N_("developer"), NULL},
-	{"John 'rekkanoryo' Bailey",	N_("developer"), NULL},
-	{"Ethan 'Paco-Paco' Blanton",	N_("developer"), NULL},
-	{"Thomas Butter",				N_("developer"), NULL},
+	{"Daniel 'datallah' Atallah",	NULL, NULL},
+	{"John 'rekkanoryo' Bailey",	N_("bug master"), NULL},
+	{"Ethan 'Paco-Paco' Blanton",	NULL, NULL},
+	{"Hylke Bons",			N_("artist"), "h.bons@student.rug.nl"},
+	{"Thomas Butter",				NULL, NULL},
 	/* feel free to not translate this */
-	{N_("Ka-Hing Cheung"),			N_("developer"), NULL},
-	{"Sadrul Habib Chowdhury",		N_("developer"), NULL},
-	{"Mark 'KingAnt' Doliner",		N_("developer"), "mark@kingant.net"},
-	{"Sean Egan",					N_("developer"), "sean.egan@gmail.com"},
-	{"Casey Harkins",               N_("developer"),   NULL},
-	{"Gary 'grim' Kramlich",		N_("developer"), NULL},
-	{"Richard 'rlaager' Laager",	N_("developer"), NULL},
-	{"Richard 'wabz' Nelson",		N_("developer"), NULL},
-	{"Christopher 'siege' O'Brien", N_("developer"), "taliesein@users.sf.net"},
-	{"Bartosz Oler",		N_("developer"), NULL},
-	{"Etan 'deryni' Reisner",       N_("developer"), NULL},
-	{"Tim 'marv' Ringenbach",		N_("developer"), NULL},
-	{"Elliott 'QuLogic' Sales de Andrade",	N_("developer"),	NULL},
+	{N_("Ka-Hing Cheung"),			NULL, NULL},
+	{"Sadrul Habib Chowdhury",		NULL, NULL},
+	{"Mark 'KingAnt' Doliner",		NULL, "mark@kingant.net"},
+	{"Sean Egan",					NULL, "sean.egan@gmail.com"},
+	{"Casey Harkins",               NULL,   NULL},
+	{"Gary 'grim' Kramlich",		NULL, NULL},
+	{"Richard 'rlaager' Laager",	NULL, NULL},
+	{"Richard 'wabz' Nelson",		NULL, NULL},
+	{"Christopher 'siege' O'Brien", NULL, "taliesein@users.sf.net"},
+	{"Bartosz Oler",		NULL, NULL},
+	{"Etan 'deryni' Reisner",       NULL, NULL},
+	{"Tim 'marv' Ringenbach",		NULL, NULL},
+	{"Elliott 'QuLogic' Sales de Andrade",	NULL,	NULL},
 	{"Luke 'LSchiere' Schierer",	N_("support"), "lschiere@users.sf.net"},
-	{"Megan 'Cae' Schneider",       N_("support/QA"), NULL},
-	{"Evan Schoenberg",		N_("developer"), NULL},
-	{"Kevin 'SimGuy' Stange",	N_("developer & webmaster"),	NULL},
-	{"Will 'resiak' Thompson",	N_("developer"),	NULL},
-	{"Stu 'nosnilmot' Tomlinson",	N_("developer"), NULL},
-	{"Nathan 'faceprint' Walp",		N_("developer"), NULL},
+	{"Evan Schoenberg",		NULL, NULL},
+	{"Kevin 'SimGuy' Stange",	N_("webmaster"),	NULL},
+	{"Will 'resiak' Thompson",	NULL,	NULL},
+	{"Stu 'nosnilmot' Tomlinson",	NULL, NULL},
 	{NULL, NULL, NULL}
 };
 
 /* Order: Alphabetical by Last Name */
 static const struct developer patch_writers[] = {
-	{"Felipe 'shx' Contreras",		NULL,	NULL},
 	{"Marcus 'malu' Lundblad", NULL, NULL},
 	{"Dennis 'EvilDennisR' Ristuccia",	N_("Senior Contributor/QA"),	NULL},
 	{"Peter 'Fmoo' Ruibal",		NULL,	NULL},
@@ -114,17 +112,20 @@
 	{"Jim Duchek",			N_("maintainer"), "jim@linuxpimps.com"},
 	{"Rob Flynn",			N_("maintainer"), NULL},
 	{"Adam Fritzler",		N_("libfaim maintainer"), NULL},
-	{"Christian 'ChipX86' Hammond",	N_("developer & webmaster"), NULL},
+	{"Christian 'ChipX86' Hammond",	N_("webmaster"), NULL},
 	/* If "lazy bum" translates literally into a serious insult, use something else or omit it. */
 	{"Syd Logan",			N_("hacker and designated driver [lazy bum]"), NULL},
-	{"Jim Seymour",			N_("XMPP developer"), NULL},
+	{"Megan 'Cae' Schneider",       N_("support/QA"), NULL},
+	{"Jim Seymour",			N_("XMPP"), NULL},
 	{"Mark Spencer",		N_("original author"), "markster@marko.net"},
+	{"Nathan 'faceprint' Walp",		NULL, NULL},
 	{"Eric Warmenhoven",	N_("lead developer"), "warmenhoven@yahoo.com"},
 	{NULL, NULL, NULL}
 };
 
 /* Order: Alphabetical by Last Name */
 static const struct developer retired_patch_writers[] = {
+	{"Felipe 'shx' Contreras",		NULL,	NULL},
 	{"Decklin Foster",				NULL,	NULL},
 	{"Peter 'Bleeter' Lawler",      NULL,   NULL},
 	{"Robert 'Robot101' McQueen",	NULL,	NULL},
@@ -193,7 +194,7 @@
 	{N_("Macedonian"),          "mk", "Arangel Angov ", "arangel@linux.net.mk"},
 	{N_("Macedonian"),          "mk", "Ivana Kirkovska", "ivana.kirkovska@gmail.com"},
 	{N_("Macedonian"),          "mk", "Jovan Naumovski", "jovan@lugola.net"},
-	{"Mongolian",               "mn", "gooyo"},
+	{"Mongolian",               "mn", "gooyo", NULL},
 	{N_("Bokmål Norwegian"),    "nb", "Espen Stefansen", "espenas@gmail.com"},
 	{N_("Nepali"),              "ne", "Shyam Krishna Bal", "shyamkrishna_bal@yahoo.com"},
 	{N_("Dutch, Flemish"),      "nl", "Vincent van Adrighem", "V.vanAdrighem@dirck.mine.nu"},
@@ -285,11 +286,6 @@
 	{NULL, NULL, NULL, NULL}
 };
 
-static const struct artist artists[] = {
-	{"Hylke Bons",	"h.bons@student.rug.nl"},
-	{NULL, NULL}
-};
-
 void
 pidgin_dialogs_destroy_all()
 {
@@ -428,12 +424,17 @@
 						   _("Current Developers"));
 	for (i = 0; developers[i].name != NULL; i++) {
 		if (developers[i].email != NULL) {
-			g_string_append_printf(str, "  %s (%s) &lt;<a href=\"mailto:%s\">%s</a>&gt;<br/>",
-					_(developers[i].name), _(developers[i].role),
-					developers[i].email, developers[i].email);
+			g_string_append_printf(str, "  <a href=\"mailto:%s\">%s</a>%s%s%s<br/>",
+					developers[i].email, _(developers[i].name),
+					developers[i].role ? " (" : "",
+					developers[i].role ? _(developers[i].role) : "",
+					developers[i].role ? ")" : "");
 		} else {
-			g_string_append_printf(str, "  %s (%s)<br/>",
-					_(developers[i].name), _(developers[i].role));
+			g_string_append_printf(str, "  %s%s%s%s<br/>",
+					_(developers[i].name),
+					developers[i].role ? " (" : "",
+					developers[i].role ? _(developers[i].role) : "",
+					developers[i].role ? ")" : "");
 		}
 	}
 	g_string_append(str, "<BR/>");
@@ -443,12 +444,17 @@
 						   _("Crazy Patch Writers"));
 	for (i = 0; patch_writers[i].name != NULL; i++) {
 		if (patch_writers[i].email != NULL) {
-			g_string_append_printf(str, "  %s &lt;<a href=\"mailto:%s\">%s</a>&gt;<br/>",
-					patch_writers[i].name,
-					patch_writers[i].email, patch_writers[i].email);
+			g_string_append_printf(str, "  <a href=\"mailto:%s\">%s</a>%s%s%s<br/>",
+					patch_writers[i].email, _(patch_writers[i].name),
+					patch_writers[i].role ? " (" : "",
+					patch_writers[i].role ? _(patch_writers[i].role) : "",
+					patch_writers[i].role ? ")" : "");
 		} else {
-			g_string_append_printf(str, "  %s<br/>",
-					patch_writers[i].name);
+			g_string_append_printf(str, "  %s%s%s%s<br/>",
+					_(patch_writers[i].name),
+					patch_writers[i].role ? " (" : "",
+					patch_writers[i].role ? _(patch_writers[i].role) : "",
+					patch_writers[i].role ? ")" : "");
 		}
 	}
 	g_string_append(str, "<BR/>");
@@ -458,12 +464,17 @@
 						   _("Retired Developers"));
 	for (i = 0; retired_developers[i].name != NULL; i++) {
 		if (retired_developers[i].email != NULL) {
-			g_string_append_printf(str, "  %s (%s) &lt;<a href=\"mailto:%s\">%s</a>&gt;<br/>",
-					retired_developers[i].name, _(retired_developers[i].role),
-					retired_developers[i].email, retired_developers[i].email);
+			g_string_append_printf(str, "  <a href=\"mailto:%s\">%s</a>%s%s%s<br/>",
+					retired_developers[i].email, _(retired_developers[i].name),
+					retired_developers[i].role ? " (" : "",
+					retired_developers[i].role ? _(retired_developers[i].role) : "",
+					retired_developers[i].role ? ")" : "");
 		} else {
-			g_string_append_printf(str, "  %s (%s)<br/>",
-					retired_developers[i].name, _(retired_developers[i].role));
+			g_string_append_printf(str, "  %s%s%s%s<br/>",
+					_(retired_developers[i].name),
+					retired_developers[i].role ? " (" : "",
+					retired_developers[i].role ? _(retired_developers[i].role) : "",
+					retired_developers[i].role ? ")" : "");
 		}
 	}
 	g_string_append(str, "<BR/>");
@@ -473,42 +484,31 @@
 						   _("Retired Crazy Patch Writers"));
 	for (i = 0; retired_patch_writers[i].name != NULL; i++) {
 		if (retired_patch_writers[i].email != NULL) {
-			g_string_append_printf(str, "  %s &lt;<a href=\"mailto:%s\">%s</a>&gt;<br/>",
-					retired_patch_writers[i].name,
-					retired_patch_writers[i].email, retired_patch_writers[i].email);
+			g_string_append_printf(str, "  <a href=\"mailto:%s\">%s</a>%s%s%s<br/>",
+					retired_patch_writers[i].email, _(retired_patch_writers[i].name),
+					retired_patch_writers[i].role ? " (" : "",
+					retired_patch_writers[i].role ? _(retired_patch_writers[i].role) : "",
+					retired_patch_writers[i].role ? ")" : "");
 		} else {
-			g_string_append_printf(str, "  %s<br/>",
-					retired_patch_writers[i].name);
+			g_string_append_printf(str, "  %s%s%s%s<br/>",
+					_(retired_patch_writers[i].name),
+					retired_patch_writers[i].role ? " (" : "",
+					retired_patch_writers[i].role ? _(retired_patch_writers[i].role) : "",
+					retired_patch_writers[i].role ? ")" : "");
 		}
 	}
 	g_string_append(str, "<BR/>");
-
-	/* Artists */
-        g_string_append_printf(str, "<FONT SIZE=\"4\">%s:</FONT><BR/>",
-                                                   _("Artists"));
-        for (i = 0; artists[i].name != NULL; i++) {
-        	if (artists[i].email != NULL) {
-			g_string_append_printf(str, "  %s &lt;<a href=\"mailto:%s\">%s</a>&gt;<br/>",
-			                           artists[i].name,
-			                           artists[i].email, artists[i].email);
-	        } else {
-	                g_string_append_printf(str, "  %s<br/>",
-	                                      artists[i].name);
-	        }
-	}
-	g_string_append(str, "<BR/>");
 			
 	/* Current Translators */
 	g_string_append_printf(str, "<FONT SIZE=\"4\">%s:</FONT><BR/>",
 						   _("Current Translators"));
 	for (i = 0; current_translators[i].language != NULL; i++) {
 		if (current_translators[i].email != NULL) {
-			g_string_append_printf(str, "  <b>%s (%s)</b> - %s &lt;<a href=\"mailto:%s\">%s</a>&gt;<br/>",
+			g_string_append_printf(str, "  <b>%s (%s)</b> - <a href=\"mailto:%s\">%s</a><br/>",
 							_(current_translators[i].language),
 							current_translators[i].abbr,
-							_(current_translators[i].name),
 							current_translators[i].email,
-							current_translators[i].email);
+							_(current_translators[i].name));
 		} else {
 			g_string_append_printf(str, "  <b>%s (%s)</b> - %s<br/>",
 							_(current_translators[i].language),
@@ -523,12 +523,11 @@
 						   _("Past Translators"));
 	for (i = 0; past_translators[i].language != NULL; i++) {
 		if (past_translators[i].email != NULL) {
-			g_string_append_printf(str, "  <b>%s (%s)</b> - %s &lt;<a href=\"mailto:%s\">%s</a>&gt;<br/>",
+			g_string_append_printf(str, "  <b>%s (%s)</b> - <a href=\"mailto:%s\">%s</a><br/>",
 							_(past_translators[i].language),
 							past_translators[i].abbr,
-							_(past_translators[i].name),
 							past_translators[i].email,
-							past_translators[i].email);
+							_(past_translators[i].name));
 		} else {
 			g_string_append_printf(str, "  <b>%s (%s)</b> - %s<br/>",
 							_(past_translators[i].language),
--- a/pidgin/gtkimhtml.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/pidgin/gtkimhtml.c	Mon Oct 27 23:08:32 2008 +0000
@@ -348,9 +348,7 @@
 			g_string_free (t->values, TRUE);
 			g_free (t->children);
 		}
-		if (t && t->image) {
-			t->image->imhtml = NULL;
-		}
+		
 		g_free (t);
 	}
 }
@@ -2522,6 +2520,78 @@
 	}
 }
 
+/* CSS colors are either rgb (x,y,z) or #hex
+ * we need to convert to hex if it is RGB */
+static gchar*
+parse_css_color(gchar *in_color)
+{
+	char *tmp = in_color;
+
+	if (*tmp == 'r' && *(++tmp) == 'g' && *(++tmp) == 'b' && *(++tmp)) {
+		int rgbval[] = {0, 0, 0};
+		int count = 0;
+		const char *v_start;
+
+		while (*tmp && g_ascii_isspace(*tmp))
+			tmp++;
+		if (*tmp != '(') {
+			/* We don't support rgba() */
+			purple_debug_warning("gtkimhtml", "Invalid rgb CSS color in '%s'!\n", in_color);
+			return in_color;
+		}
+		tmp++;
+
+		while (count < 3) {
+			/* Skip any leading spaces */
+			while (*tmp && g_ascii_isspace(*tmp))
+				tmp++;
+
+			/* Find the subsequent contiguous digits */
+			v_start = tmp;
+			if (*v_start == '-')
+				tmp++;
+			while (*tmp && g_ascii_isdigit(*tmp))
+				tmp++;
+
+			if (tmp != v_start) {
+				char prev = *tmp;
+				*tmp = '\0';
+				rgbval[count] = atoi(v_start);
+				*tmp = prev;
+
+				/* deal with % */
+				while (*tmp && g_ascii_isspace(*tmp))
+					tmp++;
+				if (*tmp == '%') {
+					rgbval[count] = (rgbval[count] / 100.0) * 255;
+					tmp++;
+				}
+			} else {
+				purple_debug_warning("gtkimhtml", "Invalid rgb CSS color in '%s'!\n", in_color);
+				return in_color;
+			}
+
+			if (rgbval[count] > 255) {
+				rgbval[count] = 255;
+			} else if (rgbval[count] < 0) {
+				rgbval[count] = 0;
+			}
+
+			while (*tmp && g_ascii_isspace(*tmp))
+				tmp++;
+			if (*tmp == ',')
+				tmp++;
+
+			count++;
+		}
+		
+		g_free(in_color);
+		return g_strdup_printf("#%02X%02X%02X", rgbval[0], rgbval[1], rgbval[2]);
+	}
+
+	return in_color;
+}
+
 void gtk_imhtml_insert_html_at_iter(GtkIMHtml        *imhtml,
                                     const gchar      *text,
                                     GtkIMHtmlOptions  options,
@@ -2982,7 +3052,7 @@
 							oldfont = fonts->data;
 
 						if (color && !(options & GTK_IMHTML_NO_COLOURS) && (imhtml->format_functions & GTK_IMHTML_FORECOLOR)) {
-							font->fore = color;
+							font->fore = parse_css_color(color);
 							gtk_imhtml_toggle_forecolor(imhtml, font->fore);
 						} else {
 							if (oldfont && oldfont->fore)
@@ -2991,7 +3061,7 @@
 						}
 
 						if (background && !(options & GTK_IMHTML_NO_COLOURS) && (imhtml->format_functions & GTK_IMHTML_BACKCOLOR)) {
-							font->back = background;
+							font->back = parse_css_color(background);
 							gtk_imhtml_toggle_backcolor(imhtml, font->back);
 						} else {
 							if (oldfont && oldfont->back)
--- a/pidgin/gtkstatusbox.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/pidgin/gtkstatusbox.c	Mon Oct 27 23:08:32 2008 +0000
@@ -397,7 +397,8 @@
 	status_box->icon_box = gtk_event_box_new();
 	gtk_widget_set_parent(status_box->icon_box, GTK_WIDGET(status_box));
 	gtk_widget_show(status_box->icon_box);
-#if 0
+
+#if GTK_CHECK_VERSION(2,12,0)
 	gtk_widget_set_tooltip_text(status_box->icon_box,
 			status_box->account ? _("Click to change your buddyicon for this account.") :
 				_("Click to change your buddyicon for all accounts."));
--- a/pidgin/plugins/notify.c	Mon Oct 20 21:30:36 2008 +0000
+++ b/pidgin/plugins/notify.c	Mon Oct 27 23:08:32 2008 +0000
@@ -766,8 +766,7 @@
 	/* Urgent method button */
 	toggle = gtk_check_button_new_with_mnemonic(_("Set window manager \"_URGENT\" hint"));
 #else
-	/* TODO: When we're not string frozen, mark for translation */
-	toggle = gtk_check_button_new_with_mnemonic("_Flash window");
+	toggle = gtk_check_button_new_with_mnemonic(_("_Flash window"));
 #endif
 	gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
--- a/share/ca-certs/Makefile.am	Mon Oct 20 21:30:36 2008 +0000
+++ b/share/ca-certs/Makefile.am	Mon Oct 27 23:08:32 2008 +0000
@@ -3,6 +3,7 @@
 		CAcert_Class3.pem \
 		Equifax_Secure_CA.pem \
 		GTE_CyberTrust_Global_Root.pem \
+		Microsoft_Internet_Authority.pem \
 		Microsoft_Secure_Server_Authority.pem \
 		StartCom_Free_SSL_CA.pem \
 		Verisign_RSA_Secure_Server_CA.pem \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/ca-certs/Microsoft_Internet_Authority.pem	Mon Oct 27 23:08:32 2008 +0000
@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIIECzCCA3SgAwIBAgIEBAAD/jANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MB4XDTA2MDQxOTE0MzUwMFoXDTA5MDQxOTIzNTkwMFowJzElMCMG
+A1UEAxMcTWljcm9zb2Z0IEludGVybmV0IEF1dGhvcml0eTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALUIbk0YdsTXnGPswqx8d/Ntrsjy8Wau8cKHBGBu
+KZwAZe5qW+QOU4gRxiKbM/trspEu1lObU77PVtiZSqFQMkXOYNLhlq1a/eqh68RJ
+Jxxev9KWmfppQ388ONqhi8wziHoXc66RUCiqabp751dbmwnnTN6GfIR952Zg+ab1
+wmGL3o7B1efCMCI9LIMKsId16yHiXKbTBHuWnkAe4Qx2BMAgoJQQ21EbTBhyvCfd
+EiRdOdYo1OTe2xih4JUPmXf7xPNDjMCrpjEJ8woxgCnH12z7PNPqwrhnFe/6808t
+axy4iNgObXcZS3ERcZBA9RFT1z3onQ2E2plkaBPmZQPiZu0CAwEAAaOCAXAwggFs
+MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVibGljLXRydXN0LmNvbS9j
+Z2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYDVR0OBBYEFDNf3Q+3nFzO7ofdcHCL
+X33PIry5MFQGA1UdIARNMEswSQYKKoZIhvhjAQIBBTA7MDkGCCsGAQUFBwIBFi1o
+dHRwOi8vd3d3LnB1YmxpYy10cnVzdC5jb20vQ1BTL09tbmlSb290Lmh0bWwwgYkG
+A1UdIwSBgTB/oXmkdzB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBv
+cmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4x
+IzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290ggIBpTAOBgNVHQ8B
+Af8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBAjANBgkqhkiG9w0BAQUFAAOBgQBj
+SQlU7cXbnngZAIOa4zci+1Z2XFTTyOFc/Tfc0qU/xVWPZPBJdx2UVk2yCwmIHFBY
+OJSQC+7Kn7GE5nE3rBAyBrnB0oymBcBeD8tT3B4B31jHfnFgsC9UYin9uJN144+e
+tbzOegUg4qaNApAaWGre3YY7ALn1y/6XgqIEIEZcCQ==
+-----END CERTIFICATE-----
--- a/share/ca-certs/Microsoft_Secure_Server_Authority.pem	Mon Oct 20 21:30:36 2008 +0000
+++ b/share/ca-certs/Microsoft_Secure_Server_Authority.pem	Mon Oct 27 23:08:32 2008 +0000
@@ -1,28 +1,30 @@
 -----BEGIN CERTIFICATE-----
-MIIE1TCCA72gAwIBAgIKYSsApAADAAAAFDANBgkqhkiG9w0BAQUFADAnMSUwIwYD
-VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTA2MDQyMTE5MTEw
-NFoXDTA5MDQxOTIzNTkwMFowgYsxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ
+MIIFEzCCA/ugAwIBAgIKYQVOAQADAAAAHDANBgkqhkiG9w0BAQUFADAnMSUwIwYD
+VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTA3MDkyODIyMDYz
+N1oXDTA5MDQxOTIzNTkwMFowgYsxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ
 kiaJk/IsZAEZFgltaWNyb3NvZnQxFDASBgoJkiaJk/IsZAEZFgRjb3JwMRcwFQYK
 CZImiZPyLGQBGRYHcmVkbW9uZDEqMCgGA1UEAxMhTWljcm9zb2Z0IFNlY3VyZSBT
 ZXJ2ZXIgQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-syn2tJzCJKsQy98cYrzBT0qMSqTMibRel34u64jqd1GKP9cRMHagyNLZIb1rv8NZ
-XPdf2uI8hGc4lxRh4iprbFPOZSiHQIyq9zoqLS7Bh/KnqnRX4CCntCQbWVa/s5c5
-FbGD5XG5AvA8sjn56WPotYLGeWrSZ/k2bcH9YgvQ2Yrt8t1VxPQciSuX82KSn2Kx
-xxJKgQtAgZpyekR5QdIUUvQsEAPaCfWRsF/OMQoyc4UeAxAELavr2vlq869ye3Fu
-f3fUhVEk8kxtiVPYWYBTAhWts62pEwaKGPteMsGnvbX+BRgIwc55vfs6KWXxnBUL
-9Q8BfQQLbT8nQe7hO4XXMQIDAQABo4IBnDCCAZgwEgYDVR0TAQH/BAgwBgEB/wIB
-ATAdBgNVHQ4EFgQUp08F+9GOQVM3lcpL4UMfWutNzVAwCwYDVR0PBAQDAgGGMBIG
-CSsGAQQBgjcVAQQFAgMDAAMwIwYJKwYBBAGCNxUCBBYEFMnAnEM4ke3T6fpSclUI
-g7XN8o57MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFDNf
-3Q+3nFzO7ofdcHCLX33PIry5MGYGA1UdHwRfMF0wW6BZoFeGNGh0dHA6Ly9jcmwu
-bWljcm9zb2Z0LmNvbS9wa2kvbXNjb3JwL2NybC9tc3d3dygzKS5jcmyGH2h0dHA6
-Ly9jb3JwcGtpL2NybC9tc3d3dygzKS5jcmwweQYIKwYBBQUHAQEEbTBrMDwGCCsG
-AQUFBzAChjBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL21zY29ycC9tc3d3
-dygzKS5jcnQwKwYIKwYBBQUHMAKGH2h0dHA6Ly9jb3JwcGtpL2FpYS9tc3d3dygz
-KS5jcnQwDQYJKoZIhvcNAQEFBQADggEBAIJDQpkqhodC3ZmKPB4dTveoFCpuc4C0
-qdXPLggvRiTnQJP/SRdnfQwkaulDS3771zWo3fO1/tTiCmVvtU4LNbISpQmrz41q
-AP2QIUl/d4Fjiaz0qchNxmTRlVLGsTrwkMMkOh9MUQEcNyk9RuGepf/1+66qeEnx
-eCgK09yIcbgdE9ffk5ueTX7TNfgoNZO9ORnRS1p7nra3b0Wi1kdGqDmbpw7We+M8
-6B8VpPa0QaofgRdl2dzOijd7hGN+cgRNMvdGpRxzkaWUA52rBOrEVyJLu2IUksPV
-0Q/0ZZMNZXJh8MmWW/o8ebQZJQshN5p4M7HiUN/cZ2onnrdZSpIwyAU=
+xcCphW3RnMyuq1EAwlSsUghQUuCSQAaeFBTro1qbeCJEALHQGrXg8SMnY9Om64WG
+PnB9HhOb1LTOdkMVx6a3GU0mcv+LkefcW/CewIMfDXPoeGA4ULmY9wbraPwJY8Ba
+H3PAvOVSTJ0k9ZX6tXjE0D/214kn0+ZN+Y+ZwoqFC5/lgQyUxxgfVA0FsR/NDNF6
+keBsoNz2vPghAsruLhkON+5KGQo0o+T+XcJ7xNs7eJR7MWZn2rNCM1J+qrR0o2vG
+vz8QBSKogUXiPRXYVkNSkBEFZqGvEob1pDwC5fJEP71J6xEJHsSe0pcaa637RU04
+4BsjRHqJE3Rrlurb6Fc8vQIDAQABo4IB2jCCAdYwEgYDVR0TAQH/BAgwBgEB/wIB
+ATAdBgNVHQ4EFgQUmY+l9x6Bb/p5wvAWP7JUsQhoR1UwCwYDVR0PBAQDAgGGMBIG
+CSsGAQQBgjcVAQQFAgMEAAQwIwYJKwYBBAGCNxUCBBYEFBOB4Tms57aqAqhuDUms
+pmqjrALsMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFDNf
+3Q+3nFzO7ofdcHCLX33PIry5MIGjBgNVHR8EgZswgZgwgZWggZKggY+GNmh0dHA6
+Ly9tc2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3KDMpLmNy
+bIY0aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3
+KDMpLmNybIYfaHR0cDovL2NvcnBwa2kvY3JsL21zd3d3KDMpLmNybDB5BggrBgEF
+BQcBAQRtMGswPAYIKwYBBQUHMAKGMGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
+a2kvbXNjb3JwL21zd3d3KDMpLmNydDArBggrBgEFBQcwAoYfaHR0cDovL2NvcnBw
+a2kvYWlhL21zd3d3KDMpLmNydDANBgkqhkiG9w0BAQUFAAOCAQEARSzU1qmSJczv
+IiFrscxgYtzXekBWgm2rYVIqN996H5ZfMDaso0tZXmhWo0zX0z0r0H+IIGtJ+4D9
+t6dMTpB26jV/5EtMbtQu48ryCkMHBKNtCn7pQ5Mq2gqjq84KrVUlBFfPT4z4+Hqp
+Q6gVghMggWNtiujdHh7w4ja3OqHkFZTX/wUSTb+BtH+GBZKYAGU6duakb3D0piFu
+W5W6gZ4j15R12ys3ZYTKThZjW5blolA0lzuCSghoSfJHRA4jChIzDNojkf7OxqJw
+yFl8+++iZwTiulCTgOucJxGCT1tEEwdfX2c+XKyJIS/d5Ndtk91WEWU+TzqX9ZT4
+SAMJpIZ1pg==
 -----END CERTIFICATE-----