# HG changeset patch # User Daniel Atallah # Date 1263009833 0 # Node ID dcd52d2b1b9782070b7bbbf8d784f262f96ac495 # Parent ba8577b87d2e488daf97ac4a76d55efc62d12697# Parent b8d97cf37200310b23b5f1b85c8701050b50986d propagate from branch 'im.pidgin.pidgin' (head d5a2e2287440ac7134c201e66921754bd4187ba9) to branch 'im.pidgin.pidgin.next.minor' (head 8be858d2b980ae4cf363247290bb782ab4362bec) diff -r ba8577b87d2e -r dcd52d2b1b97 COPYRIGHT --- a/COPYRIGHT Sat Jan 09 02:41:09 2010 +0000 +++ b/COPYRIGHT Sat Jan 09 04:03:53 2010 +0000 @@ -154,6 +154,7 @@ David Fiander Rob Flynn Rob Foehl (rwf) +Chris Foote Alan Ford Nathan Fredrickson Chris J. Friesen diff -r ba8577b87d2e -r dcd52d2b1b97 ChangeLog --- a/ChangeLog Sat Jan 09 02:41:09 2010 +0000 +++ b/ChangeLog Sat Jan 09 04:03:53 2010 +0000 @@ -18,7 +18,28 @@ * Make the search dialog unobtrusive in the conversation window (by making it look and behave like the search dialog in Firefox) -version 2.6.5 (??/??/20??): +version 2.6.6 (??/??/20??): + Gadu-Gadu: + * Fix display of avatars after a server-side change. (Krzysztof + Klinikowski) + + MSN: + * File transfer requests will no longer cause a crash if you delete the + file before the other side accepts. + * Recieved files will no longer hold an extra lock after completion, + meaning they can be moved or deleted without complaints from your OS. + * Buddies who sign in from a second location will no longer cause an + unnecessary chat window to open. + * Support setting an animated GIF as a buddy icon. + + XMPP: + * Added support for the SCRAM-SHA-1 SASL mechanism. This is only + available when built without Cyrus SASL support. + * When getting info on a domain-only (server) JID, show uptime + (when given by the result of the "last query") and don't show status as + offline. + +version 2.6.5 (01/08/2010): libpurple: * TLS certificates are actually stored to the local cache once again (accepting a name mismatch on a certificate should now be remembered) @@ -31,19 +52,10 @@ Chinese characters (broken in 2.6.4) MSN: - * File transfer requests will no longer cause a crash if you delete the - file before the other side accepts. - * Recieved files will no longer hold an extra lock after completion, - meaning they can be moved or deleted without complaints from your OS. - * Buddies who sign in from a second location will no longer cause an - unnecessary chat window to open. + * Fix an issue allowing a remote user to download arbitrary files from + a libpurple client. (CVE-2010-0013) XMPP: - * Added support for the SCRAM-SHA-1 SASL mechanism. This is only - available when built without Cyrus SASL support. - * When getting info on a domain-only (server) JID, show uptime - (when given by the result of the "last query") and don't show status as - offline. * Do not crash when attempting to register for a new account on Windows. * Fix file transfer with clients that do not support Entity Capabilities (e.g. Spark) diff -r ba8577b87d2e -r dcd52d2b1b97 ChangeLog.API --- a/ChangeLog.API Sat Jan 09 02:41:09 2010 +0000 +++ b/ChangeLog.API Sat Jan 09 04:03:53 2010 +0000 @@ -27,13 +27,23 @@ * pidgin_dialogs_translators (should not be used by anything but Pidgin) * gtk_imhtmltoolbar_switch_active_conversation -version 2.6.5 (??/??/20??): +version 2.6.6 (??/??/2010): libpurple: Changed: * purple_xfer_cancel_local is now called instead of purple_xfer_request_denied if an error is found when selecting a file to send. Request denied is still used when a receive request is not allowed. + Perl: + Changed: + * Corrected the package names for the PurpleProxyType and + PurpleLogReadFlags enums to have the correct number of colons + (from Purple::ProxyType:::: to Purple::ProxyType:: + and Purple::Log:ReadFlags:::: to + Purple::Log::ReadFlags::) (Chris Foote) + +version 2.6.5 (01/08/2010): + No changes version 2.6.4 (11/29/2009): No changes diff -r ba8577b87d2e -r dcd52d2b1b97 ChangeLog.win32 --- a/ChangeLog.win32 Sat Jan 09 02:41:09 2010 +0000 +++ b/ChangeLog.win32 Sat Jan 09 04:03:53 2010 +0000 @@ -5,9 +5,12 @@ * Crash Report files (pidgin.RPT) are now generated in the ~/.purple directory instead of the installation directory. -version 2.6.5 (??/??/20??): +version 2.6.6 (??/??/20??): * Installer translations for: Norwegian nynorsk +version 2.6.5 (01/08/2010): + * No changes + version 2.6.4 (11/29/2009): * Register URL handlers for everything that Windows knows about. Still use the HTTP "open" handler for security reasons. diff -r ba8577b87d2e -r dcd52d2b1b97 NEWS --- a/NEWS Sat Jan 09 02:41:09 2010 +0000 +++ b/NEWS Sat Jan 09 04:03:53 2010 +0000 @@ -2,7 +2,12 @@ Our development blog is available at: http://planet.pidgin.im -2.6.5 (??/??/20??): +2.6.6 (??/??/2010): + +2.6.5 (01/08/2010): + Paul: This release fixes a pretty serious bug in the MSN code, so we're + releasing this build a little earlier than planned with only major + bugs fixed. See the ChangeLog for details. Enjoy! 2.6.4 (11/29/2009): John: It's release time again. Lots of bug fixes this time around, as diff -r ba8577b87d2e -r dcd52d2b1b97 configure.ac diff -r ba8577b87d2e -r dcd52d2b1b97 finch/gntidle.c --- a/finch/gntidle.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/gntidle.c Sat Jan 09 04:03:53 2010 +0000 @@ -21,6 +21,8 @@ * */ +#include + #include "finch.h" #include "gntidle.h" #include "gntwm.h" diff -r ba8577b87d2e -r dcd52d2b1b97 finch/gntrequest.c --- a/finch/gntrequest.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/gntrequest.c Sat Jan 09 04:03:53 2010 +0000 @@ -23,6 +23,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include + #include #include #include @@ -35,7 +37,6 @@ #include #include "finch.h" -#include #include "gntrequest.h" #include "debug.h" #include "util.h" diff -r ba8577b87d2e -r dcd52d2b1b97 finch/gntstatus.c --- a/finch/gntstatus.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/gntstatus.c Sat Jan 09 04:03:53 2010 +0000 @@ -23,6 +23,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include + #include #include #include @@ -34,7 +36,6 @@ #include #include "finch.h" -#include #include #include diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/gntinternal.h --- a/finch/libgnt/gntinternal.h Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/gntinternal.h Sat Jan 09 04:03:53 2010 +0000 @@ -32,6 +32,14 @@ # define gnt_warning g_warning #endif +#ifndef G_GNUC_NULL_TERMINATED +# if defined(__GNUC__) && __GNUC__ >= 4 +# define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) +# else +# define G_GNUC_NULL_TERMINATED +# endif +#endif + extern int gnt_need_conversation_to_locale; extern const char *C_(const char *x); diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/gntline.c --- a/finch/libgnt/gntline.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/gntline.c Sat Jan 09 04:03:53 2010 +0000 @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include "gntinternal.h" #include "gntline.h" enum diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/gntmenuitem.c --- a/finch/libgnt/gntmenuitem.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/gntmenuitem.c Sat Jan 09 04:03:53 2010 +0000 @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include "gntinternal.h" #include "gntmenu.h" #include "gntmenuitem.h" diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/gntmenuitemcheck.c --- a/finch/libgnt/gntmenuitemcheck.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/gntmenuitemcheck.c Sat Jan 09 04:03:53 2010 +0000 @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include "gntinternal.h" #include "gntmenuitemcheck.h" static GntMenuItemClass *parent_class = NULL; diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/gntprogressbar.c --- a/finch/libgnt/gntprogressbar.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/gntprogressbar.c Sat Jan 09 04:03:53 2010 +0000 @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA **/ +#include "gntinternal.h" #include "gntprogressbar.h" #include "gntutils.h" diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/gntslider.c --- a/finch/libgnt/gntslider.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/gntslider.c Sat Jan 09 04:03:53 2010 +0000 @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include "gntinternal.h" #include "gntcolors.h" #include "gntkeys.h" #include "gntslider.h" diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/gntwidget.c --- a/finch/libgnt/gntwidget.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/gntwidget.c Sat Jan 09 04:03:53 2010 +0000 @@ -22,6 +22,7 @@ /* Stuff brutally ripped from Gflib */ +#include "gntinternal.h" #include "gntwidget.h" #include "gntstyle.h" #include "gntmarshal.h" diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/gntwindow.c --- a/finch/libgnt/gntwindow.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/gntwindow.c Sat Jan 09 04:03:53 2010 +0000 @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include "gntinternal.h" #include "gntstyle.h" #include "gntwindow.h" diff -r ba8577b87d2e -r dcd52d2b1b97 finch/libgnt/wms/irssi.c --- a/finch/libgnt/wms/irssi.c Sat Jan 09 02:41:09 2010 +0000 +++ b/finch/libgnt/wms/irssi.c Sat Jan 09 04:03:53 2010 +0000 @@ -33,6 +33,8 @@ #include #include +#include "gntinternal.h" + #include "gnt.h" #include "gntbox.h" #include "gntmenu.h" diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/account.c --- a/libpurple/account.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/account.c Sat Jan 09 04:03:53 2010 +0000 @@ -1341,7 +1341,8 @@ handles = g_list_remove(handles, info); - info->auth_cb(info->userdata); + if (info->auth_cb != NULL) + info->auth_cb(info->userdata); purple_signal_emit(purple_accounts_get_handle(), "account-authorization-granted", info->account, info->user); @@ -1356,7 +1357,8 @@ handles = g_list_remove(handles, info); - info->deny_cb(info->userdata); + if (info->deny_cb != NULL) + info->deny_cb(info->userdata); purple_signal_emit(purple_accounts_get_handle(), "account-authorization-denied", info->account, info->user); @@ -1383,10 +1385,12 @@ "account-authorization-requested", account, remote_user)); if (plugin_return > 0) { - auth_cb(user_data); + if (auth_cb != NULL) + auth_cb(user_data); return NULL; } else if (plugin_return < 0) { - deny_cb(user_data); + if (deny_cb != NULL) + deny_cb(user_data); return NULL; } @@ -2347,7 +2351,7 @@ gc = purple_account_get_connection(account); if (gc != NULL) - prpl = purple_connection_get_prpl(gc); + prpl = purple_connection_get_prpl(gc); if (prpl != NULL) prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); @@ -2364,7 +2368,7 @@ PurplePlugin *prpl = NULL; if (gc != NULL) - prpl = purple_connection_get_prpl(gc); + prpl = purple_connection_get_prpl(gc); if (prpl != NULL) prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); @@ -2403,7 +2407,7 @@ PurplePlugin *prpl = NULL; if (gc != NULL) - prpl = purple_connection_get_prpl(gc); + prpl = purple_connection_get_prpl(gc); if (prpl != NULL) prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); @@ -2420,7 +2424,7 @@ PurplePlugin *prpl = NULL; if (gc != NULL) - prpl = purple_connection_get_prpl(gc); + prpl = purple_connection_get_prpl(gc); if (prpl != NULL) prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); @@ -2448,7 +2452,7 @@ PurplePlugin *prpl = NULL; if (gc != NULL) - prpl = purple_connection_get_prpl(gc); + prpl = purple_connection_get_prpl(gc); if (prpl != NULL) prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); @@ -2468,7 +2472,7 @@ purple_account_set_password(account, new_pw); if (gc != NULL) - prpl = purple_connection_get_prpl(gc); + prpl = purple_connection_get_prpl(gc); if (prpl != NULL) prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/conversation.h --- a/libpurple/conversation.h Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/conversation.h Sat Jan 09 04:03:53 2010 +0000 @@ -368,7 +368,8 @@ * @param type The type of conversation. * @param account The account opening the conversation window on the purple * user's end. - * @param name The name of the conversation. + * @param name The name of the conversation. For PURPLE_CONV_TYPE_IM, + * this is the name of the buddy. * * @return The new conversation. */ diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/dbus-server.c --- a/libpurple/dbus-server.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/dbus-server.c Sat Jan 09 04:03:53 2010 +0000 @@ -601,7 +601,6 @@ { static DBusObjectPathVTable vtable = {NULL, &purple_dbus_dispatch, NULL, NULL, NULL, NULL}; DBusError error; - int result; dbus_error_init(&error); purple_dbus_connection = dbus_bus_get(DBUS_BUS_STARTER, &error); @@ -625,16 +624,15 @@ return; } - dbus_request_name_reply = - result = dbus_bus_request_name(purple_dbus_connection, + dbus_request_name_reply = dbus_bus_request_name(purple_dbus_connection, DBUS_SERVICE_PURPLE, 0, &error); if (dbus_error_is_set(&error)) { dbus_connection_unref(purple_dbus_connection); - dbus_error_free(&error); purple_dbus_connection = NULL; init_error = g_strdup_printf(N_("Failed to get serv name: %s"), error.name); + dbus_error_free(&error); return; } diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/ft.c --- a/libpurple/ft.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/ft.c Sat Jan 09 04:03:53 2010 +0000 @@ -73,6 +73,30 @@ g_free(priv); } +static const gchar * +purple_xfer_status_type_to_string(PurpleXferStatusType type) +{ + static const struct { + PurpleXferStatusType type; + const char *name; + } type_names[] = { + { PURPLE_XFER_STATUS_UNKNOWN, "unknown" }, + { PURPLE_XFER_STATUS_NOT_STARTED, "not started" }, + { PURPLE_XFER_STATUS_ACCEPTED, "accepted" }, + { PURPLE_XFER_STATUS_STARTED, "started" }, + { PURPLE_XFER_STATUS_DONE, "done" }, + { PURPLE_XFER_STATUS_CANCEL_LOCAL, "cancelled locally" }, + { PURPLE_XFER_STATUS_CANCEL_REMOTE, "cancelled remotely" } + }; + int i; + + for (i = 0; i < G_N_ELEMENTS(type_names); ++i) + if (type_names[i].type == type) + return type_names[i].name; + + return "invalid state"; +} + GList * purple_xfers_get_all() { @@ -188,6 +212,11 @@ { g_return_if_fail(xfer != NULL); + if (purple_debug_is_verbose()) + purple_debug_info("xfer", "Changing status of xfer %p from %s to %s\n", + xfer, purple_xfer_status_type_to_string(xfer->status), + purple_xfer_status_type_to_string(status)); + if (xfer->status == status) return; @@ -547,6 +576,8 @@ type = purple_xfer_get_type(xfer); account = purple_xfer_get_account(xfer); + purple_debug_misc("xfer", "request accepted for %p\n", xfer); + if (!filename && type == PURPLE_XFER_RECEIVE) { xfer->status = PURPLE_XFER_STATUS_ACCEPTED; xfer->ops.init(xfer); @@ -624,6 +655,8 @@ { g_return_if_fail(xfer != NULL); + purple_debug_misc("xfer", "xfer %p denied\n", xfer); + if (xfer->ops.request_denied != NULL) xfer->ops.request_denied(xfer); @@ -1176,6 +1209,8 @@ purple_input_remove(xfer->watcher); xfer->watcher = 0; + + purple_debug_misc("xfer", "prpl is ready on ft %p, waiting for UI\n", xfer); return; } } @@ -1238,8 +1273,12 @@ priv = g_hash_table_lookup(xfers_data, xfer); priv->ready |= PURPLE_XFER_READY_UI; - if (0 == (priv->ready & PURPLE_XFER_READY_PRPL)) + if (0 == (priv->ready & PURPLE_XFER_READY_PRPL)) { + purple_debug_misc("xfer", "UI is ready on ft %p, waiting for prpl\n", xfer); return; + } + + purple_debug_misc("xfer", "UI (and prpl) ready on ft %p, so proceeding\n", xfer); type = purple_xfer_get_type(xfer); if (type == PURPLE_XFER_SEND) @@ -1266,8 +1305,12 @@ priv->ready |= PURPLE_XFER_READY_PRPL; /* I don't think fwrite/fread are ever *not* ready */ - if (xfer->dest_fp == NULL && 0 == (priv->ready & PURPLE_XFER_READY_UI)) + if (xfer->dest_fp == NULL && 0 == (priv->ready & PURPLE_XFER_READY_UI)) { + purple_debug_misc("xfer", "prpl is ready on ft %p, waiting for UI\n", xfer); return; + } + + purple_debug_misc("xfer", "Prpl (and UI) ready on ft %p, so proceeding\n", xfer); priv->ready = PURPLE_XFER_READY_NONE; diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/media.h diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/plugins/perl/common/Log.xs --- a/libpurple/plugins/perl/common/Log.xs Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/plugins/perl/common/Log.xs Sat Jan 09 04:03:53 2010 +0000 @@ -6,7 +6,7 @@ BOOT: { HV *type_stash = gv_stashpv("Purple::Log::Type", 1); - HV *flags_stash = gv_stashpv("Purple::Log:ReadFlags::", 1); + HV *flags_stash = gv_stashpv("Purple::Log::ReadFlags", 1); static const constiv *civ, type_const_iv[] = { #define const_iv(name) {#name, (IV)PURPLE_LOG_##name} diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/plugins/perl/common/Proxy.xs --- a/libpurple/plugins/perl/common/Proxy.xs Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/plugins/perl/common/Proxy.xs Sat Jan 09 04:03:53 2010 +0000 @@ -5,7 +5,7 @@ BOOT: { - HV *stash = gv_stashpv("Purple::ProxyType::", 1); + HV *stash = gv_stashpv("Purple::ProxyType", 1); static const constiv *civ, const_iv[] = { #define const_iv(name) {#name, (IV)PURPLE_PROXY_##name} diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/plugins/signals-test.c --- a/libpurple/plugins/signals-test.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/plugins/signals-test.c Sat Jan 09 04:03:53 2010 +0000 @@ -547,6 +547,26 @@ purple_debug_misc("signals test", "quitting ()\n"); } +static void +printhash(gpointer key, gpointer value, gpointer data) +{ + char *a = (char *)key; + char *b = (char *)value; + GString *str = (GString *)data; + g_string_append_printf(str, " [%s] = [%s]\n", a, b ? b : "(null)"); +} + +static gboolean +uri_handler(const char *proto, const char *cmd, GHashTable *params) +{ + GString *str = g_string_new("\n{\n"); + g_hash_table_foreach(params, printhash, str); + g_string_append_c(str, '}'); + purple_debug_misc("signals test", "uri handler (%s, %s, %s)\n", proto, cmd, str->str); + g_string_free(str, TRUE); + return FALSE; +} + /************************************************************************** * File transfer signal callbacks **************************************************************************/ @@ -820,6 +840,8 @@ /* Core signals */ purple_signal_connect(core_handle, "quitting", plugin, PURPLE_CALLBACK(quitting_cb), NULL); + purple_signal_connect(core_handle, "uri-handler", + plugin, PURPLE_CALLBACK(uri_handler), NULL); /* File transfer signals */ purple_signal_connect(ft_handle, "file-recv-accept", diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/bonjour/bonjour.c --- a/libpurple/protocols/bonjour/bonjour.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/bonjour/bonjour.c Sat Jan 09 04:03:53 2010 +0000 @@ -392,11 +392,8 @@ purple_notify_user_info_add_pair(user_info, _("XMPP Account"), bb->jid); } -static void -bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *old_group, const char *new_group) -{ +static void bonjour_do_group_change(PurpleBuddy *buddy, const char *new_group) { PurpleBlistNodeFlags oldflags; - PurpleBuddy *buddy = purple_find_buddy(connection->account, who); if (buddy == NULL) return; @@ -404,13 +401,38 @@ oldflags = purple_blist_node_get_flags((PurpleBlistNode *)buddy); /* If we're moving them out of the bonjour group, make them persistent */ - if (strcmp(new_group, BONJOUR_GROUP_NAME) == 0) + if (purple_strequal(new_group, BONJOUR_GROUP_NAME)) purple_blist_node_set_flags((PurpleBlistNode *)buddy, oldflags | PURPLE_BLIST_NODE_FLAG_NO_SAVE); else purple_blist_node_set_flags((PurpleBlistNode *)buddy, oldflags ^ PURPLE_BLIST_NODE_FLAG_NO_SAVE); } +static void +bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *old_group, const char *new_group) +{ + PurpleBuddy *buddy = purple_find_buddy(connection->account, who); + + bonjour_do_group_change(buddy, new_group); + +} + +static void +bonjour_rename_group(PurpleConnection *connection, const char *old_name, PurpleGroup *group, GList *moved_buddies) +{ + GList *cur; + const char *new_group; + PurpleBuddy *buddy; + + new_group = purple_group_get_name(group); + + for (cur = moved_buddies; cur; cur = cur->next) { + buddy = cur->data; + bonjour_do_group_change(buddy, new_group); + } + +} + static gboolean bonjour_can_receive_file(PurpleConnection *connection, const char *who) { @@ -478,7 +500,7 @@ NULL, /* get_cb_away */ NULL, /* alias_buddy */ bonjour_group_buddy, /* group_buddy */ - NULL, /* rename_group */ + bonjour_rename_group, /* rename_group */ NULL, /* buddy_free */ bonjour_convo_closed, /* convo_closed */ NULL, /* normalize */ diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/gg/gg.c --- a/libpurple/protocols/gg/gg.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/gg/gg.c Sat Jan 09 04:03:53 2010 +0000 @@ -947,7 +947,7 @@ if (xmlnode_avatar == NULL) goto out; - xmlnode_bigavatar = xmlnode_get_child(xmlnode_avatar, "bigAvatar"); + xmlnode_bigavatar = xmlnode_get_child(xmlnode_avatar, "originBigAvatar"); if (xmlnode_bigavatar == NULL) goto out; diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/jabber/buddy.c Sat Jan 09 04:03:53 2010 +0000 @@ -823,7 +823,8 @@ const gchar *title = NULL; if (is_domain) { title = _("Uptime"); - message = g_strdup_printf(_("%s"), last); + message = last; + last = NULL; } else { title = _("Logged Off"); message = g_strdup_printf(_("%s ago"), last); diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/jabber/roster.c --- a/libpurple/protocols/jabber/roster.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/jabber/roster.c Sat Jan 09 04:03:53 2010 +0000 @@ -193,7 +193,9 @@ JabberIqType type, const char *id, xmlnode *query) { xmlnode *item, *group; +#if 0 const char *ver; +#endif if (!jabber_is_own_account(js, from)) { purple_debug_warning("jabber", "Received bogon roster push from %s\n", @@ -266,11 +268,13 @@ } } +#if 0 ver = xmlnode_get_attrib(query, "ver"); if (ver) { PurpleAccount *account = purple_connection_get_account(js->gc); purple_account_set_string(account, "roster_ver", ver); } +#endif js->currently_parsing_roster_push = FALSE; } diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/msn/msn.c --- a/libpurple/protocols/msn/msn.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/msn/msn.c Sat Jan 09 04:03:53 2010 +0000 @@ -1543,6 +1543,8 @@ { const char *bname; MsnAddReqData *data; + MsnSession *session; + MsnUser *user; bname = purple_buddy_get_name(buddy); @@ -1564,12 +1566,18 @@ data->buddy = buddy; data->group = group; - purple_request_input(gc, NULL, _("Authorization Request Message:"), - NULL, _("Please authorize me!"), TRUE, FALSE, NULL, - _("_OK"), G_CALLBACK(finish_auth_request), - _("_Cancel"), G_CALLBACK(cancel_auth_request), - purple_connection_get_account(gc), bname, NULL, - data); + session = purple_connection_get_protocol_data(gc); + user = msn_userlist_find_user(session->userlist, bname); + if (user && user->authorized) { + finish_auth_request(data, NULL); + } else { + purple_request_input(gc, NULL, _("Authorization Request Message:"), + NULL, _("Please authorize me!"), TRUE, FALSE, NULL, + _("_OK"), G_CALLBACK(finish_auth_request), + _("_Cancel"), G_CALLBACK(cancel_auth_request), + purple_connection_get_account(gc), bname, NULL, + data); + } } static void @@ -2659,7 +2667,7 @@ OPT_PROTO_MAIL_CHECK, NULL, /* user_splits */ NULL, /* protocol_options */ - {"png", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */ + {"png,gif", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */ msn_list_icon, /* list_icon */ msn_list_emblems, /* list_emblems */ msn_status_text, /* status_text */ diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/msn/slp.c --- a/libpurple/protocols/msn/slp.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/msn/slp.c Sat Jan 09 04:03:53 2010 +0000 @@ -276,6 +276,38 @@ msn_slplink_queue_slpmsg(slplink, slpmsg); } +/* XXX: this could be improved if we tracked custom smileys + * per-protocol, per-account, per-session or (ideally) per-conversation + */ +static PurpleStoredImage * +find_valid_emoticon(PurpleAccount *account, const char *path) +{ + GList *smileys; + + if (!purple_account_get_bool(account, "custom_smileys", TRUE)) + return NULL; + + smileys = purple_smileys_get_all(); + + for (; smileys; smileys = g_list_delete_link(smileys, smileys)) { + PurpleSmiley *smiley; + PurpleStoredImage *img; + + smiley = smileys->data; + img = purple_smiley_get_stored_image(smiley); + + if (purple_strequal(path, purple_imgstore_get_filename(img))) { + g_list_free(smileys); + return img; + } + + purple_imgstore_unref(img); + } + + purple_debug_error("msn", "Received illegal request for file %s\n", path); + return NULL; +} + #define MAX_FILE_NAME_LEN 0x226 static void @@ -293,7 +325,7 @@ MsnSlpMessage *slpmsg; MsnObject *obj; char *msnobj_data; - PurpleStoredImage *img; + PurpleStoredImage *img = NULL; int type; /* Send Ok */ @@ -311,51 +343,38 @@ obj = msn_object_new_from_string(msnobj_data); type = msn_object_get_type(obj); g_free(msnobj_data); - - if ((type != MSN_OBJECT_USERTILE) && (type != MSN_OBJECT_EMOTICON)) - { - purple_debug_error("msn", "Wrong object?\n"); - msn_object_destroy(obj); - g_return_if_reached(); - } - if (type == MSN_OBJECT_EMOTICON) { - char *path; - path = g_build_filename(purple_smileys_get_storing_dir(), - obj->location, NULL); - img = purple_imgstore_new_from_file(path); - g_free(path); - } else { + img = find_valid_emoticon(slplink->session->account, obj->location); + } else if (type == MSN_OBJECT_USERTILE) { img = msn_object_get_image(obj); if (img) purple_imgstore_ref(img); } msn_object_destroy(obj); - if (img == NULL) - { - purple_debug_error("msn", "Wrong object.\n"); - g_return_if_reached(); - } + if (img != NULL) { + /* DATA PREP */ + slpmsg = msn_slpmsg_new(slplink); + slpmsg->slpcall = slpcall; + slpmsg->session_id = slpcall->session_id; + msn_slpmsg_set_body(slpmsg, NULL, 4); + slpmsg->info = "SLP DATA PREP"; + msn_slplink_queue_slpmsg(slplink, slpmsg); - /* DATA PREP */ - slpmsg = msn_slpmsg_new(slplink); - slpmsg->slpcall = slpcall; - slpmsg->session_id = slpcall->session_id; - msn_slpmsg_set_body(slpmsg, NULL, 4); - slpmsg->info = "SLP DATA PREP"; - msn_slplink_queue_slpmsg(slplink, slpmsg); + /* DATA */ + slpmsg = msn_slpmsg_new(slplink); + slpmsg->slpcall = slpcall; + slpmsg->flags = 0x20; + slpmsg->info = "SLP DATA"; + msn_slpmsg_set_image(slpmsg, img); + msn_slplink_queue_slpmsg(slplink, slpmsg); + purple_imgstore_unref(img); - /* DATA */ - slpmsg = msn_slpmsg_new(slplink); - slpmsg->slpcall = slpcall; - slpmsg->flags = 0x20; - slpmsg->info = "SLP DATA"; - msn_slpmsg_set_image(slpmsg, img); - msn_slplink_queue_slpmsg(slplink, slpmsg); - purple_imgstore_unref(img); + accepted = TRUE; - accepted = TRUE; + } else { + purple_debug_error("msn", "Wrong object.\n"); + } } else if (!strcmp(euf_guid, MSN_FT_GUID)) diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/msn/slplink.c --- a/libpurple/protocols/msn/slplink.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/msn/slplink.c Sat Jan 09 04:03:53 2010 +0000 @@ -669,9 +669,8 @@ #define MAX_FILE_NAME_LEN 0x226 static gchar * -gen_context(const char *file_name, const char *file_path) +gen_context(PurpleXfer *xfer, const char *file_name, const char *file_path) { - struct stat st; gsize size = 0; MsnContextHeader header; gchar *u8 = NULL; @@ -683,8 +682,7 @@ glong uni_len = 0; gsize len; - if (g_stat(file_path, &st) == 0) - size = st.st_size; + size = purple_xfer_get_size(xfer); if(!file_name) { gchar *basename = g_path_get_basename(file_path); @@ -761,7 +759,7 @@ xfer->data = slpcall; - context = gen_context(fn, fp); + context = gen_context(xfer, fn, fp); msn_slpcall_invite(slpcall, MSN_FT_GUID, 2, context); diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/msn/userlist.c --- a/libpurple/protocols/msn/userlist.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/msn/userlist.c Sat Jan 09 04:03:53 2010 +0000 @@ -210,6 +210,7 @@ if (list_op & MSN_LIST_PL_OP) { + user->authorized = TRUE; got_new_entry(gc, passport, store, message); } } diff -r ba8577b87d2e -r dcd52d2b1b97 libpurple/protocols/mxit/splashscreen.c --- a/libpurple/protocols/mxit/splashscreen.c Sat Jan 09 02:41:09 2010 +0000 +++ b/libpurple/protocols/mxit/splashscreen.c Sat Jan 09 04:03:53 2010 +0000 @@ -24,7 +24,6 @@ */ #include "internal.h" -#include #include "purple.h" #include "imgstore.h" diff -r ba8577b87d2e -r dcd52d2b1b97 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sat Jan 09 02:41:09 2010 +0000 +++ b/pidgin/gtkconv.c Sat Jan 09 04:03:53 2010 +0000 @@ -5501,10 +5501,12 @@ } /* Somebody wants to keep this conversation around, so don't time it out */ - timer = GPOINTER_TO_INT(purple_conversation_get_data(conv, "close-timer")); - if (timer) { - purple_timeout_remove(timer); - purple_conversation_set_data(conv, "close-timer", GINT_TO_POINTER(0)); + if (conv) { + timer = GPOINTER_TO_INT(purple_conversation_get_data(conv, "close-timer")); + if (timer) { + purple_timeout_remove(timer); + purple_conversation_set_data(conv, "close-timer", GINT_TO_POINTER(0)); + } } } @@ -7598,16 +7600,24 @@ } } +struct _status_timeout_user { + gchar *name; + PurpleAccount *account; +}; + static gboolean -update_buddy_status_timeout(PurpleBuddy *buddy) +update_buddy_status_timeout(struct _status_timeout_user *user) { /* To remove the signing-on/off door icon */ PurpleConversation *conv; - conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, buddy->name, buddy->account); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, user->name, user->account); if (conv) pidgin_conv_update_fields(conv, PIDGIN_CONV_TAB_ICON); + g_free(user->name); + g_free(user); + return FALSE; } @@ -7616,6 +7626,7 @@ { PidginConversation *gtkconv; PurpleConversation *conv; + struct _status_timeout_user *user; gtkconv = get_gtkconv_with_contact(purple_buddy_get_contact(buddy)); if (gtkconv) @@ -7628,8 +7639,12 @@ pidgin_conv_update_fields(conv, PIDGIN_CONV_MENU); } + user = g_malloc(sizeof(struct _status_timeout_user)); + user->name = g_strdup(buddy->name); + user->account = buddy->account; + /* In case a conversation is started after the buddy has signed-on/off */ - purple_timeout_add_seconds(11, (GSourceFunc)update_buddy_status_timeout, buddy); + purple_timeout_add_seconds(11, (GSourceFunc)update_buddy_status_timeout, user); } static void diff -r ba8577b87d2e -r dcd52d2b1b97 pidgin/gtklog.c --- a/pidgin/gtklog.c Sat Jan 09 02:41:09 2010 +0000 +++ b/pidgin/gtklog.c Sat Jan 09 04:03:53 2010 +0000 @@ -420,6 +420,7 @@ { PidginLogViewer *viewer = data; gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); + g_object_steal_data(G_OBJECT(viewer->entry), "search-find-cb"); return FALSE; } @@ -472,8 +473,11 @@ g_free(read); if (viewer->search != NULL) { + guint source; gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); - g_idle_add(search_find_cb, viewer); + source = g_idle_add(search_find_cb, viewer); + g_object_set_data_full(G_OBJECT(viewer->entry), "search-find-cb", + GINT_TO_POINTER(source), (GDestroyNotify)g_source_remove); } pidgin_clear_cursor(viewer->window); diff -r ba8577b87d2e -r dcd52d2b1b97 po/ChangeLog --- a/po/ChangeLog Sat Jan 09 02:41:09 2010 +0000 +++ b/po/ChangeLog Sat Jan 09 04:03:53 2010 +0000 @@ -2,10 +2,13 @@ version 2.7.0 -version 2.6.5 +version 2.6.6 * Norwegian Nynorsk win32 translation added (Yngve Spjeld Landro) * Russian translation updated (Антон Самохвалов) +version 2.6.5 + * No changes + version 2.6.4 * Afrikaans translation updated (Friedel Wolff) * Chinese (Hong Kong) translation updated (Ambrose C. Li, Paladin R. Liu) diff -r ba8577b87d2e -r dcd52d2b1b97 po/de.po --- a/po/de.po Sat Jan 09 02:41:09 2010 +0000 +++ b/po/de.po Sat Jan 09 04:03:53 2010 +0000 @@ -2,7 +2,7 @@ # Pidgin German translation # Copyright (C) 2001, Daniel Seifert # Copyright (C) 2002, Karsten Weiss -# Copyright (C) 2002-2009, Björn Voigt , +# Copyright (C) 2002-2010, Björn Voigt , # Jochen Kemnade # # This file is distributed under the same license as the Pidgin package. @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-10 22:38+0100\n" -"PO-Revision-Date: 2009-12-11 20:55+0100\n" +"POT-Creation-Date: 2010-01-08 16:32+0100\n" +"PO-Revision-Date: 2010-01-08 16:30+0100\n" "Last-Translator: Björn Voigt \n" "Language-Team: Deutsch \n" "MIME-Version: 1.0\n" @@ -1960,6 +1960,9 @@ msgstr "" "%s ist keine reguläre Datei. Pidgin wird die Datei nicht überschreiben.\n" +msgid "File is not readable." +msgstr "Datei ist nicht lesbar." + #, c-format msgid "%s wants to send you %s (%s)" msgstr "%s möchte Ihnen %s (%s) senden" @@ -3855,6 +3858,8 @@ msgid "Server thinks authentication is complete, but client does not" msgstr "" +"Der Server ist der Meinung, dass die Authentifizierung vollständig ist, der " +"Client aber nicht" msgid "SASL authentication failed" msgstr "SASL-Authentifizierung fehlgeschlagen" @@ -3863,21 +3868,17 @@ msgid "SASL error: %s" msgstr "SASL-Fehler: %s" -#, fuzzy msgid "Unable to canonicalize username" -msgstr "Kann nicht konfigurieren" - -#, fuzzy +msgstr "Benutzername konnte nicht in Normalform gebracht werden" + msgid "Unable to canonicalize password" -msgstr "Es konnte kein lauschender Port geöffnet werden." - -#, fuzzy +msgstr "Passwort konnte nicht in Normalform gebracht werden" + msgid "Malicious challenge from server" -msgstr "Ungültige Challenge vom Server" - -#, fuzzy +msgstr "Bösartige Challenge vom Server" + msgid "Unexpected response from server" -msgstr "Ungültige HTTP-Antwort vom Server empfangen" +msgstr "Unerwartete Antwort vom Server" msgid "The BOSH connection manager terminated your session." msgstr "Der BOSH-Verbindungsmanager hat Ihre Sitzung beendet." @@ -3979,13 +3980,8 @@ msgid "Resource" msgstr "Ressource" -#, fuzzy msgid "Uptime" -msgstr "Aktualisieren" - -#, c-format -msgid "%s" -msgstr "" +msgstr "Betriebszeit" msgid "Logged Off" msgstr "Abgemeldet" @@ -4186,13 +4182,6 @@ msgid "Ping timed out" msgstr "Ping-Zeitüberschreitung" -msgid "" -"Unable to find alternative XMPP connection methods after failing to connect " -"directly." -msgstr "" -"Nach dem Fehlschlagen einer direkten XMPP-Verbindung können keine " -"alternativen Verbindungsmethoden gefunden werden." - msgid "Invalid XMPP ID" msgstr "Ungültige XMPP-ID" @@ -5168,6 +5157,10 @@ msgid "Your new MSN friendly name is too long." msgstr "Ihr neuer MSN-Benutzername zu lang." +#, c-format +msgid "Set friendly name for %s." +msgstr "Setze Spitznamen für %s." + msgid "Set your friendly name." msgstr "Setze Ihren Spitznamen." @@ -12103,9 +12096,6 @@ msgid "Lao" msgstr "Laotisch" -msgid "Lithuanian" -msgstr "Litauisch" - msgid "Macedonian" msgstr "Makedonisch" @@ -12208,6 +12198,9 @@ msgid "Amharic" msgstr "Amharisch" +msgid "Lithuanian" +msgstr "Litauisch" + #, c-format msgid "About %s" msgstr "Über %s" @@ -12250,7 +12243,19 @@ "
We can't help with 3rd party protocols or plugins!
This list's " "primary language is English. You are welcome to post in another " "language, but the responses may be less helpful.

