changeset 30291:8e2da15b17cd

propagate from branch 'im.pidgin.pidgin.mxit' (head 82e7f1b7c8af5634ca7519af59901321eab7e8dc) to branch 'im.pidgin.pidgin' (head f29f6311de2cbcfb2ad3a7bec45d9a4dc3f6a1f4)
author Mark Doliner <mark@kingant.net>
date Fri, 23 Jul 2010 18:18:04 +0000
parents bcc196eb47c2 (current diff) 901a57549910 (diff)
children 9e42b9ea8fd3 fdc865966b01
files
diffstat 15 files changed, 225 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Jul 20 13:44:56 2010 +0000
+++ b/ChangeLog	Fri Jul 23 18:18:04 2010 +0000
@@ -1,6 +1,6 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.7.2 (??/??/????):
+version 2.7.3 (??/??/????):
 	General:
 	* Use silent build rules for automake >1.11. You can enable verbose
 	  builds with the --disable-silent-rules configure option, or using
@@ -46,6 +46,18 @@
 	* Fix file transfers that get stuck with "Waiting for transfer to
 	  begin".
 
+version 2.7.2 (07/21/2010):
+	AIM and ICQ:
+	* Fix a crash bug related to X-Status messages that can be triggered by
+	  remove users.  This is CVE-2010-2528.
+	* Fix a rare crash bug caused by certain incoming SMS messages
+	  (discovered by Jan Kaluza--thanks Jan!).
+	* Change HTML sent from ICQ accounts so that official ICQ clients
+	  hopefully display it correctly.
+
+	MSN:
+	* Fix a crash related to fast buddy icon transfers.
+
 version 2.7.1 (05/29/2010):
 	General:
 	* Build fixes on OpenSolaris.  (Brian Lu)
--- a/ChangeLog.API	Tue Jul 20 13:44:56 2010 +0000
+++ b/ChangeLog.API	Fri Jul 23 18:18:04 2010 +0000
@@ -1,12 +1,16 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.7.2 (??/??/????):
+version 2.7.3 (??/??/????):
 	libpurple:
 		Fixed:
 		* purple_account_[gs]et_public_alias no longer crash when
 		  called for a protocol that doesn't support the underlying
 		  calls and the caller does not specify a failure callback.
 
+	Perl:
+		Added:
+		* Exposed log-subsystem signals.
+
 	Pidgin:
 		Changed:
 		* Changing the visibility (gtk_widget_hide/show) of
@@ -20,6 +24,9 @@
 		  gnt_tree_row_get_prev, gnt_tree_row_get_child and
 		  gnt_tree_row_get_parent.
 
+version 2.7.2 (07/21/2010):
+	* No changes
+
 version 2.7.1 (05/29/2010):
 	* No changes
 
--- a/ChangeLog.win32	Tue Jul 20 13:44:56 2010 +0000
+++ b/ChangeLog.win32	Fri Jul 23 18:18:04 2010 +0000
@@ -1,6 +1,9 @@
 Starting with Pidgin version 2.7.1, this ChangeLog file will no longer be
 updated.  It will be kept in the source tree for historical reasons only.
 
+version 2.7.1 (05/29/2010):
+	* No changes
+
 version 2.7.0 (05/12/2010):
 	* Updated GTK+ to 2.16.6
 	* Private GTK+ Runtime now used (GTK+ Installer no longer supported)
--- a/NEWS	Tue Jul 20 13:44:56 2010 +0000
+++ b/NEWS	Fri Jul 23 18:18:04 2010 +0000
@@ -2,6 +2,11 @@
 
 Our development blog is available at: http://planet.pidgin.im
 
+2.7.2 (07/21/2010):
+	Mark: We discovered a security issue in Pidgin 2.7.0 and 2.7.1 and
+	decided to release a patched version quickly.  This release contains
+	the fix for that crash, and a few other minor fixes.
+
 2.7.1 (05/29/2010):
 	Elliott: Hey, I'm first!  How did that happen?!  Maybe because of the
 	interesting changes in this release.  Sure there were quite a few bug
@@ -12,7 +17,7 @@
 	previous release!  This fixes a number of bugs that you've all been
 	reporting a ton of duplicate tickets about and even gives you the new
 	direct connection file transfer support for MSN.  Enjoy!
-	
+
 	Marcus: Quite a bit quicker to get this release out, compared with the
 	previous one :).  Fixes a number of bugs, and I'm sure the MSN direct
 	connections will please many users.  Enjoy!
