changeset 32082:bb4eaf8e70d6

propagate from branch 'im.pidgin.pidgin' (head b4610e0aa7f5df4daa5d4ad90ce8a8d80f46e0fe) to branch 'im.pidgin.pidgin.mxit' (head 8b579559174d8853ab2218dac2e81e3ba5baead2)
author andrew.victor@mxit.com
date Wed, 04 May 2011 07:21:43 +0000
parents 08dccf527457 (current diff) 5ec6859bf81a (diff)
children 807860d518a6
files ChangeLog libpurple/protocols/mxit/profile.c
diffstat 22 files changed, 416 insertions(+), 902 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Tue May 03 20:29:59 2011 +0000
+++ b/COPYRIGHT	Wed May 04 07:21:43 2011 +0000
@@ -48,6 +48,7 @@
 Stefan Becker
 Carlos Bederian
 Dave Bell
+Matthew W.S. Bell
 Igor Belyi
 David Benjamin
 Brian Bernas
--- a/ChangeLog	Tue May 03 20:29:59 2011 +0000
+++ b/ChangeLog	Wed May 04 07:21:43 2011 +0000
@@ -34,6 +34,9 @@
 	  (Kartik Mohta) (#1131)
 	* media: Allow libpurple and plugins to set SDES properties for RTP
 	  conferences. (Jakub Adam) (#12981)
+	* proxy: Add new "Tor/Privacy" proxy type that can be used to restrict
+	  operations that could leak potentially sensitive data (e.g. DNS queries).
+	  (#11110, #13928)
 
 	Gadu-Gadu:
 	* Allow showing your status only to buddies. (Mateusz Piękos) (#13358)
@@ -86,6 +89,8 @@
 	XMPP:
 	* Remember the previously entered user directory when searching.
 	  (Keith Moyer) (#12451)
+	* Correctly handle a buddy's unsetting his/her vCard-based avatar.
+	  (Matthew W.S. Bell) (#13370)
 
 	Plugins:
 	* The Voice/Video Settings plugin now includes the ability to test
@@ -96,7 +101,7 @@
 	Windows-Specific Changes:
 	* Fix building libpurple with Visual C++ .NET 2005. This was accidentally
 	  broken in 2.7.11. (Florian Quèze)
-	* Build internal libgadu without -mms-bitfields, fixing several
+	* Build internal libgadu using packed structs, fixing several
 	  long-standing Gadu-Gadu issues. (#11958, #6297)
 
 version 2.7.11 (03/10/2011):
--- a/finch/gntnotify.c	Tue May 03 20:29:59 2011 +0000
+++ b/finch/gntnotify.c	Wed May 04 07:21:43 2011 +0000
@@ -84,6 +84,10 @@
 
 	if (secondary) {
 		GntWidget *msg;
+		/* XXX: This is broken.  type is PurpleNotifyMsgType, not
+		 * PurpleNotifyType.  Also, the if() followed by the
+		 * inner switch doesn't make much sense.
+		 */
 		if (type == PURPLE_NOTIFY_FORMATTED) {
 			int width = -1, height = -1;
 			char *plain = (char*)secondary;
--- a/libpurple/dnsquery.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/dnsquery.c	Wed May 04 07:21:43 2011 +0000
@@ -24,6 +24,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
+#define _PURPLE_DNSQUERY_C_
 
 #include "internal.h"
 #include "debug.h"
--- a/libpurple/dnsquery.h	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/dnsquery.h	Wed May 04 07:21:43 2011 +0000
@@ -102,7 +102,7 @@
  */
 PurpleDnsQueryData *purple_dnsquery_a_account(PurpleAccount *account, const char *hostname, int port, PurpleDnsQueryConnectFunction callback, gpointer data);
 
-#ifndef PURPLE_DISABLE_DEPRECATED
+#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSQUERY_C_)
 /**
  * Perform an asynchronous DNS query.
  *
--- a/libpurple/dnssrv.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/dnssrv.c	Wed May 04 07:21:43 2011 +0000
@@ -20,6 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
+#define _PURPLE_DNSSRV_C_
 
 #include "internal.h"
 #include "util.h"
--- a/libpurple/dnssrv.h	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/dnssrv.h	Wed May 04 07:21:43 2011 +0000
@@ -114,7 +114,7 @@
  */
 PurpleSrvTxtQueryData *purple_srv_resolve_account(PurpleAccount *account, const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata);
 
-#ifndef PURPLE_DISABLE_DEPRECATED
+#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSSRV_C_)
 /**
  * Queries an SRV record.
  *
@@ -149,7 +149,7 @@
  */
 PurpleSrvTxtQueryData *purple_txt_resolve_account(PurpleAccount *account, const char *owner, const char *domain, PurpleTxtCallback cb, gpointer extradata);
 
-#ifndef PURPLE_DISABLE_DEPRECATED
+#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSSRV_C_)
 /**
  * Queries an TXT record.
  *
--- a/libpurple/protocols/bonjour/jabber.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/bonjour/jabber.c	Wed May 04 07:21:43 2011 +0000
@@ -831,12 +831,45 @@
 	if (source < 0) {
 		PurpleConversation *conv = NULL;
 		PurpleAccount *account = NULL;
+		GSList *tmp = bb->ips;
 
-		purple_debug_error("bonjour", "Error connecting to buddy %s at %s:%d error: %s\n",
-				   purple_buddy_get_name(pb), bb->conversation->ip, bb->port_p2pj, error ? error : "(null)");
+		purple_debug_error("bonjour", "Error connecting to buddy %s at %s:%d (%s); Trying next IP address\n",
+				   purple_buddy_get_name(pb), bb->conversation->ip, bb->port_p2pj, error);
+
+		/* There may be multiple entries for the same IP - one per
+		 * presence recieved (e.g. multiple interfaces).
+		 * We need to make sure that we find the previously used entry.
+		 */
+		while (tmp && bb->conversation->ip_link != tmp->data)
+			tmp = g_slist_next(tmp);
+		if (tmp)
+			tmp = g_slist_next(tmp);
 
 		account = purple_buddy_get_account(pb);
 
+		if (tmp != NULL) {
+			const gchar *ip;
+			PurpleProxyConnectData *connect_data;
+
+			bb->conversation->ip_link = ip = tmp->data;
+
+			purple_debug_info("bonjour", "Starting conversation with %s at %s:%d\n",
+					  purple_buddy_get_name(pb), ip, bb->port_p2pj);
+
+			connect_data = purple_proxy_connect(purple_account_get_connection(account),
+							    account, ip, bb->port_p2pj, _connected_to_buddy, pb);
+
+			if (connect_data != NULL) {
+				g_free(bb->conversation->ip);
+				bb->conversation->ip = g_strdup(ip);
+				bb->conversation->connect_data = connect_data;
+
+				return;
+			}
+		}
+
+		purple_debug_error("bonjour", "No more addresses for buddy %s. Aborting", purple_buddy_get_name(pb));
+
 		conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, bb->name, account);
 		if (conv != NULL)
 			purple_conversation_write(conv, NULL,
@@ -995,10 +1028,9 @@
 	{
 		PurpleProxyConnectData *connect_data;
 		PurpleProxyInfo *proxy_info;
-		/* For better or worse, use the first IP*/
-		const char *ip = bb->ips->data;
+		const char *ip = bb->ips->data; /* Start with the first IP address. */
 
-		purple_debug_info("bonjour", "Starting conversation with %s\n", to);
+		purple_debug_info("bonjour", "Starting conversation with %s at %s:%d\n", to, ip, bb->port_p2pj);
 
 		/* Make sure that the account always has a proxy of "none".
 		 * This is kind of dirty, but proxy_connect_none() isn't exposed. */
@@ -1021,6 +1053,7 @@
 
 		bb->conversation = bonjour_jabber_conv_new(pb, jdata->account, ip);
 		bb->conversation->connect_data = connect_data;
+		bb->conversation->ip_link = ip;
 		/* We don't want _send_data() to register the tx_handler;
 		 * that neeeds to wait until we're actually connected. */
 		bb->conversation->tx_handler = 0;
--- a/libpurple/protocols/bonjour/jabber.h	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/bonjour/jabber.h	Wed May 04 07:21:43 2011 +0000
@@ -63,6 +63,8 @@
 	/* The following are only needed before attaching to a PurpleBuddy */
 	gchar *buddy_name;
 	gchar *ip;
+	/* This points to a data entry in BonjourBuddy->ips */
+	const gchar *ip_link;
 } BonjourJabberConversation;
 
 /**
--- a/libpurple/protocols/gg/gg.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/gg/gg.c	Wed May 04 07:21:43 2011 +0000
@@ -818,7 +818,6 @@
 
 static void ggp_callback_add_to_chat_ok(PurpleBuddy *buddy, PurpleRequestFields *fields)
 {
-	GGPInfo *info;
 	PurpleConnection *conn;
 	PurpleRequestField *field;
 	GList *sel;
@@ -827,8 +826,6 @@
 
 	g_return_if_fail(conn != NULL);
 
-	info = conn->proto_data;
-
 	field = purple_request_fields_get_field(fields, "name");
 	sel = purple_request_field_list_get_selected(field);
 
@@ -2595,9 +2592,6 @@
 static void ggp_register_user(PurpleAccount *account)
 {
 	PurpleConnection *gc = purple_account_get_connection(account);
-	GGPInfo *info;
-
-	info = gc->proto_data = g_new0(GGPInfo, 1);
 
 	ggp_token_request(gc, ggp_register_user_dialog);
 }
--- a/libpurple/protocols/jabber/presence.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/jabber/presence.c	Wed May 04 07:21:43 2011 +0000
@@ -450,21 +450,23 @@
 			g_free(nickname);
 		}
 
-		if ((photo = xmlnode_get_child(vcard, "PHOTO")) &&
-				(binval = xmlnode_get_child(photo, "BINVAL")) &&
-				(text = xmlnode_get_data(binval))) {
-			guchar *data;
-			gsize size;
+		if ((photo = xmlnode_get_child(vcard, "PHOTO"))) {
+			guchar *data = NULL;
+			gchar *hash = NULL;
+			gsize size = 0;
 
-			data = purple_base64_decode(text, &size);
-			if (data) {
-				gchar *hash = jabber_calculate_data_hash(data, size, "sha1");
-				purple_buddy_icons_set_for_user(js->gc->account, from, data,
-				                                size, hash);
-				g_free(hash);
+			if ((binval = xmlnode_get_child(photo, "BINVAL")) &&
+					(text = xmlnode_get_data(binval))) {
+				data = purple_base64_decode(text, &size);
+				g_free(text);
+
+				if (data)
+					hash = jabber_calculate_data_hash(data, size, "sha1");
 			}
 
-			g_free(text);
+			purple_buddy_icons_set_for_user(js->gc->account, from, data, size, hash);
+
+			g_free(hash);
 		}
 	}
 }
@@ -840,20 +842,22 @@
 		}
 	}
 
-	if(b && presence->vcard_avatar_hash) {
-		const char *avatar_hash2 = purple_buddy_icons_get_checksum_for_user(b);
-		if(!avatar_hash2 || strcmp(presence->vcard_avatar_hash, avatar_hash2)) {
-			JabberIq *iq;
-			xmlnode *vcard;
-
+	if (b && presence->vcard_avatar_hash) {
+		const char *ah = presence->vcard_avatar_hash[0] != '\0' ?
+				presence->vcard_avatar_hash : NULL;
+		const char *ah2 = purple_buddy_icons_get_checksum_for_user(b);
+		if (!purple_strequal(ah, ah2)) {
 			/* XXX this is a crappy way of trying to prevent
 			 * someone from spamming us with presence packets
 			 * and causing us to DoS ourselves...what we really
 			 * need is a queue system that can throttle itself,
 			 * but i'm too tired to write that right now */
 			if(!g_slist_find(js->pending_avatar_requests, presence->jb)) {
+				JabberIq *iq;
+				xmlnode *vcard;
 
-				js->pending_avatar_requests = g_slist_prepend(js->pending_avatar_requests, presence->jb);
+				js->pending_avatar_requests =
+					g_slist_prepend(js->pending_avatar_requests, presence->jb);
 
 				iq = jabber_iq_new(js, JABBER_IQ_GET);
 				xmlnode_set_attrib(iq->node, "to", buddy_name);
@@ -1206,9 +1210,13 @@
 parse_vcard_avatar(JabberStream *js, JabberPresence *presence, xmlnode *x)
 {
 	xmlnode *photo = xmlnode_get_child(x, "photo");
+
 	if (photo) {
+		char *hash_tmp = xmlnode_get_data(photo);
+		hash_tmp = xmlnode_get_data(photo);
 		g_free(presence->vcard_avatar_hash);
-		presence->vcard_avatar_hash = xmlnode_get_data(photo);
+		presence->vcard_avatar_hash =
+			hash_tmp ? hash_tmp : g_strdup("");
 	}
 }
 
--- a/libpurple/protocols/jabber/si.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/jabber/si.c	Wed May 04 07:21:43 2011 +0000
@@ -965,15 +965,23 @@
 jabber_si_xfer_bytestreams_send_init(PurpleXfer *xfer)
 {
 	JabberSIXfer *jsx;
+	PurpleProxyType proxy_type;
 
 	purple_xfer_ref(xfer);
 
 	jsx = xfer->data;
 
-	/* TODO: Should there be an option to not use the local host as a ft proxy?
-	 *       (to prevent revealing IP address, etc.) */
-	jsx->listen_data = purple_network_listen_range(0, 0, SOCK_STREAM,
+	/* TODO: This should probably be done with an account option instead of
+	 *       piggy-backing on the TOR proxy type. */
+	proxy_type = purple_proxy_info_get_type(
+		purple_proxy_get_setup(purple_connection_get_account(jsx->js->gc)));
+	if (proxy_type == PURPLE_PROXY_TOR) {
+		purple_debug_info("jabber", "Skipping attempting local streamhost.\n");
+		jsx->listen_data = NULL;
+	} else
+		jsx->listen_data = purple_network_listen_range(0, 0, SOCK_STREAM,
 				jabber_si_xfer_bytestreams_listen_cb, xfer);
+
 	if (jsx->listen_data == NULL) {
 		/* We couldn't open a local port.  Perhaps we can use a proxy. */
 		jabber_si_xfer_bytestreams_listen_cb(-1, xfer);
@@ -1683,7 +1691,10 @@
 {
 	JabberSIXfer *jsx;
 	PurpleXfer *xfer;
-	xmlnode *file, *feature, *x, *field, *option, *value, *thumbnail;
+	xmlnode *file, *feature, *x, *field, *option, *value;
+#if ENABLE_FT_THUMBNAILS
+	xmlnode *thumbnail;
+#endif
 	const char *stream_id, *filename, *filesize_c, *profile;
 	guint64 filesize_64 = 0;
 	size_t filesize = 0;
@@ -1787,16 +1798,12 @@
 		if (cid) {
 			jabber_data_request(js, cid, purple_xfer_get_remote_user(xfer),
 			    NULL, TRUE, jabber_si_thumbnail_cb, xfer);
-		} else {
-			purple_xfer_request(xfer);
+			return;
 		}
-	} else {
-		purple_xfer_request(xfer);
 	}
-#else
-	thumbnail = NULL; /* Silence warning */
+#endif
+
 	purple_xfer_request(xfer);
-#endif
 }
 
 void
--- a/libpurple/protocols/msn/switchboard.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/msn/switchboard.c	Wed May 04 07:21:43 2011 +0000
@@ -643,10 +643,8 @@
 static void
 iro_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
-	PurpleAccount *account;
 	MsnSwitchBoard *swboard;
 
-	account = cmdproc->session->account;
 	swboard = cmdproc->data;
 
 	swboard->total_users = atoi(cmd->params[2]);
@@ -658,14 +656,12 @@
 joi_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
 	MsnSession *session;
-	PurpleAccount *account;
 	MsnSwitchBoard *swboard;
 	const char *passport;
 
 	passport = cmd->params[0];
 
 	session = cmdproc->session;
-	account = session->account;
 	swboard = cmdproc->data;
 
 	msn_switchboard_add_user(swboard, passport);
--- a/libpurple/protocols/mxit/profile.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/mxit/profile.c	Wed May 04 07:21:43 2011 +0000
@@ -124,7 +124,7 @@
 
 	/* decode hdate */
 	memset( &bdate, 0, sizeof( struct tm ) );
-	strptime( date, "%Y-%m-%d", &bdate );
+	purple_str_to_time(date, FALSE, &bdate, NULL, NULL);
 
 	/* calculate difference */
 	age = now.tm_year - bdate.tm_year;
--- a/libpurple/protocols/myspace/myspace.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/myspace/myspace.c	Wed May 04 07:21:43 2011 +0000
@@ -377,19 +377,13 @@
 static char *
 msim_status_text(PurpleBuddy *buddy)
 {
-	MsimSession *session;
 	MsimUser *user;
-	const gchar *display_name, *headline;
+	const gchar *display_name = NULL, *headline = NULL;
 	PurpleAccount *account;
-	PurpleConnection *gc;
 
 	g_return_val_if_fail(buddy != NULL, NULL);
 
 	account = purple_buddy_get_account(buddy);
-	gc = purple_account_get_connection(account);
-	session = (MsimSession *)gc->proto_data;
-
-	display_name = headline = NULL;
 
 	user = msim_get_user_from_buddy(buddy, FALSE);
 	if (user != NULL) {
@@ -859,7 +853,6 @@
 msim_check_inbox_cb(MsimSession *session, const MsimMessage *reply, gpointer data)
 {
 	MsimMessage *body;
-	guint old_inbox_status;
 	guint i, n;
 	/* Information for each new inbox message type. */
 	static struct
@@ -896,8 +889,6 @@
 	if (body == NULL)
 		return;
 
-	old_inbox_status = session->inbox_status;
-
 	n = 0;
 
 	for (i = 0; i < G_N_ELEMENTS(message_types); ++i) {
@@ -1357,7 +1348,6 @@
 static gboolean
 msim_incoming_status(MsimSession *session, MsimMessage *msg)
 {
-	PurpleBuddyList *blist;
 	MsimUser *user;
 	GList *list;
 	gchar *status_headline, *status_headline_escaped;
@@ -1391,8 +1381,6 @@
 	purple_debug_info("msim", "msim_status: %s's status code = %d\n", username, status_code);
 	status_headline = msim_msg_get_string_from_element(g_list_nth_data(list, MSIM_STATUS_ORDINAL_HEADLINE));
 
-	blist = purple_get_blist();
-
 	/* Add buddy if not found.
 	 * TODO: Could this be responsible for #3444? */
 	user = msim_find_user(session, username);
@@ -2026,7 +2014,6 @@
 msim_input_cb(gpointer gc_uncasted, gint source, PurpleInputCondition cond)
 {
 	PurpleConnection *gc;
-	PurpleAccount *account;
 	MsimSession *session;
 	gchar *end;
 	int n;
@@ -2035,7 +2022,6 @@
 	g_return_if_fail(source >= 0);  /* Note: 0 is a valid fd */
 
 	gc = (PurpleConnection *)(gc_uncasted);
-	account = purple_connection_get_account(gc);
 	session = gc->proto_data;
 
 	/* libpurple/eventloop.h only defines these two */
@@ -3187,14 +3173,11 @@
  * Actions menu for account.
  */
 static GList *
-msim_actions(PurplePlugin *plugin, gpointer context)
+msim_actions(PurplePlugin *plugin, gpointer context /* PurpleConnection* */)
 {
-	PurpleConnection *gc;
 	GList *menu;
 	PurplePluginAction *act;
 
-	gc = (PurpleConnection *)context;
-
 	menu = NULL;
 
 #if 0
--- a/libpurple/protocols/myspace/user.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/protocols/myspace/user.c	Wed May 04 07:21:43 2011 +0000
@@ -565,7 +565,7 @@
 {
 	MsimMessage *body;
 	gchar *field_name;
-	guint rid, cmd, dsn, lid;
+	guint rid, dsn, lid;
 
 	g_return_if_fail(user != NULL);
 	/* Callback can be null to not call anything, just lookup & store information. */
@@ -579,8 +579,6 @@
 
 	/* Send request */
 
-	cmd = MSIM_CMD_GET;
-
 	if (msim_is_userid(user)) {
 		field_name = "UserID";
 		dsn = MG_MYSPACE_INFO_BY_ID_DSN;
@@ -602,7 +600,7 @@
 	g_return_if_fail(msim_send(session,
 			"persist", MSIM_TYPE_INTEGER, 1,
 			"sesskey", MSIM_TYPE_INTEGER, session->sesskey,
-			"cmd", MSIM_TYPE_INTEGER, 1,
+			"cmd", MSIM_TYPE_INTEGER, MSIM_CMD_GET,
 			"dsn", MSIM_TYPE_INTEGER, dsn,
 			"uid", MSIM_TYPE_INTEGER, session->userid,
 			"lid", MSIM_TYPE_INTEGER, lid,
--- a/libpurple/proxy.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/proxy.c	Wed May 04 07:21:43 2011 +0000
@@ -29,6 +29,7 @@
 /* it is intended to : 1st handle http proxy, using the CONNECT command
  , 2nd provide an easy way to add socks support
  , 3rd draw women to it like flies to honey */
+#define _PURPLE_PROXY_C_
 
 #include "internal.h"
 #include "cipher.h"
@@ -2397,9 +2398,6 @@
 	return connect_data;
 }
 
-/*
- * Combine some of this code with purple_proxy_connect()
- */
 PurpleProxyConnectData *
 purple_proxy_connect_socks5(void *handle, PurpleProxyInfo *gpi,
 						  const char *host, int port,
@@ -2409,6 +2407,42 @@
 	return purple_proxy_connect_socks5_account(NULL, handle, gpi,
 						  host, port, connect_cb, data);
 }
+
+
+/* This is called when we connect to the SOCKS5 proxy server (through any
+ * relevant account proxy)
+ */
+static void socks5_connected_to_proxy(gpointer data, gint source,
+		const gchar *error_message) {
+	/* This is the PurpleProxyConnectData for the overall SOCKS5 connection */
+	PurpleProxyConnectData *connect_data = data;
+
+	/* Check that the overall SOCKS5 connection wasn't cancelled while we were
+	 * connecting to it (we don't have a way of associating the process of
+	 * connecting to the SOCKS5 server to the overall PurpleProxyConnectData)
+	 */
+	if (!PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data))
+		return;
+
+	if (error_message != NULL) {
+		purple_debug_error("proxy", "Unable to connect to SOCKS5 host.\n");
+		connect_data->connect_cb(connect_data->data, source, error_message);
+		return;
+	}
+
+	purple_debug_info("proxy", "Initiating SOCKS5 negotiation.\n");
+
+	purple_debug_info("proxy",
+			   "Connecting to %s:%d via %s:%d using SOCKS5\n",
+			   connect_data->host, connect_data->port,
+			   purple_proxy_info_get_host(connect_data->gpi),
+			   purple_proxy_info_get_port(connect_data->gpi));
+
+	connect_data->fd = source;
+
+	s5_canwrite(connect_data, connect_data->fd, PURPLE_INPUT_WRITE);
+}
+
 /*
  * Combine some of this code with purple_proxy_connect()
  */
@@ -2420,6 +2454,7 @@
 						  gpointer data)
 {
 	PurpleProxyConnectData *connect_data;
+	PurpleProxyConnectData *account_proxy_conn_data;
 
 	g_return_val_if_fail(host       != NULL, NULL);
 	g_return_val_if_fail(port       >= 0,    NULL);
@@ -2436,17 +2471,26 @@
 	connect_data->gpi = gpi;
 	connect_data->account = account;
 
-	connect_data->query_data =
-			purple_dnsquery_a_account(account,
-					purple_proxy_info_get_host(gpi),
-					purple_proxy_info_get_port(gpi),
-					connection_host_resolved, connect_data);
-	if (connect_data->query_data == NULL)
-	{
+	/* If there is an account proxy, use it to connect to the desired SOCKS5
+	 * proxy.
+	 */
+	account_proxy_conn_data = purple_proxy_connect(connect_data->handle,
+				connect_data->account,
+				purple_proxy_info_get_host(connect_data->gpi),
+				purple_proxy_info_get_port(connect_data->gpi),
+				socks5_connected_to_proxy, connect_data);
+
+	if (account_proxy_conn_data == NULL) {
+		purple_debug_error("proxy", "Unable to initiate connection to account proxy.\n");
 		purple_proxy_connect_data_destroy(connect_data);
 		return NULL;
 	}
 
+	/* The API doesn't really provide us with a way to cancel the specific
+	 * proxy connection attempt (account_proxy_conn_data) when the overall
+	 * SOCKS5 connection (connect_data) attempt is cancelled :(
+	 */
+
 	handles = g_slist_prepend(handles, connect_data);
 
 	return connect_data;
--- a/libpurple/proxy.h	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/proxy.h	Wed May 04 07:21:43 2011 +0000
@@ -289,11 +289,15 @@
 /**
  * Makes a connection through a SOCKS5 proxy.
  *
+ * Note that if the account that is making the connection uses a proxy, this
+ * connection to a SOCKS5 proxy will be made through the account proxy.
+ *
  * @param handle     A handle that should be associated with this
  *                   connection attempt.  The handle can be used
  *                   to cancel the connection attempt using the
  *                   purple_proxy_connect_cancel_with_handle()
  *                   function.
+ * @param account    The account making the connection.
  * @param gpi        The PurpleProxyInfo specifying the proxy settings
  * @param host       The destination host.
  * @param port       The destination port.
@@ -312,7 +316,7 @@
 			const char *host, int port,
 			PurpleProxyConnectFunction connect_cb, gpointer data);
 
-#ifndef PURPLE_DISABLE_DEPRECATED
+#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PROXY_C_)
 /**
  * Makes a connection through a SOCKS5 proxy.
  *
--- a/libpurple/util.c	Tue May 03 20:29:59 2011 +0000
+++ b/libpurple/util.c	Wed May 04 07:21:43 2011 +0000
@@ -713,6 +713,8 @@
 
 	g_return_val_if_fail(timestamp != NULL, 0);
 
+	memset(&t, 0, sizeof(struct tm));
+
 	str = timestamp;
 
 	/* Strip leading whitespace */
--- a/pidgin/gtkaccount.c	Tue May 03 20:29:59 2011 +0000
+++ b/pidgin/gtkaccount.c	Wed May 04 07:21:43 2011 +0000
@@ -1003,12 +1003,6 @@
 
 	gtk_list_store_append(model, &iter);
 	gtk_list_store_set(model, &iter,
-			0, _("HTTP"),
-			1, PURPLE_PROXY_HTTP,
-			-1);
-
-	gtk_list_store_append(model, &iter);
-	gtk_list_store_set(model, &iter,
 			0, _("SOCKS 4"),
 			1, PURPLE_PROXY_SOCKS4,
 			-1);
@@ -1027,6 +1021,12 @@
 
 	gtk_list_store_append(model, &iter);
 	gtk_list_store_set(model, &iter,
+			0, _("HTTP"),
+			1, PURPLE_PROXY_HTTP,
+			-1);
+
+	gtk_list_store_append(model, &iter);
+	gtk_list_store_set(model, &iter,
 			0, _("Use Environmental Settings"),
 			1, PURPLE_PROXY_USE_ENVVAR,
 			-1);
@@ -1042,8 +1042,14 @@
 static void
 proxy_type_changed_cb(GtkWidget *menu, AccountPrefsDialog *dialog)
 {
-	dialog->new_proxy_type =
-		gtk_combo_box_get_active(GTK_COMBO_BOX(menu)) - 1;
+	GtkTreeIter iter;
+
+	if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(menu), &iter)) {
+		int int_value;
+		gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(menu)), &iter,
+			1, &int_value, -1);
+		dialog->new_proxy_type = int_value;
+	}
 
 	if (dialog->new_proxy_type == PURPLE_PROXY_USE_GLOBAL ||
 		dialog->new_proxy_type == PURPLE_PROXY_NONE ||
@@ -1085,6 +1091,8 @@
 	PurpleProxyInfo *proxy_info;
 	GtkWidget *vbox;
 	GtkWidget *vbox2;
+	GtkTreeIter iter;
+	GtkTreeModel *proxy_model;
 
 	if (dialog->proxy_frame != NULL)
 		gtk_widget_destroy(dialog->proxy_frame);
@@ -1131,21 +1139,10 @@
 
 	if (dialog->account != NULL &&
 		(proxy_info = purple_account_get_proxy_info(dialog->account)) != NULL) {
-
-		PurpleProxyType type = purple_proxy_info_get_type(proxy_info);
 		const char *value;
 		int int_val;
 
-		/* Hah! */
-		/* I dunno what you're laughing about, fuzz ball. */
-		dialog->new_proxy_type = type;
-		gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->proxy_dropdown),
-				type + 1);
-
-		if (type == PURPLE_PROXY_USE_GLOBAL || type == PURPLE_PROXY_NONE ||
-				type == PURPLE_PROXY_USE_ENVVAR)
-			gtk_widget_hide_all(vbox2);
-
+		dialog->new_proxy_type = purple_proxy_info_get_type(proxy_info);
 
 		if ((value = purple_proxy_info_get_host(proxy_info)) != NULL)
 			gtk_entry_set_text(GTK_ENTRY(dialog->proxy_host_entry), value);
@@ -1163,14 +1160,26 @@
 
 		if ((value = purple_proxy_info_get_password(proxy_info)) != NULL)
 			gtk_entry_set_text(GTK_ENTRY(dialog->proxy_pass_entry), value);
-	}
-	else {
+
+	} else
 		dialog->new_proxy_type = PURPLE_PROXY_USE_GLOBAL;
-		gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->proxy_dropdown),
-				dialog->new_proxy_type + 1);
-		gtk_widget_hide_all(vbox2);
+
+	proxy_model = gtk_combo_box_get_model(
+		GTK_COMBO_BOX(dialog->proxy_dropdown));
+	if (gtk_tree_model_get_iter_first(proxy_model, &iter)) {
+		int int_val;
+		do {
+			gtk_tree_model_get(proxy_model, &iter, 1, &int_val, -1);
+			if (int_val == dialog->new_proxy_type) {
+				gtk_combo_box_set_active_iter(
+					GTK_COMBO_BOX(dialog->proxy_dropdown), &iter);
+				break;
+			}
+		} while(gtk_tree_model_iter_next(proxy_model, &iter));
 	}
 
+	proxy_type_changed_cb(dialog->proxy_dropdown, dialog);
+
 	/* Connect signals. */
 	g_signal_connect(G_OBJECT(dialog->proxy_dropdown), "changed",
 					 G_CALLBACK(proxy_type_changed_cb), dialog);
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Tue May 03 20:29:59 2011 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Wed May 04 07:21:43 2011 +0000
@@ -580,7 +580,6 @@
     Delete "$INSTDIR\plugins\libmyspace.dll"
     Delete "$INSTDIR\plugins\libnapster.dll"
     Delete "$INSTDIR\plugins\libnovell.dll"
-    Delete "$INSTDIR\plugins\libqq.dll"
     Delete "$INSTDIR\plugins\libsametime.dll"
     Delete "$INSTDIR\plugins\libsilc.dll"
     Delete "$INSTDIR\plugins\libsimple.dll"
--- a/po/de.po	Tue May 03 20:29:59 2011 +0000
+++ b/po/de.po	Wed May 04 07:21:43 2011 +0000
@@ -11,9 +11,9 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 12:25+0100\n"
-"PO-Revision-Date: 2011-03-06 12:25+0100\n"
-"Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
+"POT-Creation-Date: 2011-05-03 22:53+0200\n"
+"PO-Revision-Date: 2011-05-03 22:55+0200\n"
+"Last-Translator: Björn Voigt <bjoern@cs.tu-berlin.de>\n"
 "Language-Team: German <de@li.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
@@ -219,6 +219,9 @@
 msgid "Alias (optional)"
 msgstr "Alias (optional)"
 
+msgid "Invite message (optional)"
+msgstr "Einladungsnachricht (optional)"
+
 msgid "Add in group"
 msgstr "Zu Gruppe hinzufügen"
 
@@ -1954,6 +1957,9 @@
 msgid "Unknown reason"
 msgstr "Unbekannter Grund"
 
+msgid "Aborting DNS lookup in Tor Proxy mode."
+msgstr "DNS-Anfrage im Tor-Proxy-Modus abgebrochen"
+
 #, c-format
 msgid ""
 "Error reading %s: \n"
@@ -3208,6 +3214,21 @@
 msgid "Change Gadu-Gadu Password"
 msgstr "Gadu-Gadu Passwort ändern"
 
+msgid "Show status to:"
+msgstr "Zeige Status:"
+
+msgid "All people"
+msgstr "Allen Leuten"
+
+msgid "Only buddies"
+msgstr "Nur Buddys"
+
+msgid "Change status broadcasting"
+msgstr "Statusveröffentlichung ändern"
+
+msgid "Please, select who can see your status"
+msgstr "Bitte wählen Sie, wer Ihren Status sehen darf"
+
 #, c-format
 msgid "Select a chat for buddy: %s"
 msgstr "Wählen Sie einen Chat für den Benutzer: %s"
@@ -3351,6 +3372,19 @@
 msgid "GG server"
 msgstr "GG-Server"
 
+msgid "Don't use encryption"
+msgstr "Keine Verschlüsselung benutzen"
+
+msgid "Use encryption if available"
+msgstr "Verschlüsselung benutzen, wenn verfügbar"
+
+#. TODO
+msgid "Require encryption"
+msgstr "Verschlüsselung fordern"
+
+msgid "Connection security"
+msgstr "Verbindungssicherheit"
+
 #, c-format
 msgid "Unknown command: %s"
 msgstr "Unbekanntes Kommando: %s"
@@ -3386,7 +3420,6 @@
 #. * buffer that stores what is "being sent" until the
 #. * PurpleHTTPConnection reports it is fully sent.
 #.
-#. TODO: what to do here - do we really have to disconnect?
 #. TODO: do we really want to disconnect on a failure to write?
 #, c-format
 msgid "Lost connection with server: %s"
@@ -3642,6 +3675,9 @@
 msgid "action &lt;action to perform&gt;:  Perform an action."
 msgstr "action &lt;Aktion&gt;:  Führe eine Aktion durch."
 
+msgid "authserv: Send a command to authserv"
+msgstr "authserv: Sendet ein Kommando zum Authserv"
+
 msgid ""
 "away [message]:  Set an away message, or use no message to return from being "
 "away."
@@ -4782,18 +4818,9 @@
 msgid "Domain"
 msgstr "Domain"
 
-msgid "Require encryption"
-msgstr "Verschlüsselung fordern"
-
-msgid "Use encryption if available"
-msgstr "Verschlüsselung benutzen, wenn verfügbar"
-
 msgid "Use old-style SSL"
 msgstr "Alte SSL-Methode verwenden"
 
-msgid "Connection security"
-msgstr "Verbindungssicherheit"
-
 msgid "Allow plaintext auth over unencrypted streams"
 msgstr "Erlaube Klartext-Authentifikation über einen unverschlüsselten Kanal"
 
@@ -4905,6 +4932,7 @@
 "Kann die Datei nicht an %s senden, da der Client des Benutzers keine "
 "Dateiübertragung unterstützt"
 
+#. not success
 msgid "File Send Failed"
 msgstr "Senden der Datei gescheitert"
 
@@ -5632,18 +5660,6 @@
 msgid "Unable to Add"
 msgstr "Kann nicht hinzufügen"
 
-msgid "Authorization Request Message:"
-msgstr "Autorisierungsanfrage:"
-
-msgid "Please authorize me!"
-msgstr "Bitte autorisiere mich!"
-
-#. *
-#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
-#.
-msgid "_OK"
-msgstr "_OK"
-
 msgid "Error retrieving profile"
 msgstr "Fehler beim Empfangen des Profils"
 
@@ -5856,6 +5872,11 @@
 msgid "Mobile message was not sent because it was too long."
 msgstr "Mobile Nachricht wurde nicht gesendet, da sie zu lang war."
 
+msgid "Mobile message was not sent because an unknown error occurred."
+msgstr ""
+"Mobile Nachricht konnte nicht gesendet werden, da ein unbekannter Fehler "
+"aufgetreten ist."
+
 #, c-format
 msgid ""
 "The MSN server will shut down for maintenance in %d minute. You will "
@@ -6037,18 +6058,6 @@
 msgid "The username specified is invalid."
 msgstr "Der angegebene Benutzername ist ungültig."
 
-msgid "The PIN you entered is invalid."
-msgstr "Der eingegebene PIN ist ungültig."
-
-msgid "The PIN you entered has an invalid length [4-10]."
-msgstr "Die eingegebene PIN hat eine ungültige Länge [4-10]."
-
-msgid "The PIN is invalid. It should only consist of digits [0-9]."
-msgstr "Die PIN ist ungültig. Sie sollte nur aus Ziffern [0-9] bestehen."
-
-msgid "The two PINs you entered do not match."
-msgstr "Die beiden PINs, die Sie eingegeben haben, stimmen nicht überein."
-
 msgid "The Display Name you entered is invalid."
 msgstr "Der eingegebene Anzeigename ist ungültig."
 
@@ -6072,35 +6081,65 @@
 "Ihre Profil-Informationen wurden noch nicht abgerufen. Bitte versuchen Sie "
 "es später noch einmal."
 
-msgid "Your UID"
-msgstr "Ihre UID"
+#. display name
+#. nick name (required)
+msgid "Display Name"
+msgstr "Anzeigename"
+
+#. about me
+msgid "About Me"
+msgstr "Über mich"
+
+#. where I live
+msgid "Where I Live"
+msgstr "Wo ich wohne"
+
+#. mobile number
+msgid "Mobile Number"
+msgstr "Handynummer"
+
+#. is searchable
+msgid "Can be searched"
+msgstr "Kann gesucht werden"
+
+#. is suggestable
+msgid "Can be suggested"
+msgstr "Kann vorgeschlagen werden"
+
+msgid "Update your MXit Profile"
+msgstr "Aktualisieren Sie Ihr MXit-Profil"
+
+msgid "The PIN you entered is invalid."
+msgstr "Die eingegebene PIN ist ungültig."
+
+msgid "The PIN you entered has an invalid length [4-10]."
+msgstr "Die eingegebene PIN hat eine ungültige Länge [4-10]."
+
+msgid "The PIN is invalid. It should only consist of digits [0-9]."
+msgstr "Die PIN ist ungültig. Sie sollte nur aus Ziffern [0-9] bestehen."
+
+msgid "The two PINs you entered do not match."
+msgstr "Die beiden PINs, die Sie eingegeben haben, stimmen nicht überein."
+
+#. show error to user
+msgid "PIN Update Error"
+msgstr "PIN-Aktualisierungsfehler"
 
 #. pin
 #. pin (required)
 msgid "PIN"
 msgstr "PIN"
 
+#. verify pin
 msgid "Verify PIN"
 msgstr "PIN bestätigen"
 
-#. display name
-#. nick name (required)
-msgid "Display Name"
-msgstr "Anzeigename"
-
-#. hidden
-msgid "Hide my number"
-msgstr "Meine Nummer verstecken"
-
-#. mobile number
-msgid "Mobile Number"
-msgstr "Handynummer"
-
-msgid "Update your Profile"
-msgstr "Aktualisieren Sie Ihr Profil"
-
-msgid "Here you can update your MXit profile"
-msgstr "Hier können Sie Ihr MXit-Profil aktualisieren"
+#. (reference: "libpurple/request.h")
+msgid "Change PIN"
+msgstr "PIN ändern"
+
+msgid "Change MXit PIN"
+msgstr "MXit-PIN ändern"
 
 msgid "View Splash"
 msgstr "Startbildschirm anschauen"
@@ -6111,10 +6150,34 @@
 msgid "About"
 msgstr "Info"
 
+msgid "Search for user"
+msgstr "Suche nach einem Benutzer"
+
+msgid "Search for a MXit contact"
+msgstr "Suche nach einem MXit-Kontakt"
+
+msgid "Type search information"
+msgstr "Eingabe der Benutzer-Information"
+
+msgid "_Search"
+msgstr "_Suchen"
+
 #. display / change profile
 msgid "Change Profile..."
 msgstr "Profil ändern..."
 
+#. change PIN
+msgid "Change PIN..."
+msgstr "PIN ändern..."
+
+#. suggested friends
+msgid "Suggested friends..."
+msgstr "Vorgeschlagene Freunde..."
+
+#. search for contacts
+msgid "Search for contacts..."
+msgstr "Suche nach Kontakten..."
+
 #. display splash-screen
 msgid "View Splash..."
 msgstr "Startbildschirm anzeigen..."
@@ -6227,13 +6290,12 @@
 msgid "Retrieving User Information..."
 msgstr "Abrufen der Benutzerinformationen..."
 
-#. you were kicked
+msgid "was kicked"
+msgstr "wurde hinausgeworfen"
+
 msgid "You have been kicked from this MultiMX."
 msgstr "Sie wurden von MultiMX hinausgeworfen."
 
-msgid "was kicked"
-msgstr "wurde hinausgeworfen"
-
 msgid "_Room Name:"
 msgstr "_Raumname:"
 
@@ -6281,6 +6343,30 @@
 msgid "Last Online"
 msgstr "Zuletzt online"
 
+msgid "Invite Message"
+msgstr "Einladungsnachricht"
+
+msgid "No results"
+msgstr "Keine Ergebnisse"
+
+msgid "No contacts found."
+msgstr "Keine Kontakte gefunden."
+
+#. define columns
+msgid "UserId"
+msgstr "Benutzer-Id"
+
+msgid "Where I live"
+msgstr "Wo ich wohne"
+
+#, c-format
+msgid "You have %i suggested friends."
+msgstr "Sie haben %i vorgeschlagene(n) Freund(e)."
+
+#, c-format
+msgid "We found %i contacts that match your search."
+msgstr "Wir fanden %i Kontakt(e), die Ihner Suchanfrage entspricht/entsprechen."
+
 #. we must have lost the connection, so terminate it so that we can reconnect
 msgid "We have lost the connection to MXit. Please reconnect."
 msgstr ""
@@ -7035,6 +7121,12 @@
 msgid "Authorization Denied Message:"
 msgstr "Nachricht für die Ablehnung der Autorisierung:"
 
+#. *
+#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
+#.
+msgid "_OK"
+msgstr "_OK"
+
 #, c-format
 msgid "Received unexpected response from %s: %s"
 msgstr "Unerwartete Antwort von %s erhalten: %s"
@@ -7395,7 +7487,6 @@
 msgstr "Autorisierung empfangen"
 
 #. Unregistered username
-#. uid is not exist
 #. the username does not exist
 msgid "Username does not exist"
 msgstr "Benutzername existiert nicht"
@@ -7890,9 +7981,6 @@
 msgid "Type the email address of the buddy you are searching for."
 msgstr "Geben Sie die E-Mail-Adresse des Buddys ein, nach dem Sie suchen."
 
-msgid "_Search"
-msgstr "_Suchen"
-
 msgid "Set User Info (web)..."
 msgstr "Benutzer-Info (Web) setzen..."
 
@@ -7929,9 +8017,6 @@
 msgid "Search for Buddy by Email Address..."
 msgstr "Suche Buddys nach E-Mail-Adresse..."
 
-msgid "Don't use encryption"
-msgstr "Keine Verschlüsselung benutzen"
-
 msgid "Use clientLogin"
 msgstr "clientLogin benutzen"
 
@@ -8206,722 +8291,6 @@
 msgid "These buddies will always see you as offline"
 msgstr "Für diese Buddys werden Sie immer als offline angezeigt"
 
-msgid "Aquarius"
-msgstr "Wassermann"
-
-msgid "Pisces"
-msgstr "Fische"
-
-msgid "Aries"
-msgstr "Widder"
-
-msgid "Taurus"
-msgstr "Stier"
-
-msgid "Gemini"
-msgstr "Zwillinge"
-
-msgid "Cancer"
-msgstr "Krebs"
-
-msgid "Leo"
-msgstr "Löwe"
-
-msgid "Virgo"
-msgstr "Jungfrau"
-
-msgid "Libra"
-msgstr "Waage"
-
-msgid "Scorpio"
-msgstr "Skorpion"
-
-msgid "Sagittarius"
-msgstr "Schütze"
-
-msgid "Capricorn"
-msgstr "Steinbock"
-
-msgid "Rat"
-msgstr "Ratte"
-
-msgid "Ox"
-msgstr "Ochse"
-
-msgid "Tiger"
-msgstr "Tiger"
-
-msgid "Rabbit"
-msgstr "Kaninchen"
-
-msgid "Dragon"
-msgstr "Drache"
-
-msgid "Snake"
-msgstr "Schlange"
-
-msgid "Horse"
-msgstr "Pferd"
-
-msgid "Goat"
-msgstr "Gans"
-
-msgid "Monkey"
-msgstr "Affe"
-
-msgid "Rooster"
-msgstr "Hahn"
-
-msgid "Dog"
-msgstr "Hund"
-
-msgid "Pig"
-msgstr "Schwein"
-
-msgid "Other"
-msgstr "Andere"
-
-msgid "Visible"
-msgstr "Sichtbar"
-
-msgid "Friend Only"
-msgstr "Nur Freund"
-
-msgid "Private"
-msgstr "Privat"
-
-msgid "QQ Number"
-msgstr "QQ-Nummer"
-
-msgid "Country/Region"
-msgstr "Land/Region"
-
-msgid "Province/State"
-msgstr "Provinz/Staat"
-
-msgid "Zipcode"
-msgstr "PLZ"
-
-msgid "Phone Number"
-msgstr "Telefonnummer"
-
-msgid "Authorize adding"
-msgstr "Hinzufügen autorisieren"
-
-msgid "Cellphone Number"
-msgstr "Handy-Telefonnummer"
-
-msgid "Personal Introduction"
-msgstr "Persönliche Vorstellung"
-
-msgid "City/Area"
-msgstr "Stadt/Gegend"
-
-msgid "Publish Mobile"
-msgstr "Handy veröffentlichen"
-
-msgid "Publish Contact"
-msgstr "Kontakt veröffentlichen"
-
-msgid "College"
-msgstr "College"
-
-msgid "Horoscope"
-msgstr "Horoskop"
-
-msgid "Zodiac"
-msgstr "Sternzeichen"
-
-msgid "Blood"
-msgstr "Blutgruppe"
-
-msgid "True"
-msgstr "Wahr"
-
-msgid "False"
-msgstr "Falsch"
-
-msgid "Modify Contact"
-msgstr "Kontakt bearbeiten"
-
-msgid "Modify Address"
-msgstr "Adresse bearbeiten"
-
-msgid "Modify Extended Information"
-msgstr "Erweiterte Informationen bearbeiten"
-
-msgid "Modify Information"
-msgstr "Informationen bearbeiten"
-
-msgid "Update"
-msgstr "Aktualisieren"
-
-msgid "Could not change buddy information."
-msgstr "Konnte Buddy-Informationen nicht bearbeiten."
-
-msgid "Note"
-msgstr "Bemerkung"
-
-#. callback
-msgid "Buddy Memo"
-msgstr "Buddy-Notiz"
-
-msgid "Change his/her memo as you like"
-msgstr "Ändern Sie seine/ihre Notiz wie Sie möchten"
-
-msgid "_Modify"
-msgstr "_Bearbeiten"
-
-msgid "Memo Modify"
-msgstr "Memo bearbeiten"
-
-msgid "Server says:"
-msgstr "Server meldet:"
-
-msgid "Your request was accepted."
-msgstr "Ihre Anfrage wurde akzeptiert."
-
-msgid "Your request was rejected."
-msgstr "Ihre Anfrage wurde abgelehnt."
-
-#, c-format
-msgid "%u requires verification: %s"
-msgstr "%u erfordert Überprüfung: %s"
-
-msgid "Add buddy question"
-msgstr "Buddy-Frage hinzufügen"
-
-msgid "Enter answer here"
-msgstr "Antwort hier eingeben"
-
-msgid "Send"
-msgstr "Senden"
-
-msgid "Invalid answer."
-msgstr "Ungültige Antwort."
-
-msgid "Authorization denied message:"
-msgstr "Nachricht für die Ablehnung der Autorisierung:"
-
-msgid "Sorry, you're not my style."
-msgstr "Tut mir Leid, du bist nicht mein Typ."
-
-#, c-format
-msgid "%u needs authorization"
-msgstr "%u benötigt Autorisierung"
-
-msgid "Add buddy authorize"
-msgstr "Buddy-Autorisierung hinzufügen"
-
-msgid "Enter request here"
-msgstr "Anfrage hier eingeben"
-
-msgid "Would you be my friend?"
-msgstr "Möchten Sie mein Freund sein?"
-
-msgid "QQ Buddy"
-msgstr "QQ-Buddy"
-
-msgid "Add buddy"
-msgstr "Buddy hinzufügen"
-
-msgid "Invalid QQ Number"
-msgstr "Ungültige QQ-Nummer"
-
-msgid "Failed sending authorize"
-msgstr "Senden der Autorisierung fehlgeschlagen"
-
-#, c-format
-msgid "Failed removing buddy %u"
-msgstr "Kontakt %u konnte nicht entfernt werden"
-
-#, c-format
-msgid "Failed removing me from %d's buddy list"
-msgstr "Entfernen von %ds Buddy-Liste fehlgeschlagen"
-
-msgid "No reason given"
-msgstr "Kein Grund angegeben"
-
-#. only need to get value
-#, c-format
-msgid "You have been added by %s"
-msgstr "Sie wurden von %s hinzugefügt"
-
-msgid "Would you like to add him?"
-msgstr "Möchten Sie ihn hinzufügen?"
-
-#, c-format
-msgid "Rejected by %s"
-msgstr "Abgelehnt von %s"
-
-#, c-format
-msgid "Message: %s"
-msgstr "Nachricht: %s"
-
-msgid "ID: "
-msgstr "ID: "
-
-msgid "Group ID"
-msgstr "Gruppen-ID"
-
-msgid "QQ Qun"
-msgstr "QQ-Qun"
-
-msgid "Please enter Qun number"
-msgstr "Bitte geben Sie die Qun-Nummer ein"
-
-msgid "You can only search for permanent Qun\n"
-msgstr "Sie können nur nach permanenten Qun suchen\n"
-
-msgid "(Invalid UTF-8 string)"
-msgstr "(Ungültige UTF8-Zeichenkette)"
-
-msgid "Not member"
-msgstr "Kein Mitglied"
-
-msgid "Member"
-msgstr "Mitglied"
-
-msgid "Requesting"
-msgstr "Frage an"
-
-msgid "Admin"
-msgstr "Admin"
-
-#. XXX: Should this be "Topic"?
-msgid "Room Title"
-msgstr "Raumtitel"
-
-msgid "Notice"
-msgstr "Bemerkung"
-
-msgid "Detail"
-msgstr "Detail"
-
-msgid "Creator"
-msgstr "Ersteller"
-
-msgid "About me"
-msgstr "Über mich"
-
-msgid "Category"
-msgstr "Kategorie"
-
-msgid "The Qun does not allow others to join"
-msgstr "Diesen Qun können andere nicht beitreten"
-
-msgid "Join QQ Qun"
-msgstr "QQ-Qun betreten"
-
-msgid "Input request here"
-msgstr "Anfrage hier eingeben"
-
-#, c-format
-msgid "Successfully joined Qun %s (%u)"
-msgstr "Qun %s (%u) erfolgreich betreten"
-
-msgid "Successfully joined Qun"
-msgstr "Qun erfolgreich betreten"
-
-#, c-format
-msgid "Qun %u denied from joining"
-msgstr "Qun %u hat Ihren Beitritt abgelehnt"
-
-msgid "QQ Qun Operation"
-msgstr "QQ-Qun-Operation"
-
-msgid "Failed:"
-msgstr "Gescheitert:"
-
-msgid "Join Qun, Unknown Reply"
-msgstr "Qun-Beitritt, Unbekannte Antwort"
-
-msgid "Quit Qun"
-msgstr "Qun verlassen"
-
-msgid ""
-"Note, if you are the creator, \n"
-"this operation will eventually remove this Qun."
-msgstr ""
-"Beachten Sie, dass diese Operation den Qun entfernen könnte, \n"
-"wenn Sie der Ersteller sind."
-
-msgid "Sorry, you are not our style"
-msgstr "Tut mir Leid, du bist nicht unser Typ"
-
-msgid "Successfully changed Qun members"
-msgstr "Qun-Mitglieder erfolgreich geändert"
-
-msgid "Successfully changed Qun information"
-msgstr "Qun-Informationen erfolgreich bearbeitet"
-
-msgid "You have successfully created a Qun"
-msgstr "Sie haben einen Qun angelegt"
-
-msgid "Would you like to set up detailed information now?"
-msgstr "Möchten Sie jetzt Detail-Informationen einstellen?"
-
-msgid "Setup"
-msgstr "Setup"
-
-#, c-format
-msgid "%u requested to join Qun %u for %s"
-msgstr "%u möchte dem Qun %u wegen %s beitreten"
-
-#, c-format
-msgid "%u request to join Qun %u"
-msgstr "%u möchte dem Qun %u beitreten"
-
-#, c-format
-msgid "Failed to join Qun %u, operated by admin %u"
-msgstr "Dem Qun %u, moderiert von admin %u, konnte nicht beigetreten werden"
-
-#, c-format
-msgid "<b>Joining Qun %u is approved by admin %u for %s</b>"
-msgstr ""
-"<b>Das Betreten des Qun %u wurde vom Admin bestätigt wegen by admin %u for "
-"%s</b>"
-
-#, c-format
-msgid "<b>Removed buddy %u.</b>"
-msgstr "<b>Buddy %u entfernt</b>"
-
-#, c-format
-msgid "<b>New buddy %u joined.</b>"
-msgstr "<b>Neuer Buddy %u ist beigetreten.</b>"
-
-#, c-format
-msgid "Unknown-%d"
-msgstr "Unbekannt-%d"
-
-msgid "Level"
-msgstr "Stufe"
-
-msgid " VIP"
-msgstr " VIP"
-
-msgid " TCP"
-msgstr " TCP"
-
-msgid " FromMobile"
-msgstr " FromMobile"
-
-msgid " BindMobile"
-msgstr " BindMobile"
-
-msgid " Video"
-msgstr " Video"
-
-msgid " Zone"
-msgstr " Zone"
-
-msgid "Flag"
-msgstr "Flagge"
-
-msgid "Ver"
-msgstr "Ver"
-
-msgid "Invalid name"
-msgstr "QQ: Ungültiger Name"
-
-msgid "Select icon..."
-msgstr "Icon wählen..."
-
-#, c-format
-msgid "<b>Login time</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Anmeldezeit</b>: %d-%d-%d, %d:%d:%d<br>\n"
-
-#, c-format
-msgid "<b>Total Online Buddies</b>: %d<br>\n"
-msgstr "<b>Insgesamt online</b>: %d<br>\n"
-
-#, c-format
-msgid "<b>Last Refresh</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Letzte Aktualisierung</b>: %d-%d-%d, %d:%d:%d<br>\n"
-
-#, c-format
-msgid "<b>Server</b>: %s<br>\n"
-msgstr "<b>Server</b>: %s<br>\n"
-
-#, c-format
-msgid "<b>Client Tag</b>: %s<br>\n"
-msgstr "<b>Marke des Clients</b>: %s<br>\n"
-
-#, c-format
-msgid "<b>Connection Mode</b>: %s<br>\n"
-msgstr "<b>Verbindungsmodus</b>: %s<br>\n"
-
-#, c-format
-msgid "<b>My Internet IP</b>: %s:%d<br>\n"
-msgstr "<b>Meine Internet-IP</b>: %s:%d<br>\n"
-
-#, c-format
-msgid "<b>Sent</b>: %lu<br>\n"
-msgstr "<b>Gesendet</b>: %lu<br>\n"
-
-#, c-format
-msgid "<b>Resend</b>: %lu<br>\n"
-msgstr "<b>Erneut senden</b>: %lu<br>\n"
-
-#, c-format
-msgid "<b>Lost</b>: %lu<br>\n"
-msgstr "<b>Verloren</b>: %lu<br>\n"
-
-#, c-format
-msgid "<b>Received</b>: %lu<br>\n"
-msgstr "<b>Empfangen</b>: %lu<br>\n"
-
-#, c-format
-msgid "<b>Received Duplicate</b>: %lu<br>\n"
-msgstr "<b>Duplikat empfangen</b>: %lu<br>\n"
-
-#, c-format
-msgid "<b>Time</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Zeit</b>: %d-%d-%d, %d:%d:%d<br>\n"
-
-#, c-format
-msgid "<b>IP</b>: %s<br>\n"
-msgstr "<b>IP</b>: %s<br>\n"
-
-msgid "Login Information"
-msgstr "Login-Informationen"
-
-msgid "<p><b>Original Author</b>:<br>\n"
-msgstr "<p><b>Original-Autor</b>:<br>\n"
-
-msgid "<p><b>Code Contributors</b>:<br>\n"
-msgstr "<p><b>Code-Mitwirkende</b>:<br>\n"
-
-msgid "<p><b>Lovely Patch Writers</b>:<br>\n"
-msgstr "<p><b>Wunderbare Patch-Schreiber</b>:<br>\n"
-
-msgid "<p><b>Acknowledgement</b>:<br>\n"
-msgstr "<p><b>Bestätigung</b>:<br>\n"
-
-msgid "<p><b>Scrupulous Testers</b>:<br>\n"
-msgstr "<p><b>Gewissenhafte Tester</b>:<br>\n"
-
-msgid "and more, please let me know... thank you!))"
-msgstr "und andere, bitten sagen Sie mir Bescheid... Danke!))"
-
-msgid "<p><i>And, all the boys in the backroom...</i><br>\n"
-msgstr "<p><i>Und all die Jungs im Hinterzimmer...</i><br>\n"
-
-msgid "<i>Feel free to join us!</i> :)"
-msgstr "<i>Treten Sie uns bei, wenn Sie mögen!</i> :)"
-
-#, c-format
-msgid "About OpenQ %s"
-msgstr "Über OpenQ %s"
-
-msgid "Change Icon"
-msgstr "Icon ändern"
-
-msgid "Change Password"
-msgstr "Passwort ändern"
-
-msgid "Account Information"
-msgstr "Kontoinformationen"
-
-msgid "Update all QQ Quns"
-msgstr "Alle QQ-Quns aktualisieren"
-
-msgid "About OpenQ"
-msgstr "Über OpenQ"
-
-msgid "Modify Buddy Memo"
-msgstr "Buddy-Notiz bearbeiten"
-
-#. *< type
-#. *< ui_requirement
-#. *< flags
-#. *< dependencies
-#. *< priority
-#. *< id
-#. *< name
-#. *< version
-#. *  summary
-#. *  description
-msgid "QQ Protocol Plugin"
-msgstr "QQ-Protokoll-Plugin"
-
-msgid "Auto"
-msgstr "Auto"
-
-msgid "Select Server"
-msgstr "Server wählen"
-
-msgid "QQ2008"
-msgstr "QQ2008"
-
-msgid "QQ2007"
-msgstr "QQ2007"
-
-msgid "QQ2005"
-msgstr "QQ2005"
-
-msgid "Connect by TCP"
-msgstr "Über TCP verbinden"
-
-msgid "Show server notice"
-msgstr "Server-Nachricht anzeigen"
-
-msgid "Show server news"
-msgstr "Server-News anzeigen"
-
-msgid "Show chat room when msg comes"
-msgstr "Chatraum zeigen, wenn Nachricht empfangen wird"
-
-msgid "Use default font"
-msgstr "Standardschriftart benutzen"
-
-msgid "Keep alive interval (seconds)"
-msgstr "Intervall zum Aufrechterhalten der Verbindung (Sekunden)"
-
-msgid "Update interval (seconds)"
-msgstr "Aktualisierungsintervall (Sekunden)"
-
-msgid "Unable to decrypt server reply"
-msgstr "Kann die Antwort des Servers nicht entschlüsseln"
-
-#, c-format
-msgid "Failed requesting token, 0x%02X"
-msgstr "Fehler beim Anfordern des Tokens, 0x%02X"
-
-#, c-format
-msgid "Invalid token len, %d"
-msgstr "Ungültige Länge des Tokens, %d"
-
-#. extend redirect used in QQ2006
-msgid "Redirect_EX is not currently supported"
-msgstr "Redirect_EX wird im Moment nicht unterstützt"
-
-#. need activation
-#. need activation
-#. need activation
-msgid "Activation required"
-msgstr "Aktivierung erforderlich"
-
-#, c-format
-msgid "Unknown reply code when logging in (0x%02X)"
-msgstr "Unbekannte Antwort bei der Anmeldung (0x%02X)"
-
-msgid "Requesting captcha"
-msgstr "Captcha anfordern"
-
-msgid "Checking captcha"
-msgstr "Captcha überprüfen"
-
-msgid "Failed captcha verification"
-msgstr "Captcha-Überprüfung fehlgeschlagen"
-
-msgid "Captcha Image"
-msgstr "Captcha-Bild"
-
-msgid "Enter code"
-msgstr "Geben Sie den Code ein"
-
-msgid "QQ Captcha Verification"
-msgstr "QQ-Captcha-Überprüfung"
-
-msgid "Enter the text from the image"
-msgstr "Bitte geben Sie den Text aus dem Bild ein"
-
-#, c-format
-msgid "Unknown reply when checking password (0x%02X)"
-msgstr "Unbekannte Antwort bei Überprüfungen des Passwortes (0x%02X)"
-
-#, c-format
-msgid ""
-"Unknown reply code when logging in (0x%02X):\n"
-"%s"
-msgstr ""
-"Unbekannte Antwort bei der Anmeldung (0x%02X):\n"
-"%s"
-
-msgid "Socket error"
-msgstr "Socket-Fehler"
-
-msgid "Getting server"
-msgstr "Hole server"
-
-msgid "Requesting token"
-msgstr "Fordere Token an"
-
-msgid "Unable to resolve hostname"
-msgstr "Hostname konnte nicht aufgelöst werden"
-
-msgid "Invalid server or port"
-msgstr "Ungültiger Server oder Port"
-
-msgid "Connecting to server"
-msgstr "Verbinde mit Server"
-
-msgid "QQ Error"
-msgstr "QQ-Fehler"
-
-#, c-format
-msgid ""
-"Server News:\n"
-"%s\n"
-"%s\n"
-"%s"
-msgstr ""
-"Server-News:\n"
-"%s\n"
-"%s\n"
-"%s"
-
-#, c-format
-msgid "%s:%s"
-msgstr "%s:%s"
-
-#, c-format
-msgid "From %s:"
-msgstr "Von %s:"
-
-#, c-format
-msgid ""
-"Server notice From %s: \n"
-"%s"
-msgstr ""
-"Servernotiz von %s: \n"
-"%s"
-
-msgid "Unknown SERVER CMD"
-msgstr "Unbekanntes SERVER-CMD"
-
-#, c-format
-msgid ""
-"Error reply of %s(0x%02X)\n"
-"Room %u, reply 0x%02X"
-msgstr ""
-"Fehlerantwort von %s(0x%02X)\n"
-"Raum %u, Antwort 0x%02X"
-
-msgid "QQ Qun Command"
-msgstr "QQ-Qun-Kommando"
-
-msgid "Unable to decrypt login reply"
-msgstr "Konnte die Antwort der Anmeldung nicht entschlüsseln"
-
-msgid "Unknown LOGIN CMD"
-msgstr "Unbekanntes LOGIN-CMD"
-
-msgid "Unknown CLIENT CMD"
-msgstr "Unbekanntes CLIENT-CMD"
-
-#, c-format
-msgid "%d has declined the file %s"
-msgstr "%d hat die Datei %s abgelehnt"
-
-msgid "File Send"
-msgstr "Dateiübertragung"
-
-#, c-format
-msgid "%d cancelled the transfer of %s"
-msgstr "%d hat die Übertragung von %s abgebrochen"
-
 #, c-format
 msgid "<b>Group Title:</b> %s<br>"
 msgstr "<b>Gruppentitel:</b> %s<br>"
@@ -9700,6 +9069,9 @@
 msgid "Unit"
 msgstr "Abteilung"
 
+msgid "Note"
+msgstr "Bemerkung"
+
 msgid "Join Chat"
 msgstr "Chat betreten"
 
@@ -10358,6 +9730,9 @@
 msgid "Unable to create listen socket"
 msgstr "Lauschender Socket konnte nicht erstellt werden"
 
+msgid "Unable to resolve hostname"
+msgstr "Hostname konnte nicht aufgelöst werden"
+
 msgid "SIP usernames may not contain whitespaces or @ symbols"
 msgstr "SIP-Benutzernamen dürfen keine Leerzeichen oder @-Symbole enthalten"
 
@@ -10474,6 +9849,9 @@
 msgid "Yahoo! system message for %s:"
 msgstr "Yahoo!-Systemnachricht für %s:"
 
+msgid "Authorization denied message:"
+msgstr "Nachricht für die Ablehnung der Autorisierung:"
+
 #, c-format
 msgid ""
 "%s has (retroactively) denied your request to add them to your list for the "
@@ -11272,15 +10650,18 @@
 msgid "No Proxy"
 msgstr "Kein Proxy"
 
-msgid "HTTP"
-msgstr "HTTP"
-
 msgid "SOCKS 4"
 msgstr "SOCKS 4"
 
 msgid "SOCKS 5"
 msgstr "SOCKS 5"
 
+msgid "Tor/Privacy (SOCKS5)"
+msgstr "Tor/Privatsphäre (SOCKS5)"
+
+msgid "HTTP"
+msgstr "HTTP"
+
 msgid "Use Environmental Settings"
 msgstr "Benutze Umgebungsvariablen"
 
@@ -11308,8 +10689,14 @@
 msgid "Pa_ssword:"
 msgstr "P_asswort:"
 
+msgid "Use _silence suppression"
+msgstr "Benutze _Geräuschunterdrückung"
+
+msgid "_Voice and Video"
+msgstr "Sprache und _Video"
+
 msgid "Unable to save new account"
-msgstr "Kann neues Konto nicht speichern"
+msgstr "Sitzung wird fortgesetzt<"
 
 msgid "An account already exists with the specified criteria."
 msgstr "Ein Konto mit den angegebenen Daten existiert bereits."
@@ -11357,10 +10744,21 @@
 "bearbeiten oder löschen"
 
 #, c-format
+msgid ""
+"<a href=\"viewinfo\">%s</a>%s%s%s wants to add you (%s) to his or her buddy "
+"list%s%s"
+msgstr ""
+"<a href=\"viewinfo\">%s</a>%s%s%s möchte Sie (%s) zu seiner oder ihrer Buddy-"
+"Liste hinzufügen%s%s"
+
+#, c-format
 msgid "%s%s%s%s wants to add you (%s) to his or her buddy list%s%s"
 msgstr ""
 "%s%s%s%s möchte Sie (%s) zu seiner oder ihrer Buddy-Liste hinzufügen%s%s"
 
+msgid "Send Instant Message"
+msgstr "Sofortnachricht senden"
+
 #. Buddy List
 msgid "Background Color"
 msgstr "Hintergrundfarbe"
@@ -11918,6 +11316,9 @@
 msgid "(Optional) A_lias:"
 msgstr "(Optionaler) A_lias:"
 
+msgid "(Optional) _Invite message:"
+msgstr "(Optionale) _Einladungsnachricht:"
+
 msgid "Add buddy to _group:"
 msgstr "Buddy zu folgender _Gruppe hinzufügen:"
 
@@ -13404,6 +12805,13 @@
 msgid "New Pounces"
 msgstr "Neuer Alarm"
 
+#. Translators: Make sure you translate "Dismiss" differently than
+#. "close"!  This string is used in the "You have pounced" dialog
+#. that appears when one of your Buddy Pounces is triggered.  In
+#. this context "Dismiss" means "I acknowledge that I've seen that
+#. this pounce was triggered--remove it from this list."  Translating
+#. it as "Remove" is acceptable if you can't think of a more precise
+#. word.
 msgid "Dismiss"
 msgstr "Verwerfen"
 
@@ -14530,6 +13938,9 @@
 msgid "PubSub Leaf"
 msgstr "PubSub-Blatt"
 
+msgid "Other"
+msgstr "Andere"
+
 msgid ""
 "\n"
 "<b>Description:</b> "
@@ -15394,6 +14805,21 @@
 msgid "D_evice"
 msgstr "G_erät"
 
+msgid "DROP"
+msgstr "VERWERFEN"
+
+msgid "Volume:"
+msgstr "Lautstärke:"
+
+msgid "Silence threshold:"
+msgstr "Schwellwert für Stille:"
+
+msgid "Input and Output Settings"
+msgstr "Ein- und Ausgabeeinstellungen"
+
+msgid "Microphone Test"
+msgstr "Mikrofontest"
+
 #. *< magic
 #. *< major version
 #. *< minor version
@@ -15406,9 +14832,6 @@
 msgid "Voice/Video Settings"
 msgstr "Sprach-/Video-Einstellungen"
 
-msgid "Voice and Video Settings"
-msgstr "Sprach- und Video-Einstellungen"
-
 #. *< name
 #. *< version
 msgid "Configure your microphone and webcam."