changeset 31180:6448e3f3ddd4

merge of '8f2d6c5138602b96aef4fbfbc5b47c202951201b' and 'e8c1e8a79ad64bd73663a15cc0e802b06a8bc733'
author John Bailey <rekkanoryo@rekkanoryo.org>
date Wed, 02 Feb 2011 06:26:19 +0000
parents 53096ba34fe6 (diff) 5ac05ae49c5c (current diff)
children 11be48c38c19 a92f4cb593a4
files ChangeLog
diffstat 12 files changed, 379 insertions(+), 233 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Feb 02 06:25:39 2011 +0000
+++ b/ChangeLog	Wed Feb 02 06:26:19 2011 +0000
@@ -10,6 +10,8 @@
 	* Perl bindings now respect LDFLAGS. (Peter Volkov, Markos Chandras)
 	  (#12638)
 	* Added AddTrust External Root CA.  (#11554)
+	* Resolve some issues validating X.509 certificates signed off the CAcert
+	  Class 3 intermediate cert when using the GnuTLS SSL/TLS plugin.
 
 	Gadu-Gadu:
 	* Don't drop whole messages when text is colored. (Jan Zachorowski)
@@ -58,6 +60,8 @@
 	  (Nikita Kozlov) (#13136)
 	* Handle Connection: Close headers for BOSH, when the server does not
 	  terminate the connection itself. (#13008)
+	* Improved parsing for DIGEST-MD5, which should resolve issues
+	  connecting to some jabberd2 servers. (#a14514)
 
 	Yahoo!/Yahoo! JAPAN:
 	* Fix a crash when an account disconnects before a p2p session is
--- a/libpurple/certificate.c	Wed Feb 02 06:25:39 2011 +0000
+++ b/libpurple/certificate.c	Wed Feb 02 06:26:19 2011 +0000
@@ -1602,7 +1602,7 @@
 	GSList *ca_crts, *cur;
 	GByteArray *last_fpr, *ca_fpr;
 	gboolean valid = FALSE;
-	gchar *ca_id;
+	gchar *ca_id, *ca2_id;
 
 	peer_crt = (PurpleCertificate *) chain->data;
 
@@ -1619,7 +1619,6 @@
 		return;
 	} /* if (self signed) */
 
-	/* Next, attempt to verify the last certificate against a CA */
 	ca = purple_certificate_find_pool(x509_tls_cached.scheme_name, "ca");
 
 	/* Next, check that the certificate chain is valid */
@@ -1669,6 +1668,9 @@
 		return;
 	} /* if (signature chain not good) */
 
+	/* Next, attempt to verify the last certificate is signed by a trusted
+	 * CA, or is a trusted CA (based on fingerprint).
+	 */
 	/* If, for whatever reason, there is no Certificate Authority pool
 	   loaded, we'll verify the subject name and then warn about thsi. */
 	if ( !ca ) {
@@ -1684,27 +1686,31 @@
 
 	end_crt = g_list_last(chain)->data;
 
-	/* Attempt to look up the last certificate's issuer */
-	ca_id = purple_certificate_get_issuer_unique_id(end_crt);
+	/* Attempt to look up the last certificate, and the last certificate's
+	 * issuer. 
+	 */
+	ca_id  = purple_certificate_get_issuer_unique_id(end_crt);
+	ca2_id = purple_certificate_get_unique_id(end_crt);
 	purple_debug_info("certificate/x509/tls_cached",
 			  "Checking for a CA with DN=%s\n",
 			  ca_id);
-	ca_crts = x509_ca_get_certs(ca_id);
+	purple_debug_info("certificate/x509/tls_cached",
+			  "Also checking for a CA with DN=%s\n",
+			  ca2_id);
+	ca_crts = g_slist_concat(x509_ca_get_certs(ca_id), x509_ca_get_certs(ca2_id));
+	g_free(ca_id);
+	g_free(ca2_id);
 	if ( NULL == ca_crts ) {
 		flags |= PURPLE_CERTIFICATE_CA_UNKNOWN;
 
 		purple_debug_warning("certificate/x509/tls_cached",
-				  "Certificate Authority with DN='%s' not "
-				  "found. I'll prompt the user, I guess.\n",
-				  ca_id);
-		g_free(ca_id);
+				  "No Certificate Authorities with either DN found "
+				  "found. I'll prompt the user, I guess.\n");
 
 		x509_tls_cached_check_subject_name(vrq, flags);
 		return;
 	}
 
-	g_free(ca_id);
-
 	/*
 	 * Check the fingerprints; if they match, then this certificate *is* one
 	 * of the designated "trusted roots", and we don't need to verify the
@@ -1714,10 +1720,6 @@
 	 *
 	 * If the fingerprints don't match, we'll fall back to checking the
 	 * signature.
-	 *
-	 * GnuTLS doesn't seem to include the final root in the verification
-	 * list, so this check will never succeed.  NSS *does* include it in
-	 * the list, so here we are.
 	 */
 	last_fpr = purple_certificate_get_fingerprint_sha1(end_crt);
 	for (cur = ca_crts; cur; cur = cur->next) {
--- a/libpurple/protocols/jabber/Makefile.am	Wed Feb 02 06:25:39 2011 +0000
+++ b/libpurple/protocols/jabber/Makefile.am	Wed Feb 02 06:26:19 2011 +0000
@@ -11,6 +11,7 @@
 			  auth.c \
 			  auth.h \
 			  auth_digest_md5.c \
+			  auth_digest_md5.h \
 			  auth_plain.c \
 			  auth_scram.c \
 			  auth_scram.h \
--- a/libpurple/protocols/jabber/auth_digest_md5.c	Wed Feb 02 06:25:39 2011 +0000
+++ b/libpurple/protocols/jabber/auth_digest_md5.c	Wed Feb 02 06:26:19 2011 +0000
@@ -27,6 +27,7 @@
 #include "util.h"
 #include "xmlnode.h"
 
+#include "auth_digest_md5.h"
 #include "auth.h"
 #include "jabber.h"
 
@@ -43,7 +44,7 @@
 }
 
 /* Parts of this algorithm are inspired by stuff in libgsasl */
-static GHashTable* parse_challenge(const char *challenge)
+GHashTable* jabber_auth_digest_md5_parse(const char *challenge)
 {
 	const char *token_start, *val_start, *val_end, *cur;
 	GHashTable *ret = g_hash_table_new_full(g_str_hash, g_str_equal,
@@ -77,12 +78,12 @@
 					val_start++;
 
 				val_end = cur;
-				while (val_end != val_start && (*val_end == ' ' || *val_end == ',' || *val_end == '\t'
+				while (val_end >= val_start && (*val_end == ' ' || *val_end == ',' || *val_end == '\t'
 						|| *val_end == '\r' || *val_end == '\n'
 						|| *val_end == '"'  || *val_end == '\0'))
 					val_end--;
 
-				if (val_start != val_end)
+				if (val_end - val_start + 1 >= 0)
 					value = g_strndup(val_start, val_end - val_start + 1);
 			}
 
@@ -186,7 +187,7 @@
 			dec_in != NULL ? strlen(dec_in) : 0,
 			dec_in != NULL  ? dec_in : "(null)");
 
-	parts = parse_challenge(dec_in);
+	parts = jabber_auth_digest_md5_parse(dec_in);
 
 	if (g_hash_table_lookup(parts, "rspauth")) {
 		char *rspauth = g_hash_table_lookup(parts, "rspauth");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/jabber/auth_digest_md5.h	Wed Feb 02 06:26:19 2011 +0000
@@ -0,0 +1,39 @@
+/**
+ * @file auth_digest_md5.h Implementation of SASL DIGEST-MD5 authentication
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef PURPLE_JABBER_AUTH_DIGEST_MD5_H_
+#define PURPLE_JABBER_AUTH_DIGEST_MD5_H_
+
+#include "internal.h"
+
+/*
+ * Every function in this file is ONLY exposed for tests.
+ * DO NOT USE ANYTHING HERE OR YOU WILL BE SENT TO THE PIT OF DESPAIR.
+ */
+
+/*
+ * Parse a DIGEST-MD5 challenge.
+ */
+GHashTable *jabber_auth_digest_md5_parse(const char *challenge);
+
+#endif /* PURPLE_JABBER_AUTH_DIGEST_MD5_H_ */
--- a/libpurple/protocols/jabber/bosh.c	Wed Feb 02 06:25:39 2011 +0000
+++ b/libpurple/protocols/jabber/bosh.c	Wed Feb 02 06:26:19 2011 +0000
@@ -365,6 +365,8 @@
 	chosen = find_available_http_connection(conn);
 
 	if (!chosen) {
+		if (type == PACKET_FLUSH)
+			return;
 		/*
 		 * For non-ordinary traffic, we can't 'buffer' it, so use the
 		 * first connection.
@@ -472,6 +474,8 @@
 	if (!bosh->pipelining)
 		return;
 
+	purple_debug_info("jabber", "BOSH: Disabling pipelining on conn %p\n",
+	                            bosh);
 	bosh->pipelining = FALSE;
 	if (bosh->connections[1] == NULL) {
 		bosh->connections[1] = jabber_bosh_http_connection_init(bosh);
--- a/libpurple/tests/Makefile.am	Wed Feb 02 06:25:39 2011 +0000
+++ b/libpurple/tests/Makefile.am	Wed Feb 02 06:26:19 2011 +0000
@@ -11,6 +11,7 @@
 	    tests.h \
 		test_cipher.c \
 		test_jabber_caps.c \
+		test_jabber_digest_md5.c \
 		test_jabber_jutil.c \
 		test_jabber_scram.c \
 		test_qq.c \
--- a/libpurple/tests/check_libpurple.c	Wed Feb 02 06:25:39 2011 +0000
+++ b/libpurple/tests/check_libpurple.c	Wed Feb 02 06:26:19 2011 +0000
@@ -85,6 +85,7 @@
 
 	srunner_add_suite(sr, cipher_suite());
 	srunner_add_suite(sr, jabber_caps_suite());
+	srunner_add_suite(sr, jabber_digest_md5_suite());
 	srunner_add_suite(sr, jabber_jutil_suite());
 	srunner_add_suite(sr, jabber_scram_suite());
 	srunner_add_suite(sr, qq_suite());
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_jabber_digest_md5.c	Wed Feb 02 06:26:19 2011 +0000
@@ -0,0 +1,59 @@
+#include <string.h>
+
+#include "tests.h"
+#include "../util.h"
+#include "../protocols/jabber/auth_digest_md5.h"
+#include "../protocols/jabber/jutil.h"
+
+START_TEST(test_parsing)
+{
+	GHashTable *table;
+
+	table = jabber_auth_digest_md5_parse("r=\"realm\",token=   \"   asdf\"");
+	fail_if(g_hash_table_lookup(table, "r") == NULL);
+	assert_string_equal("realm", g_hash_table_lookup(table, "r"));
+	fail_if(g_hash_table_lookup(table, "token") == NULL);
+	assert_string_equal("asdf", g_hash_table_lookup(table, "token"));
+	g_hash_table_destroy(table);
+
+	table = jabber_auth_digest_md5_parse("r=\"a\", token=   \"   asdf\"");
+	fail_if(g_hash_table_lookup(table, "r") == NULL);
+	assert_string_equal("a", g_hash_table_lookup(table, "r"));
+	fail_if(g_hash_table_lookup(table, "token") == NULL);
+	assert_string_equal("asdf", g_hash_table_lookup(table, "token"));
+	g_hash_table_destroy(table);
+
+	table = jabber_auth_digest_md5_parse("r=\"\", token=   \"   asdf\"");
+	fail_if(g_hash_table_lookup(table, "r") == NULL);
+	assert_string_equal("", g_hash_table_lookup(table, "r"));
+	fail_if(g_hash_table_lookup(table, "token") == NULL);
+	assert_string_equal("asdf", g_hash_table_lookup(table, "token"));
+	g_hash_table_destroy(table);
+
+	table = jabber_auth_digest_md5_parse("realm=\"somerealm\",nonce=\"OA6MG9tEQGm2hh\",qop=\"auth\",charset=utf-8,algorithm=md5-sess");
+	fail_if(g_hash_table_lookup(table, "realm") == NULL);
+	assert_string_equal("somerealm", g_hash_table_lookup(table, "realm"));
+	fail_if(g_hash_table_lookup(table, "nonce") == NULL);
+	assert_string_equal("OA6MG9tEQGm2hh", g_hash_table_lookup(table, "nonce"));
+	fail_if(g_hash_table_lookup(table, "qop") == NULL);
+	assert_string_equal("auth", g_hash_table_lookup(table, "qop"));
+	fail_if(g_hash_table_lookup(table, "charset") == NULL);
+	assert_string_equal("utf-8", g_hash_table_lookup(table, "charset"));
+	fail_if(g_hash_table_lookup(table, "algorithm") == NULL);
+	assert_string_equal("md5-sess", g_hash_table_lookup(table, "algorithm"));
+
+	g_hash_table_destroy(table);
+
+}
+END_TEST
+
+Suite *
+jabber_digest_md5_suite(void)
+{
+	Suite *s = suite_create("Jabber SASL DIGEST-MD5 functions");
+
+	TCase *tc = tcase_create("Parsing Functionality");
+	tcase_add_test(tc, test_parsing);
+	suite_add_tcase(s, tc);
+	return s;
+}
--- a/libpurple/tests/tests.h	Wed Feb 02 06:25:39 2011 +0000
+++ b/libpurple/tests/tests.h	Wed Feb 02 06:26:19 2011 +0000
@@ -10,6 +10,7 @@
 Suite * master_suite(void);
 Suite * cipher_suite(void);
 Suite * jabber_caps_suite(void);
+Suite * jabber_digest_md5_suite(void);
 Suite * jabber_jutil_suite(void);
 Suite * jabber_scram_suite(void);
 Suite * qq_suite(void);
--- a/po/ca.po	Wed Feb 02 06:25:39 2011 +0000
+++ b/po/ca.po	Wed Feb 02 06:26:19 2011 +0000
@@ -3,7 +3,7 @@
 # Copyright (C) unknown, Robert Millan <zeratul2@wanadoo.es>
 # Copyright (C) December 2003 (from 2003-12-12 until 2003-12-18),
 #               January (2004-01-07,12), Xan <dxpublica@telefonica.net>
-# Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+# Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
 #               Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>
 #
 # This file is distributed under the same license as the Pidgin package.
@@ -33,8 +33,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-23 07:57+0100\n"
-"PO-Revision-Date: 2010-12-23 08:04+0100\n"
+"POT-Creation-Date: 2011-01-30 11:04+0100\n"
+"PO-Revision-Date: 2011-01-30 11:11+0100\n"
 "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n"
 "Language-Team: Catalan <tradgnome@softcatala.net>\n"
 "Language: ca\n"
@@ -2387,9 +2387,12 @@
 "Camí on desar els fitxers\n"
 "(introduïu tot el camí)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr ""
-"Rebutja automàticament dels usuaris que no estiguin a la llista d'amics"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Quan arribi una sol·licitud de transferència d'un fitxer d'un\n"
+"usuari que *no* és a la vostra llista d'amics:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2402,6 +2405,10 @@
 msgid "Create a new directory for each user"
 msgstr "Crea un directori nou per a cada usuari"
 
+#, fuzzy
+msgid "Escape the filenames"
+msgstr "%s ha cancel·lat la transferència del fitxer"
+
 msgid "Notes"
 msgstr "Notes"
 
@@ -3859,7 +3866,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "El servidor requereix autenticació de text sobre un flux no xifrat"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "La resposta del servidor no és vàlida"
 
@@ -6201,6 +6211,20 @@
 msgid "Retrieving User Information..."
 msgstr "S'està obtenint informació de l'usuari..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Us han fet fora d'aquest MultiMX."
+
+msgid "was kicked"
+msgstr "ha estat fet fora"
+
+msgid "_Room Name:"
+msgstr "Nom de la _Sala:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Heu convidat"
+
 msgid "Loading menu..."
 msgstr "S'està carregant el menú..."
 
@@ -6229,20 +6253,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Habilita la pantalla de presentació emergent"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Us han fet fora d'aquest MultiMX."
-
-msgid "was kicked"
-msgstr "ha estat fet fora"
-
-msgid "_Room Name:"
-msgstr "Nom de la _Sala:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Heu convidat"
-
 msgid "Last Online"
 msgstr "Darrer cop en línia"
 
@@ -7917,75 +7927,6 @@
 "necessari per poder enviar imatges instantànies. Atès que es revelarà la "
 "vostra adreça IP, això es pot considerar un risc de privadesa."
 
-msgid "Invalid SNAC"
-msgstr "SNAC invàlid"
-
-msgid "Server rate limit exceeded"
-msgstr "S'ha excedit el límit de velocitat del servidor"
-
-msgid "Client rate limit exceeded"
-msgstr "S'ha excedit el límit de velocitat del client"
-
-msgid "Service unavailable"
-msgstr "Servei no disponible"
-
-msgid "Service not defined"
-msgstr "Servei no definit"
-
-msgid "Obsolete SNAC"
-msgstr "SNAC obsolet"
-
-msgid "Not supported by host"
-msgstr "El servidor no ho permet"
-
-msgid "Not supported by client"
-msgstr "El client no ho permet"
-
-msgid "Refused by client"
-msgstr "Rebutjat pel client"
-
-msgid "Reply too big"
-msgstr "Resposta massa gran"
-
-msgid "Responses lost"
-msgstr "S'han perdut respostes"
-
-msgid "Request denied"
-msgstr "Petició denegada"
-
-msgid "Busted SNAC payload"
-msgstr "Càrrega SNAC malmesa"
-
-msgid "Insufficient rights"
-msgstr "Drets insuficients"
-
-msgid "In local permit/deny"
-msgstr "En la llista de permès/denegat local"
-
-msgid "Warning level too high (sender)"
-msgstr "Nivell d'avís massa alt (remitent)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Nivell d'avís massa alt (receptor)"
-
-msgid "User temporarily unavailable"
-msgstr "Usuari no disponible temporalment"
-
-msgid "No match"
-msgstr "Cap coincidència"
-
-msgid "List overflow"
-msgstr "Sobreeiximent de la llista"
-
-msgid "Request ambiguous"
-msgstr "Petició ambigua"
-
-msgid "Queue full"
-msgstr "Cua plena"
-
-msgid "Not while on AOL"
-msgstr "No es pot fer mentre estigui a AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Icona de l'amic"
@@ -8104,6 +8045,75 @@
 msgid "Capabilities"
 msgstr "Capacitats"
 
+msgid "Invalid SNAC"
+msgstr "SNAC invàlid"
+
+msgid "Server rate limit exceeded"
+msgstr "S'ha excedit el límit de velocitat del servidor"
+
+msgid "Client rate limit exceeded"
+msgstr "S'ha excedit el límit de velocitat del client"
+
+msgid "Service unavailable"
+msgstr "Servei no disponible"
+
+msgid "Service not defined"
+msgstr "Servei no definit"
+
+msgid "Obsolete SNAC"
+msgstr "SNAC obsolet"
+
+msgid "Not supported by host"
+msgstr "El servidor no ho permet"
+
+msgid "Not supported by client"
+msgstr "El client no ho permet"
+
+msgid "Refused by client"
+msgstr "Rebutjat pel client"
+
+msgid "Reply too big"
+msgstr "Resposta massa gran"
+
+msgid "Responses lost"
+msgstr "S'han perdut respostes"
+
+msgid "Request denied"
+msgstr "Petició denegada"
+
+msgid "Busted SNAC payload"
+msgstr "Càrrega SNAC malmesa"
+
+msgid "Insufficient rights"
+msgstr "Drets insuficients"
+
+msgid "In local permit/deny"
+msgstr "En la llista de permès/denegat local"
+
+msgid "Warning level too high (sender)"
+msgstr "Nivell d'avís massa alt (remitent)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Nivell d'avís massa alt (receptor)"
+
+msgid "User temporarily unavailable"
+msgstr "Usuari no disponible temporalment"
+
+msgid "No match"
+msgstr "Cap coincidència"
+
+msgid "List overflow"
+msgstr "Sobreeiximent de la llista"
+
+msgid "Request ambiguous"
+msgstr "Petició ambigua"
+
+msgid "Queue full"
+msgstr "Cua plena"
+
+msgid "Not while on AOL"
+msgstr "No es pot fer mentre estigui a AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8703,14 +8713,14 @@
 msgid "Select Server"
 msgstr "Seleccioneu un servidor"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Connecta amb TCP"
@@ -12284,10 +12294,6 @@
 msgid "Fatal Error"
 msgstr "Error fatal"
 
-# Fixme
-msgid "bug master"
-msgstr "bug master"
-
 msgid "artist"
 msgstr "artista"
 
@@ -12469,6 +12475,9 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+msgid "Meadow Mari"
+msgstr "Txeremís oriental"
+
 msgid "Macedonian"
 msgstr "Macedoni"
 
@@ -15626,6 +15635,14 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "No tens permís per desinstal.lar aquesta aplicació."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr ""
+#~ "Rebutja automàticament dels usuaris que no estiguin a la llista d'amics"
+
+# Fixme
+#~ msgid "bug master"
+#~ msgstr "bug master"
+
 #~ msgid "Error requesting %s"
 #~ msgstr "S'ha produït un error en sol·licitar %s"
 
--- a/po/fr.po	Wed Feb 02 06:25:39 2011 +0000
+++ b/po/fr.po	Wed Feb 02 06:26:19 2011 +0000
@@ -4,7 +4,7 @@
 # Copyright (C) 2002, Stéphane Pontier <stephane.pontier@free.fr>
 # Copyright (C) 2002, Stéphane Wirtel <stephane.wirtel@belgacom.net>
 # Copyright (C) 2002, Loïc Jeannin <loic.jeannin@free.fr>
-# Copyright (C) 2002-2010, Éric Boumaour <zongo_fr@users.sourceforge.net>
+# Copyright (C) 2002-2011, Éric Boumaour <zongo_fr@users.sourceforge.net>
 #
 # This file is distributed under the same license as the Pidgin package.
 #
@@ -21,14 +21,14 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-12-16 23:25+0100\n"
+"POT-Creation-Date: 2011-01-30 21:28+0100\n"
+"PO-Revision-Date: 2011-01-30 21:14+0100\n"
 "Last-Translator: Éric Boumaour <zongo_fr@users.sourceforge.net>\n"
 "Language-Team: fr <fr@li.org>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
 "Plural-Forms: nplurals=2; plural=n>1;\n"
 
 #. Translators may want to transliterate the name.
@@ -864,8 +864,8 @@
 "System events will only be logged if the \"Log all status changes to system "
 "log\" preference is enabled."
 msgstr ""
-"Les événements système ne seront archivés que si l'option « Archiver tous "
-"les changements d'état dans les archives système » est activée."
+"Les événements système ne seront archivés que si l'option « Archiver tous les "
+"changements d'état dans les archives système » est activée."
 
 msgid ""
 "Instant messages will only be logged if the \"Log all instant messages\" "
@@ -2372,9 +2372,12 @@
 "Dossier où placer les fichiers\n"
 "(Veuillez fournir le chemin complet)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr ""
-"Refuser automatiquement si l'utilisateur n'est pas dans ma liste de contacts"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Quand une demande de transfert arrive de quelqu'un qui\n"
+"n'est *pas* dans la liste de contacts :"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2387,6 +2390,9 @@
 msgid "Create a new directory for each user"
 msgstr "Créer un nouveau dossier pour chaque contact"
 
+msgid "Escape the filenames"
+msgstr "Encoder les noms des fichiers"
+
 msgid "Notes"
 msgstr "Notes"
 
@@ -2767,8 +2773,7 @@
 msgstr "Message déconnecté"
 
 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
-msgstr ""
-"Vous pouvez modifier ou supprimer l'alerte dans la fenêtre « Alertes »."
+msgstr "Vous pouvez modifier ou supprimer l'alerte dans la fenêtre « Alertes »."
 
 msgid "Yes"
 msgstr "Oui"
@@ -3859,7 +3864,10 @@
 "Le serveur demande une authentification en texte non chiffré au travers d'un "
 "flux crypté."
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Réponse non valide du serveur"
 
@@ -6197,6 +6205,20 @@
 msgid "Retrieving User Information..."
 msgstr "Récupération des informations de l'utilisateur..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Vous avez été expulsé de ce MultiMX."
+
+msgid "was kicked"
+msgstr "a été expulsé"
+
+msgid "_Room Name:"
+msgstr "_Salon :"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Vous avez été invité"
+
 msgid "Loading menu..."
 msgstr "Chargement du menu..."
 
@@ -6224,20 +6246,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Activer l'affichage de la bannière"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Vous avez été expulsé de ce MultiMX."
-
-msgid "was kicked"
-msgstr "a été expulsé"
-
-msgid "_Room Name:"
-msgstr "_Salon :"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Vous avez été invité"
-
 msgid "Last Online"
 msgstr "En ligne dernièrement"
 
@@ -7908,75 +7916,6 @@
 "d'images. Votre adresse IP sera révélée et ceci peut être considéré comme "
 "une faille de sécurité."
 
-msgid "Invalid SNAC"
-msgstr "SNAC non valide"
-
-msgid "Server rate limit exceeded"
-msgstr "Vitesse du serveur dépassée"
-
-msgid "Client rate limit exceeded"
-msgstr "Vitesse du client dépassée"
-
-msgid "Service unavailable"
-msgstr "Service non disponible"
-
-msgid "Service not defined"
-msgstr "Service non défini"
-
-msgid "Obsolete SNAC"
-msgstr "SNAC obsolète"
-
-msgid "Not supported by host"
-msgstr "Non supporté par l'hôte"
-
-msgid "Not supported by client"
-msgstr "Non supporté par le client"
-
-msgid "Refused by client"
-msgstr "Refusé par le client"
-
-msgid "Reply too big"
-msgstr "Réponse trop grosse"
-
-msgid "Responses lost"
-msgstr "Réponses perdues"
-
-msgid "Request denied"
-msgstr "Requête refusée"
-
-msgid "Busted SNAC payload"
-msgstr "Charge SNAC incorrecte"
-
-msgid "Insufficient rights"
-msgstr "Droits insuffisants"
-
-msgid "In local permit/deny"
-msgstr "Dans l'autorisation/interdiction locale"
-
-msgid "Warning level too high (sender)"
-msgstr "Niveau d'avertissement trop élevé (émission)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Niveau d'avertissement trop élevé (réception)"
-
-msgid "User temporarily unavailable"
-msgstr "L'utilisateur est temporairement indisponible."
-
-msgid "No match"
-msgstr "Aucun résultat"
-
-msgid "List overflow"
-msgstr "Dépassement de liste"
-
-msgid "Request ambiguous"
-msgstr "Requête ambiguë"
-
-msgid "Queue full"
-msgstr "File d'attente pleine"
-
-msgid "Not while on AOL"
-msgstr "Impossible sur AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Icône du contact"
@@ -8095,6 +8034,75 @@
 msgid "Capabilities"
 msgstr "Possibilités"
 
+msgid "Invalid SNAC"
+msgstr "SNAC non valide"
+
+msgid "Server rate limit exceeded"
+msgstr "Vitesse du serveur dépassée"
+
+msgid "Client rate limit exceeded"
+msgstr "Vitesse du client dépassée"
+
+msgid "Service unavailable"
+msgstr "Service non disponible"
+
+msgid "Service not defined"
+msgstr "Service non défini"
+
+msgid "Obsolete SNAC"
+msgstr "SNAC obsolète"
+
+msgid "Not supported by host"
+msgstr "Non supporté par l'hôte"
+
+msgid "Not supported by client"
+msgstr "Non supporté par le client"
+
+msgid "Refused by client"
+msgstr "Refusé par le client"
+
+msgid "Reply too big"
+msgstr "Réponse trop grosse"
+
+msgid "Responses lost"
+msgstr "Réponses perdues"
+
+msgid "Request denied"
+msgstr "Requête refusée"
+
+msgid "Busted SNAC payload"
+msgstr "Charge SNAC incorrecte"
+
+msgid "Insufficient rights"
+msgstr "Droits insuffisants"
+
+msgid "In local permit/deny"
+msgstr "Dans l'autorisation/interdiction locale"
+
+msgid "Warning level too high (sender)"
+msgstr "Niveau d'avertissement trop élevé (émission)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Niveau d'avertissement trop élevé (réception)"
+
+msgid "User temporarily unavailable"
+msgstr "L'utilisateur est temporairement indisponible."
+
+msgid "No match"
+msgstr "Aucun résultat"
+
+msgid "List overflow"
+msgstr "Dépassement de liste"
+
+msgid "Request ambiguous"
+msgstr "Requête ambiguë"
+
+msgid "Queue full"
+msgstr "File d'attente pleine"
+
+msgid "Not while on AOL"
+msgstr "Impossible sur AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8686,14 +8694,14 @@
 msgid "Select Server"
 msgstr "Choisir le serveur"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Connexion par TCP"
@@ -10445,8 +10453,8 @@
 msgstr ""
 "Le serveur Yahoo! a demandé une méthode d'authentification non reconnue. "
 "Cette version de l'application n'arrivera probablement pas à se connecter au "
-"service Yahoo!. Vous pouvez vérifier qu'une mise à jour est disponible sur "
-"%s."
+"service Yahoo!. Vous pouvez vérifier qu'une mise à jour est disponible sur %"
+"s."
 
 msgid "Failed Yahoo! Authentication"
 msgstr "Échec de l'authentification Yahoo!"
@@ -12257,9 +12265,6 @@
 msgid "Fatal Error"
 msgstr "Erreur critique"
 
-msgid "bug master"
-msgstr "maitre des bogues"
-
 msgid "artist"
 msgstr "artiste"
 
@@ -12439,6 +12444,9 @@
 msgid "Maithili"
 msgstr "Maïhili"
 
+msgid "Meadow Mari"
+msgstr "Mari des prairies"
+
 msgid "Macedonian"
 msgstr "Macédonien"
 
@@ -12559,8 +12567,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 est un client de messagerie basé sur libpurple capable de se connecter à "
 "de multiples services de messageries instantanées. %s est écrit en C et "
@@ -13115,16 +13123,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 ""
 "Êtes-vous sûr de vouloir supprimer les archives de la conversation dans %s "
 "datée du %s ?"
 
 #, 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 "Êtes-vous sûr de vouloir supprimer les archives système datées du %s ?"
 
 msgid "Delete Log?"
@@ -14956,8 +14964,8 @@
 "'Enter' in the entry box to send. Watch the debug window."
 msgstr ""
 "Permet d'envoyer des données brutes aux protocoles en mode texte (XMPP, MSN, "
-"IRC, TOC). Tapez « Entrée » dans la boîte de saisie pour envoyer. Observez "
-"le résultat dans la fenêtre de debug."
+"IRC, TOC). Tapez « Entrée » dans la boîte de saisie pour envoyer. Observez le "
+"résultat dans la fenêtre de debug."
 
 #, c-format
 msgid "You can upgrade to %s %s today."
@@ -15485,13 +15493,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 ""
 "Erreur lors de l'installation du correcteur orthographique ($R3).$\\rSi une "
 "nouvelle tentative échoue, veuillez suivre les instructions sur http://"
-"developer.pidgin.im/wiki/Installing"
-"%20Pidgin#manual_win32_spellcheck_installation"
+"developer.pidgin.im/wiki/Installing%"
+"20Pidgin#manual_win32_spellcheck_installation"
 
 #. Installer Subsection Text
 msgid "GTK+ Runtime (required if not present)"
@@ -15570,6 +15578,14 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "Vous n'avez pas les permissions pour supprimer cette application."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr ""
+#~ "Refuser automatiquement si l'utilisateur n'est pas dans ma liste de "
+#~ "contacts"
+
+#~ msgid "bug master"
+#~ msgstr "maitre des bogues"
+
 #~ msgid "An error occurred on the in-band bytestream transfer\n"
 #~ msgstr "Erreur lors du transfert dans le flux de données in-band.\n"