--- a/configure.ac	Tue Jul 20 13:44:56 2010 +0000
+++ b/configure.ac	Fri Jul 23 18:18:04 2010 +0000
@@ -46,7 +46,7 @@
 m4_define([purple_lt_current], [7])
 m4_define([purple_major_version], [2])
 m4_define([purple_minor_version], [7])
-m4_define([purple_micro_version], [2])
+m4_define([purple_micro_version], [3])
 m4_define([purple_version_suffix], [devel])
 m4_define([purple_version],
           [purple_major_version.purple_minor_version.purple_micro_version])
--- a/libpurple/plugins/perl/common/Log.xs	Tue Jul 20 13:44:56 2010 +0000
+++ b/libpurple/plugins/perl/common/Log.xs	Fri Jul 23 18:18:04 2010 +0000
@@ -27,6 +27,9 @@
 		newCONSTSUB(flags_stash, (char *)civ->name, newSViv(civ->iv));
 }
 
+Purple::Handle
+purple_log_get_handle()
+
 int
 purple_log_common_sizer(log)
 	Purple::Log log
--- a/libpurple/protocols/msn/notification.c	Tue Jul 20 13:44:56 2010 +0000
+++ b/libpurple/protocols/msn/notification.c	Fri Jul 23 18:18:04 2010 +0000
@@ -409,7 +409,7 @@
 
 /* add contact to xmlnode */
 static void