" -msgstr "Hilfe von anderen Pidgin-Benutzern: support@pidgin.im
Dies ist eine öffentliche Mailing-Liste! (Archiv)
Wir können nicht bei Problemen mit Drittanbieter-Protokollen oder Plugins helfen!
Die Hauptsprache dieser Liste ist Englisch. Sie können gern in einer anderen Sprache schreiben, aber die Antworten könnten weniger hilfreich sein.
Deutschsprachige Benutzer können auch das Portal Pidgin-IM.de nutzen. Dort finden Sie aktuelle Informationen zu Pidgin, können mit anderen Benutzern im Forum diskutieren und Hilfe zu Problemen finden. Beachten Sie, dass dieses Portal unabhängig vom offiziellen Pidgin-Projekt ist.

" +msgstr "" +"Hilfe von anderen Pidgin-Benutzern: support@pidgin.im
Dies ist eine öffentliche Mailing-Liste! (Archiv)
Wir können nicht bei Problemen mit Drittanbieter-Protokollen oder " +"Plugins helfen!
Die Hauptsprache dieser Liste ist Englisch. Sie " +"können gern in einer anderen Sprache schreiben, aber die Antworten könnten " +"weniger hilfreich sein.
Deutschsprachige Benutzer können auch das Portal " +"
Pidgin-IM.de nutzen. Dort finden " +"Sie aktuelle Informationen zu Pidgin, können mit anderen Benutzern im Forum diskutieren und Hilfe zu " +"Problemen finden. Beachten Sie, dass dieses Portal unabhängig vom " +"offiziellen Pidgin-Projekt ist.

" #, c-format msgid ""