-msn_add_contact_xml(MsnSession *session, xmlnode *mlNode,const char *passport, MsnListOp list_op, MsnNetwork networkId)
+msn_add_contact_xml(xmlnode *mlNode, const char *passport, MsnListOp list_op, MsnNetwork networkId)
 {
 	xmlnode *d_node,*c_node;
 	char **tokens;
@@ -543,8 +543,8 @@
 
 		adl_node = xmlnode_new("ml");
 		xmlnode_set_attrib(adl_node, "l", "1");
-		msn_add_contact_xml(session, adl_node, passport,
-				user->list_op & MSN_LIST_OP_MASK, network);
+		msn_add_contact_xml(adl_node, passport,
+		                    user->list_op & MSN_LIST_OP_MASK, network);
 		payload = xmlnode_to_str(adl_node, &payload_len);
 		msn_notification_post_adl(session->notification->cmdproc, payload, payload_len);
 		g_free(payload);
@@ -600,8 +600,9 @@
 		}
 
 		if (user->networkid != MSN_NETWORK_UNKNOWN) {
-			msn_add_contact_xml(session, adl_node, user->passport,
-				user->list_op & MSN_LIST_OP_MASK, user->networkid);
+			msn_add_contact_xml(adl_node, user->passport,
+			                    user->list_op & MSN_LIST_OP_MASK,
+			                    user->networkid);
 
 			/* each ADL command may contain up to 150 contacts */
 			if (++adl_count % 150 == 0) {
@@ -630,8 +631,7 @@
 				purple_debug_info("msn", "Adding FQY address, count is %d\n",
 				                  session->adl_fqy);
 
-			msn_add_contact_xml(session, fqy_node, user->passport,
-				0, user->networkid);
+			msn_add_contact_xml(fqy_node, user->passport, 0, user->networkid);
 
 			/* each FQY command may contain up to 150 contacts, probably */
 			if (++fqy_count % 150 == 0) {
@@ -674,6 +674,8 @@
 	xmlnode_free(adl_node);
 	xmlnode_free(fqy_node);
 
+	msn_session_activate_login_timeout(session);
+
 	pc = purple_account_get_connection(session->account);
 	display_name = purple_connection_get_display_name(pc);
 	if (display_name
@@ -1956,8 +1958,7 @@
 	node = xmlnode_new("ml");
 	node->child = NULL;
 
-	msn_add_contact_xml(session, node, passport,
-	                    addrem->list_op, network);
+	msn_add_contact_xml(node, passport, addrem->list_op, network);
 
 	payload = xmlnode_to_str(node, &payload_len);
 	xmlnode_free(node);
@@ -1987,8 +1988,7 @@
 	adl_node = xmlnode_new("ml");
 	adl_node->child = NULL;
 
-	msn_add_contact_xml(notification->session, adl_node, user->passport,
-	                    list_op, user->networkid);
+	msn_add_contact_xml(adl_node, user->passport, list_op, user->networkid);
 
 	payload = xmlnode_to_str(adl_node, &payload_len);
 	xmlnode_free(adl_node);
@@ -2026,8 +2026,7 @@
 	rml_node = xmlnode_new("ml");
 	rml_node->child = NULL;
 
-	msn_add_contact_xml(notification->session, rml_node, user->passport,
-	                    list_op, user->networkid);
+	msn_add_contact_xml(rml_node, user->passport, list_op, user->networkid);
 
 	payload = xmlnode_to_str(rml_node, &payload_len);
 	xmlnode_free(rml_node);
--- a/libpurple/protocols/msn/session.c	Tue Jul 20 13:44:56 2010 +0000
+++ b/libpurple/protocols/msn/session.c	Fri Jul 23 18:18:04 2010 +0000
@@ -131,6 +131,11 @@
 	if (!session->connected)
 		return;
 
+	if (session->login_timeout) {
+		purple_timeout_remove(session->login_timeout);
+		session->login_timeout = 0;
+	}
+
 	session->connected = FALSE;
 
 	while (session->switches != NULL)
@@ -258,6 +263,28 @@
 	return swboard;
 }
 
+static gboolean
+msn_login_timeout_cb(gpointer data)
+{
+	MsnSession *session = data;
+	/* This forces the login process to finish, even though we haven't heard
+	   a response for our FQY requests yet. We'll at least end up online to the
+	   people we've already added. The rest will follow later. */
+	msn_session_finish_login(session);
+	session->login_timeout = 0;
+	return FALSE;
+}
+
+void
+msn_session_activate_login_timeout(MsnSession *session)
+{
+	if (!session->logged_in) {
+		session->login_timeout =
+			purple_timeout_add_seconds(MSN_LOGIN_FQY_TIMEOUT,
+			                           msn_login_timeout_cb, session);
+	}
+}
+
 static void
 msn_session_sync_users(MsnSession *session)
 {
@@ -362,6 +389,9 @@
 			msg = g_strdup_printf(_("Unable to authenticate: %s"),
 								  (info == NULL ) ?
 								  _("Unknown error") : info);
+			/* Clear the password if it isn't being saved */
+			if (!purple_account_get_remember_password(session->account))
+				purple_account_set_password(session->account, NULL);
 			break;
 		case MSN_ERROR_BAD_BLIST:
 			reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
--- a/libpurple/protocols/msn/session.h	Tue Jul 20 13:44:56 2010 +0000
+++ b/libpurple/protocols/msn/session.h	Fri Jul 23 18:18:04 2010 +0000
@@ -59,6 +59,8 @@
 
 #define MSN_LOGIN_STEPS MSN_LOGIN_STEP_END
 
+#define MSN_LOGIN_FQY_TIMEOUT 30
+
 #include "group.h"
 #include "httpconn.h"
 #include "nexus.h"
@@ -83,6 +85,7 @@
 	gboolean connected;
 	gboolean logged_in; /**< A temporal flag to ignore local buddy list adds. */
 	int      adl_fqy; /**< A count of ADL/FQY so status is only changed once. */
+	guint    login_timeout; /**< Timeout to force status change if ADL/FQY fail. */
 	gboolean destroying; /**< A flag that states if the session is being destroyed. */
 	gboolean http_method;
 
@@ -213,7 +216,16 @@
 						   const char *info);
 
 /**
- * Sets the current step in the login proccess.
+ * Starts a timeout to initiate finishing login. Sometimes the server ignores
+ * our FQY requests, so this forces ourselves online eventually.
+ *
+ * @param session The MSN session.
+ */
+void
+msn_session_activate_login_timeout(MsnSession *session);
+
+/**
+ * Sets the current step in the login process.
  *
  * @param session The MSN session.
  * @param step The current step.
--- a/libpurple/protocols/msn/switchboard.c	Tue Jul 20 13:44:56 2010 +0000
+++ b/libpurple/protocols/msn/switchboard.c	Fri Jul 23 18:18:04 2010 +0000
@@ -740,8 +740,13 @@
 	else if ((swboard->current_users > 1) ||
 			 (purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT))
 	{
+		GList *passport;
 		/* This is a switchboard used for a chat */
 		purple_conv_chat_remove_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL);
+
+		passport = g_list_find_custom(swboard->users, user, (GCompareFunc)strcmp);
+		g_free(passport->data);
+		swboard->users = g_list_delete_link(swboard->users, passport);
 		swboard->current_users--;
 		if (swboard->current_users == 0)
 			msn_switchboard_destroy(swboard);
--- a/libpurple/protocols/oscar/family_icbm.c	Tue Jul 20 13:44:56 2010 +0000
+++ b/libpurple/protocols/oscar/family_icbm.c	Fri Jul 23 18:18:04 2010 +0000
@@ -249,9 +249,6 @@
 	}
 	g_free(buf);
 
-
-
-
 	g_free(snac2->data);
 	g_free(snac2);
 
@@ -2687,7 +2684,6 @@
 	guint16 hdrlen;
 	int curpos;
 	guint16 num1, num2;
-	char *desc, *title, *temp;
 	PurpleAccount *account;
 	PurpleBuddy *buddy;
 	PurplePresence *presence;
@@ -2714,33 +2710,41 @@
 				xml = byte_stream_getstr(bs, bs->len - curpos);
 				purple_debug_misc("oscar", "X-Status: Received XML reply\n");
 				if (xml) {
-				/* purple_debug_misc("oscar", "X-Status: XML reply: %s\n", xml); */
-					desc = strstr(xml, "&lt;desc&gt;");
-					if (desc != NULL) {
-						temp = strstr(xml, "&lt;/desc&gt;");
-						temp[0] = 0;
-						desc = desc + 12;
+					GString *xstatus;
+					char *tmp1, *tmp2;
+
+					/* purple_debug_misc("oscar", "X-Status: XML reply: %s\n", xml); */
+
+					xstatus = g_string_new(NULL);
+
+					tmp1 = strstr(xml, "&lt;title&gt;");
+					if (tmp1 != NULL) {
+						tmp1 += 13;
+						tmp2 = strstr(tmp1, "&lt;/title&gt;");
+						if (tmp2 != NULL)
+							g_string_append_len(xstatus, tmp1, tmp2 - tmp1);
 					}
-					title = strstr(xml, "&lt;title&gt;");
-					if (title != NULL) {
-						temp = strstr(xml, "&lt;/title&gt;");
-						temp[0] = 0;
-						title = title + 13;
-					} else {
-						title = "";
+					tmp1 = strstr(xml, "&lt;desc&gt;");
+					if (tmp1 != NULL) {
+						tmp1 += 12;
+						tmp2 = strstr(tmp1, "&lt;/desc&gt;");
+						if (tmp2 != NULL) {
+							if (xstatus->len > 0)
+								g_string_append(xstatus, " - ");
+							g_string_append_len(xstatus, tmp1, tmp2 - tmp1);
+						}
 					}
-					strcpy(xml,title);
-					if (desc) {
-						strcat(xml, " - ");
-						strcat(xml, desc);
+					if (xstatus->len > 0) {
+						purple_debug_misc("oscar", "X-Status reply: %s\n", xstatus->str);
+						account = purple_connection_get_account(od->gc);
+						buddy = purple_find_buddy(account, bn);
+						presence = purple_buddy_get_presence(buddy);
+						status = purple_presence_get_active_status(presence);
+						purple_prpl_got_user_status(account, bn,
+								purple_status_get_id(status),
+								"message", xstatus->str, NULL);
 					}
-					purple_debug_misc("oscar", "X-Status reply: %s\n", xml);
-					account = purple_connection_get_account(od->gc);
-					buddy = purple_find_buddy(account, bn);
-					presence = purple_buddy_get_presence(buddy);
-					status = purple_presence_get_active_status(presence);
-					purple_prpl_got_user_status(account, bn,
-							purple_status_get_id(status), "message", xml, NULL);
+					g_string_free(xstatus, TRUE);
 				} else {
 					purple_debug_misc("oscar", "X-Status: Can't get XML reply string\n");
 				}
--- a/libpurple/protocols/oscar/oscar.c	Tue Jul 20 13:44:56 2010 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Fri Jul 23 18:18:04 2010 +0000
@@ -3028,12 +3028,23 @@
 			if (smstype != 0)
 				break;
 			taglen = byte_stream_getle32(&qbs);
+			if (taglen > 2000) {
+				/* Avoid trying to allocate large amounts of memory, in
+				   case we get something unexpected. */
+				break;
+			}
 			tagstr = byte_stream_getstr(&qbs, taglen);
 			if (tagstr == NULL)
 				break;
 			byte_stream_advance(&qbs, 3);
 			byte_stream_advance(&qbs, 4);
 			smslen = byte_stream_getle32(&qbs);
+			if (smslen > 2000) {
+				/* Avoid trying to allocate large amounts of memory, in
+				   case we get something unexpected. */
+				g_free(tagstr);
+				break;
+			}
 			smsmsg = byte_stream_getstr(&qbs, smslen);
 
 			/* Check if this is an SMS being sent from server */
--- a/libpurple/purple-url-handler	Tue Jul 20 13:44:56 2010 +0000
+++ b/libpurple/purple-url-handler	Fri Jul 23 18:18:04 2010 +0000
@@ -73,7 +73,8 @@
 def findaccount(protocolname, accountname="", matcher=None):
     if matcher:
         for account in cpurple.PurpleAccountsGetAll():
-            if accountname != "" and accountname != cpurple.PurpleAccountGetUsername(a):
+            if (protocolname != cpurple.PurpleAccountGetProtocolID(account)) or \
+               (accountname != "" and accountname != cpurple.PurpleAccountGetUsername(account)):
                 continue
             if matcher(account):
                 bring_account_online(account)
@@ -182,7 +183,7 @@
 
 def irc(uri):
     protocol = "prpl-irc"
-    match = re.match(r"^irc:(//([^/]*)/)?([^?]*)(\?(.*))?", uri)
+    match = re.match(r"^irc:(//([^/]*))?/?([^?]*)(\?(.*))?", uri)
     if not match:
         print "Invalid irc URI: %s" % uri
         return
@@ -207,7 +208,7 @@
 
     def correct_server(account):
         username = cpurple.PurpleAccountGetUsername(account)
-        return ("@" in username) and (server == (username.split("@"))[1])
+        return ((server == "") or ("@" in username) and (server == (username.split("@"))[1]))
 
     account = findaccount(protocol, matcher=correct_server)
 
--- a/po/ChangeLog	Tue Jul 20 13:44:56 2010 +0000
+++ b/po/ChangeLog	Fri Jul 23 18:18:04 2010 +0000
@@ -1,5 +1,8 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 2.7.2
+	* No changes
+
 version 2.7.1
 	* Chinese (Hong Kong) translation updated (Ambrose C. Li, Paladin R.
 	  Liu)
--- a/po/de.po	Tue Jul 20 13:44:56 2010 +0000
+++ b/po/de.po	Fri Jul 23 18:18:04 2010 +0000
@@ -11,14 +11,14 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-30 23:15-0400\n"
-"PO-Revision-Date: 2010-05-29 17:30+0200\n"
+"POT-Creation-Date: 2010-07-20 19:00+0200\n"
+"PO-Revision-Date: 2010-07-20 18:52+0200\n"
 "Last-Translator: Björn Voigt <bjoern@cs.tu-berlin.de>\n"
 "Language-Team: Deutsch <de@li.org>\n"
-"Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. Translators may want to transliterate the name.
@@ -65,12 +65,27 @@
 msgid "Error"
 msgstr "Fehler"
 
+msgid "Account was not modified"
+msgstr "Konto wurde nicht modifiziert"
+
 msgid "Account was not added"
 msgstr "Konto wurde nicht hinzugefügt"
 
 msgid "Username of an account must be non-empty."
 msgstr "Benutzername eines Kontos darf nicht leer sein."
 
+msgid ""
+"The account's protocol cannot be changed while it is connected to the server."
+msgstr ""
+"Das Protokoll des Kontos kann nicht geändert werden solange das Konto mit "
+"dem Server verbunden ist."
+
+msgid ""
+"The account's username cannot be changed while it is connected to the server."
+msgstr ""
+"Der Benutzername des Kontos kann nicht geändert werden solange das Konto mit "
+"dem Server verbunden ist."
+
 msgid "New mail notifications"
 msgstr "Benachrichtigung über neue Mails"
 
@@ -1269,6 +1284,9 @@
 msgid "Someone says your username in chat"
 msgstr "Jemand nennt Ihren Benutzernamen im Chat"
 
+msgid "Attention received"
+msgstr "Aufmerksamkeitsgesuch erhalten"
+
 msgid "GStreamer Failure"
 msgstr "GStreamer-Fehler"
 
@@ -1685,8 +1703,12 @@
 "Diesem Zertifikat wird nicht vertraut, da kein Zertifikat bestätigen kann, "
 "dass ihm aktuell vertraut wird."
 
-msgid "The certificate is not valid yet."
-msgstr "Das Zertifikat ist noch nicht gültig."
+msgid ""
+"The certificate is not valid yet.  Check that your computer's date and time "
+"are accurate."
+msgstr ""
+"Das Zertifikat ist nicht mehr gültig.  Überprüfen Sie, ob Datum und Zeit "
+"Ihres Computers stimmen."
 
 msgid "The certificate has expired and should not be considered valid."
 msgstr ""
@@ -3857,6 +3879,19 @@
 "Der Server ist der Meinung, dass die Authentifizierung vollständig ist, der "
 "Client aber nicht"
 
+msgid "Server may require plaintext authentication over an unencrypted stream"
+msgstr ""
+"Der Server könnte eine Klartext-Authentifizierung über einen "
+"unverschlüsselten Kanal anfordern"
+
+#, c-format
+msgid ""
+"%s may require plaintext authentication over an unencrypted connection.  "
+"Allow this and continue authentication?"
+msgstr ""
+"%s könnte eine Klartext-Authentifizierung über einen unverschlüsselten Kanal "
+"anfordern.  Wollen Sie dies erlauben und mit der Authentifikation fortfahren?"
+
 msgid "SASL authentication failed"
 msgstr "SASL-Authentifizierung fehlgeschlagen"
 
@@ -6175,17 +6210,14 @@
 msgstr "Startbildschirm-Popup aktivieren"
 
 #. you were kicked
-#, fuzzy
 msgid "You have been kicked from this MultiMX."
-msgstr "Sie wurden hinausgeworfen: (%s)"
-
-#, fuzzy
+msgstr "Sie wurden von MultiMX hinausgeworfen."
+
 msgid "was kicked"
-msgstr "Falsches Ticket"
-
-#, fuzzy
+msgstr "wurde hinausgeworfen"
+
 msgid "_Room Name:"
-msgstr "_Raum:"
+msgstr "_Raumname:"
 
 #. we must have lost the connection, so terminate it so that we can reconnect
 msgid "We have lost the connection to MXit. Please reconnect."
@@ -6767,8 +6799,8 @@
 #, c-format
 msgid "Unable to send message. Could not get details for user (%s)."
 msgstr ""
-"Kann die Nachricht nicht senden. Kann die Details vom Benutzer nicht holen "
-"(%s)."
+"Kann die Nachricht nicht senden. Kann die Details vom Benutzer nicht holen (%"
+"s)."
 
 #, c-format
 msgid "Unable to add %s to your buddy list (%s)."
@@ -6786,8 +6818,8 @@
 #, c-format
 msgid "Unable to send message to %s. Could not create the conference (%s)."
 msgstr ""
-"Kann die Nachricht nicht an %s senden. Kann die Konferenz nicht erstellen "
-"(%s)."
+"Kann die Nachricht nicht an %s senden. Kann die Konferenz nicht erstellen (%"
+"s)."
 
 #, c-format
 msgid "Unable to send message. Could not create the conference (%s)."
@@ -7200,8 +7232,8 @@
 "(There was an error receiving this message.  Either you and %s have "
 "different encodings selected, or %s has a buggy client.)"
 msgstr ""
-"(Es gab einen Fehler beim Empfang dieser Nachricht.  Entweder haben Sie und "
-"%s unterschiedliche Kodierungen gesetzt oder %s hat einen fehlerhaften "
+"(Es gab einen Fehler beim Empfang dieser Nachricht.  Entweder haben Sie und %"
+"s unterschiedliche Kodierungen gesetzt oder %s hat einen fehlerhaften "
 "Client.)"
 
 #. Label
@@ -7512,10 +7544,10 @@
 msgid_plural ""
 "You missed %hu messages from %s because the rate limit has been exceeded."
 msgstr[0] ""
-"Sie haben %hu Nachricht von %s nicht erhalten, da die Senderate "
+"Sie haben %hu Nachricht von %s nicht erhalten, da die Datenrate "
 "überschritten wurde."
 msgstr[1] ""
-"Sie haben %hu Nachrichten von %s nicht erhalten, da die Senderate "
+"Sie haben %hu Nachrichten von %s nicht erhalten, da die Datenrate "
 "überschritten wurde."
 
 #, c-format
@@ -7989,11 +8021,11 @@
 msgid "Invalid SNAC"
 msgstr "Ungültiger SNAC"
 
-msgid "Rate to host"
-msgstr "Bewertung zum Host"
-
-msgid "Rate to client"
-msgstr "Bewertung zum Client"
+msgid "Server rate limit exceeded"
+msgstr "Server-Datenrate überschritten"
+
+msgid "Client rate limit exceeded"
+msgstr "Client-Datenrate überschritten"
 
 msgid "Service unavailable"
 msgstr "Dienst nicht verfügbar"
@@ -8428,8 +8460,8 @@
 #, 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>"
+"<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>"
@@ -10283,8 +10315,8 @@
 msgid "Ignore conference and chatroom invitations"
 msgstr "Konferenz- und Chateinladungen ignorieren"
 
-msgid "Use account proxy for SSL connections"
-msgstr "Proxy-Zugang für SSL-Verbindungen benutzen"
+msgid "Use account proxy for HTTP and HTTPS connections"
+msgstr "Proxy-Zugang für HTTP- und HTTPS-Verbindungen benutzen"
 
 msgid "Chat room list URL"
 msgstr "Chatraumliste (URL)"
@@ -12501,8 +12533,8 @@
 "to multiple messaging services at once.  %s is written in C using GTK+.  %s "
 "is released, and may be modified and redistributed,  under the terms of the "
 "GPL version 2 (or later).  A copy of the GPL is distributed with %s.  %s is "
-"copyrighted by its contributors, a list of whom is also distributed with "
-"%s.  There is no warranty for %s.<BR><BR>"
+"copyrighted by its contributors, a list of whom is also distributed with %"
+"s.  There is no warranty for %s.<BR><BR>"
 msgstr ""
 "%s ist ein Nachrichtendienst, basierend auf libpurple, der die Verbindung zu "
 "mehreren Nachrichtendiensten gleichzeitig unterstützt.  %s wird in C "
@@ -13074,16 +13106,16 @@
 
 #, c-format
 msgid ""
-"Are you sure you want to permanently delete the log of the conversation in "
-"%s which started at %s?"
+"Are you sure you want to permanently delete the log of the conversation in %"
+"s which started at %s?"
 msgstr ""
 "Wollen Sie wirklich den Mitschnitt der Unterhaltung in %s, gestartet am %s, "
 "permanent löschen?"
 
 #, c-format
 msgid ""
-"Are you sure you want to permanently delete the system log which started at "
-"%s?"
+"Are you sure you want to permanently delete the system log which started at %"
+"s?"
 msgstr ""
 "Wollen Sie wirklich den Systemmitschnitt, gestartet am %s, permanent löschen?"
 
@@ -14003,9 +14035,6 @@
 msgid "Custom Smiley Manager"
 msgstr "Verwaltung für benutzerdefinierte Smileys"
 
-msgid "Attention received"
-msgstr "Aufmerksamkeitsgesuch erhalten"
-
 msgid "Select Buddy Icon"
 msgstr "Buddy-Icon auswählen"
 
@@ -15429,13 +15458,13 @@
 #, no-c-format
 msgid ""
 "Error Installing Spellchecking ($R3).$\\rIf retrying fails, manual "
-"installation instructions are at: http://developer.pidgin.im/wiki/Installing"
-"%20Pidgin#manual_win32_spellcheck_installation"
+"installation instructions are at: http://developer.pidgin.im/wiki/Installing%"
+"20Pidgin#manual_win32_spellcheck_installation"
 msgstr ""
 "Fehler beim Installieren der Rechtschreibkontrolle ($R3).$\\rFalls ein "
 "erneuter Versuch fehlschlägt, finden Sie Anweisungen zur manuellen "
-"Installation unter: http://developer.pidgin.im/wiki/Installing"
-"%20Pidgin#manual_win32_spellcheck_installation"
+"Installation unter: http://developer.pidgin.im/wiki/Installing%"
+"20Pidgin#manual_win32_spellcheck_installation"
 
 #. Installer Subsection Text
 msgid "GTK+ Runtime (required if not present)"
@@ -15515,6 +15544,15 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "Sie haben keine Berechtigung, diese Anwendung zu deinstallieren."
 
+#~ msgid "The certificate is not valid yet."
+#~ msgstr "Das Zertifikat ist noch nicht gültig."
+
+#~ msgid "Rate to host"
+#~ msgstr "Bewertung zum Host"
+
+#~ msgid "Rate to client"
+#~ msgstr "Bewertung zum Client"
+
 #~ msgid "Unknown reason."
 #~ msgstr "Unbekannter Grund."