# HG changeset patch # User Marcus Lundblad # Date 1230459435 0 # Node ID fb3e9bff199e84212ed4fa08829e65385d8bef8e # Parent f2d5333845350947946bed9aaa7f498b5ad021ca# Parent 689cfb82242e4c995a969121a7a4b9806446e95a propagate from branch 'im.pidgin.pidgin' (head f94ddf7fa975e3a39a53fccae31b7e73f892fd57) to branch 'im.pidgin.cpw.malu.xmpp.idle' (head 7a22c71f42efc42841fcfefd5dd77c36ca0d2b37) diff -r f2d533384535 -r fb3e9bff199e ChangeLog --- a/ChangeLog Thu Dec 25 13:21:27 2008 +0000 +++ b/ChangeLog Sun Dec 28 10:17:15 2008 +0000 @@ -6,6 +6,8 @@ Rosinski) * Don't ignore namespace information when parsing XMPP data. (Michal Witkowski) + * Fix a crash that occurred when retrieving certain Offline Messages + on MSN. XMPP: * Support for XEP-0191 blocking. (Vijay Raghunathan) @@ -130,7 +132,7 @@ if no custom smilies have previously been added using the smiley manager. * Improved support for some message formatting in conversations. - * Allow focusing the coversation history or userlist with F6. + * Allow focusing the conversation history or userlist with F6. * Fixed the Send Button plugin to avoid duplicate buttons in a single conversation. * Double-clicking a saved status will now activate it and close the diff -r f2d533384535 -r fb3e9bff199e libpurple/protocols/jabber/message.c --- a/libpurple/protocols/jabber/message.c Thu Dec 25 13:21:27 2008 +0000 +++ b/libpurple/protocols/jabber/message.c Sun Dec 28 10:17:15 2008 +0000 @@ -291,27 +291,28 @@ PurpleAccount *account; PurpleConversation *c; char *username, *str; - + /* Delayed buzz MUST NOT be accepted */ if(jm->delayed) return; - + /* Reject buzz when it's not enabled */ if(!jm->js->allowBuzz) return; - + account = purple_connection_get_account(jm->js->gc); - - if ((buddy = purple_find_buddy(account, jm->from)) != NULL) - username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1); - else + + if ((buddy = purple_find_buddy(account, jm->from)) == NULL) return; /* Do not accept buzzes from unknown people */ - c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, jm->from); + c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, jm->from, account); + if (c == NULL) + c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, jm->from); - str = g_strdup_printf(_("%s has buzzed you!"), username); - - purple_conversation_write(c, NULL, str, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL)); + username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1); + /* xmpp only has 1 attention type, so index is 0 */ + purple_prpl_got_attention(jm->js->gc, username, 0); + g_free(username); g_free(str); } diff -r f2d533384535 -r fb3e9bff199e libpurple/protocols/msn/error.c --- a/libpurple/protocols/msn/error.c Thu Dec 25 13:21:27 2008 +0000 +++ b/libpurple/protocols/msn/error.c Sun Dec 28 10:17:15 2008 +0000 @@ -27,191 +27,178 @@ const char * msn_error_get_text(unsigned int type, gboolean *debug) { - static char msg[MSN_BUF_LEN]; + static char msg[256]; + const char *result; *debug = FALSE; switch (type) { case 0: - g_snprintf(msg, sizeof(msg), - _("Unable to parse message")); + result = _("Unable to parse message"); *debug = TRUE; break; case 200: - g_snprintf(msg, sizeof(msg), - _("Syntax Error (probably a client bug)")); + result = _("Syntax Error (probably a client bug)"); *debug = TRUE; break; case 201: - g_snprintf(msg, sizeof(msg), - _("Invalid email address")); + result = _("Invalid email address"); break; case 205: - g_snprintf(msg, sizeof(msg), _("User does not exist")); + result = _("User does not exist"); break; case 206: - g_snprintf(msg, sizeof(msg), - _("Fully qualified domain name missing")); + result = _("Fully qualified domain name missing"); break; case 207: - g_snprintf(msg, sizeof(msg), _("Already logged in")); + result = _("Already logged in"); break; case 208: - g_snprintf(msg, sizeof(msg), _("Invalid username")); + result = _("Invalid username"); break; case 209: - g_snprintf(msg, sizeof(msg), _("Invalid friendly name")); + result = _("Invalid friendly name"); break; case 210: - g_snprintf(msg, sizeof(msg), _("List full")); + result = _("List full"); break; case 215: - g_snprintf(msg, sizeof(msg), _("Already there")); + result = _("Already there"); *debug = TRUE; break; case 216: - g_snprintf(msg, sizeof(msg), _("Not on list")); + result = _("Not on list"); break; case 217: - g_snprintf(msg, sizeof(msg), _("User is offline")); + result = _("User is offline"); break; case 218: - g_snprintf(msg, sizeof(msg), _("Already in the mode")); + result = _("Already in the mode"); *debug = TRUE; break; case 219: - g_snprintf(msg, sizeof(msg), _("Already in opposite list")); + result = _("Already in opposite list"); *debug = TRUE; break; case 223: - g_snprintf(msg, sizeof(msg), _("Too many groups")); + result = _("Too many groups"); break; case 224: - g_snprintf(msg, sizeof(msg), _("Invalid group")); + result = _("Invalid group"); break; case 225: - g_snprintf(msg, sizeof(msg), _("User not in group")); + result = _("User not in group"); break; case 229: - g_snprintf(msg, sizeof(msg), _("Group name too long")); + result = _("Group name too long"); break; case 230: - g_snprintf(msg, sizeof(msg), _("Cannot remove group zero")); + result = _("Cannot remove group zero"); *debug = TRUE; break; case 231: - g_snprintf(msg, sizeof(msg), - _("Tried to add a user to a group " - "that doesn't exist")); + result = _("Tried to add a user to a group that doesn't exist"); break; case 280: - g_snprintf(msg, sizeof(msg), _("Switchboard failed")); + result = _("Switchboard failed"); *debug = TRUE; break; case 281: - g_snprintf(msg, sizeof(msg), _("Notify transfer failed")); + result = _("Notify transfer failed"); *debug = TRUE; break; case 300: - g_snprintf(msg, sizeof(msg), _("Required fields missing")); + result = _("Required fields missing"); *debug = TRUE; break; case 301: - g_snprintf(msg, sizeof(msg), _("Too many hits to a FND")); + result = _("Too many hits to a FND"); *debug = TRUE; break; case 302: - g_snprintf(msg, sizeof(msg), _("Not logged in")); + result = _("Not logged in"); break; case 500: - g_snprintf(msg, sizeof(msg), - _("Service temporarily unavailable")); + result = _("Service temporarily unavailable"); break; case 501: - g_snprintf(msg, sizeof(msg), _("Database server error")); + result = _("Database server error"); *debug = TRUE; break; case 502: - g_snprintf(msg, sizeof(msg), _("Command disabled")); + result = _("Command disabled"); *debug = TRUE; break; case 510: - g_snprintf(msg, sizeof(msg), _("File operation error")); + result = _("File operation error"); *debug = TRUE; break; case 520: - g_snprintf(msg, sizeof(msg), _("Memory allocation error")); + result = _("Memory allocation error"); *debug = TRUE; break; case 540: - g_snprintf(msg, sizeof(msg), - _("Wrong CHL value sent to server")); + result = _("Wrong CHL value sent to server"); *debug = TRUE; break; case 600: - g_snprintf(msg, sizeof(msg), _("Server busy")); + result = _("Server busy"); break; case 601: - g_snprintf(msg, sizeof(msg), _("Server unavailable")); + result = _("Server unavailable"); break; case 602: - g_snprintf(msg, sizeof(msg), - _("Peer notification server down")); + result = _("Peer notification server down"); *debug = TRUE; break; case 603: - g_snprintf(msg, sizeof(msg), _("Database connect error")); + result = _("Database connect error"); *debug = TRUE; break; case 604: - g_snprintf(msg, sizeof(msg), - _("Server is going down (abandon ship)")); + result = _("Server is going down (abandon ship)"); break; case 605: - g_snprintf(msg, sizeof(msg), _("Server unavailable")); + result = _("Server unavailable"); break; case 707: - g_snprintf(msg, sizeof(msg), - _("Error creating connection")); + result = _("Error creating connection"); *debug = TRUE; break; case 710: - g_snprintf(msg, sizeof(msg), - _("CVR parameters are either unknown " - "or not allowed")); + result = _("CVR parameters are either unknown or not allowed"); *debug = TRUE; break; case 711: - g_snprintf(msg, sizeof(msg), _("Unable to write")); + result = _("Unable to write"); break; case 712: - g_snprintf(msg, sizeof(msg), _("Session overload")); + result = _("Session overload"); *debug = TRUE; break; case 713: - g_snprintf(msg, sizeof(msg), _("User is too active")); + result = _("User is too active"); break; case 714: - g_snprintf(msg, sizeof(msg), _("Too many sessions")); + result = _("Too many sessions"); break; case 715: - g_snprintf(msg, sizeof(msg), _("Passport not verified")); + result = _("Passport not verified"); break; case 717: - g_snprintf(msg, sizeof(msg), _("Bad friend file")); + result = _("Bad friend file"); *debug = TRUE; break; case 731: - g_snprintf(msg, sizeof(msg), _("Not expected")); + result = _("Not expected"); *debug = TRUE; break; case 800: - g_snprintf(msg, sizeof(msg), - _("Friendly name changes too rapidly")); + result = _("Friendly name changes too rapidly"); break; case 910: @@ -220,37 +207,34 @@ case 919: case 921: case 922: - g_snprintf(msg, sizeof(msg), _("Server too busy")); + result = _("Server too busy"); break; case 911: case 917: - g_snprintf(msg, sizeof(msg), _("Authentication failed")); + result = _("Authentication failed"); break; case 913: - g_snprintf(msg, sizeof(msg), _("Not allowed when offline")); + result = _("Not allowed when offline"); break; case 914: case 915: case 916: - g_snprintf(msg, sizeof(msg), _("Server unavailable")); + result = _("Server unavailable"); break; case 920: - g_snprintf(msg, sizeof(msg), _("Not accepting new users")); + result = _("Not accepting new users"); break; case 923: - g_snprintf(msg, sizeof(msg), - _("Kids Passport without parental consent")); + result = _("Kids Passport without parental consent"); break; case 924: - g_snprintf(msg, sizeof(msg), - _("Passport account not yet verified")); + result = _("Passport account not yet verified"); break; case 927: - g_snprintf(msg, sizeof(msg), - _("Passport account suspended")); + result = _("Passport account suspended"); break; case 928: - g_snprintf(msg, sizeof(msg), _("Bad ticket")); + result = _("Bad ticket"); *debug = TRUE; break; @@ -258,23 +242,25 @@ g_snprintf(msg, sizeof(msg), _("Unknown Error Code %d"), type); *debug = TRUE; + result = msg; break; } - return msg; + return result; } void msn_error_handle(MsnSession *session, unsigned int type) { - char buf[MSN_BUF_LEN]; + char *buf; gboolean debug; - g_snprintf(buf, sizeof(buf), _("MSN Error: %s\n"), - msn_error_get_text(type, &debug)); + buf = g_strdup_printf(_("MSN Error: %s\n"), + msn_error_get_text(type, &debug)); if (debug) purple_debug_warning("msn", "error %d: %s\n", type, buf); else purple_notify_error(session->account->gc, NULL, buf, NULL); + g_free(buf); } diff -r f2d533384535 -r fb3e9bff199e libpurple/protocols/msn/oim.c --- a/libpurple/protocols/msn/oim.c Thu Dec 25 13:21:27 2008 +0000 +++ b/libpurple/protocols/msn/oim.c Sun Dec 28 10:17:15 2008 +0000 @@ -596,6 +596,7 @@ MsnMessage *message; const char *date; const char *from; + const char *boundary; char *decode_msg = NULL; gsize body_len; char **tokens; @@ -608,27 +609,14 @@ MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM); purple_debug_info("msn", "oim body:{%s}\n", message->body); - if (!strcmp(msn_message_get_attr(message, "X-OIMProxy"), "MOSMS")) { - char *boundary; + boundary = msn_message_get_attr(message, "boundary"); + + if (boundary != NULL) { + char *bounds; char **part; - from = msn_message_get_attr(message, "X-OIM-originatingSource"); - - /* Match number to user's mobile number, FROM is a phone number - if the other side pages you using your phone number */ - if (!strncmp(from, "tel:+", 5)) { - MsnUser *user = msn_userlist_find_user_with_mobile_phone( - rdata->oim->session->userlist, from + 4); - - if (user && user->passport) - passport = g_strdup(user->passport); - } - if (passport == NULL) - passport = g_strdup(from); - - boundary = g_strdup_printf("--%s" MSG_OIM_LINE_DEM, - msn_message_get_attr(message, "boundary")); - tokens = g_strsplit(message->body, boundary, 0); + bounds = g_strdup_printf("--%s" MSG_OIM_LINE_DEM, boundary); + tokens = g_strsplit(message->body, bounds, 0); /* tokens+1 to skip the "This is a multipart message..." text */ for (part = tokens+1; *part != NULL; part++) { @@ -648,18 +636,33 @@ } g_strfreev(tokens); - g_free(boundary); + g_free(bounds); if (decode_msg == NULL) { purple_debug_error("msn", "Couldn't find text/plain OIM message.\n"); - g_free(passport); + msn_message_destroy(message); return; } } else { + decode_msg = (char *)purple_base64_decode(message->body, &body_len); + } + + from = msn_message_get_attr(message, "X-OIM-originatingSource"); + + /* Match number to user's mobile number, FROM is a phone number + if the other side pages you using your phone number */ + if (!strncmp(from, "tel:+", 5)) { + MsnUser *user = msn_userlist_find_user_with_mobile_phone( + rdata->oim->session->userlist, from + 4); + + if (user && user->passport) + passport = g_strdup(user->passport); + } + + if (passport == NULL) { char *start, *end; from = msn_message_get_attr(message, "From"); - decode_msg = (char *)purple_base64_decode(message->body, &body_len); tokens = g_strsplit(from, " ", 2); if (tokens[1] != NULL) @@ -687,6 +690,7 @@ g_free(passport); g_free(decode_msg); + msn_message_destroy(message); } /* Parse the XML data, diff -r f2d533384535 -r fb3e9bff199e libpurple/protocols/qq/AUTHORS --- a/libpurple/protocols/qq/AUTHORS Thu Dec 25 13:21:27 2008 +0000 +++ b/libpurple/protocols/qq/AUTHORS Sun Dec 28 10:17:15 2008 +0000 @@ -1,7 +1,7 @@ Code Contributors ========= puzzlebird : original author -gfhuang : patches for libpurple 2.0.0beta2, maintainer +gfhuang(poppyer): patches for libpurple 2.0.0beta2, maintainer Yuan Qingyun : patches for libpurple 1.5.0, maintainer henryouly : file transfer, udp sock5 proxy and qq_show, maintainer hzhr : maintainer diff -r f2d533384535 -r fb3e9bff199e libpurple/protocols/qq/ChangeLog --- a/libpurple/protocols/qq/ChangeLog Thu Dec 25 13:21:27 2008 +0000 +++ b/libpurple/protocols/qq/ChangeLog Sun Dec 28 10:17:15 2008 +0000 @@ -1,3 +1,10 @@ +2008.12.25 - flos + * References #7821 + * Updated authors + +2008.12.17 - flos + * Minor fixed in buddy_info.c + 2008.12.06 - flos * Removed version checking script in Makefiles since our developers all migrated to monotone * Use our development revision as OPENQ_VERSION in qq.c diff -r f2d533384535 -r fb3e9bff199e libpurple/protocols/qq/buddy_info.c --- a/libpurple/protocols/qq/buddy_info.c Thu Dec 25 13:21:27 2008 +0000 +++ b/libpurple/protocols/qq/buddy_info.c Sun Dec 28 10:17:15 2008 +0000 @@ -790,7 +790,7 @@ bytes += qq_get32(&onlineTime, data + bytes); bytes += qq_get16(&level, data + bytes); bytes += qq_get16(&timeRemainder, data + bytes); - purple_debug_info("QQ", "level: %d, uid %d, tmOnline: %d, tmRemainder: %d\n", + purple_debug_info("QQ", "level: %d, uid %u, tmOnline: %d, tmRemainder: %d\n", level, uid, onlineTime, timeRemainder); bd = qq_buddy_data_find(gc, uid); @@ -825,12 +825,12 @@ bytes += qq_get32(&onlineTime, data + bytes); bytes += qq_get16(&level, data + bytes); bytes += qq_get16(&timeRemainder, data + bytes); - purple_debug_info("QQ", "level: %d, uid %d, tmOnline: %d, tmRemainder: %d\n", + purple_debug_info("QQ", "level: %d, uid %u, tmOnline: %d, tmRemainder: %d\n", level, uid, onlineTime, timeRemainder); bd = qq_buddy_data_find(gc, uid); if (bd == NULL) { - purple_debug_error("QQ", "Got levels of %d not in my buddy list\n", uid); + purple_debug_error("QQ", "Got levels of %u not in my buddy list\n", uid); return; } diff -r f2d533384535 -r fb3e9bff199e libpurple/protocols/qq/qq.c --- a/libpurple/protocols/qq/qq.c Thu Dec 25 13:21:27 2008 +0000 +++ b/libpurple/protocols/qq/qq.c Sun Dec 28 10:17:15 2008 +0000 @@ -626,7 +626,7 @@ g_string_append(info, "puzzlebird
\n"); g_string_append(info, "
\n"); g_string_append(info, _("

Code Contributors:
\n")); - g_string_append(info, "gfhuang : patches for libpurple 2.0.0beta2, maintainer
\n"); + g_string_append(info, "gfhuang(poppyer) : patches for libpurple 2.0.0beta2, maintainer
\n"); g_string_append(info, "Yuan Qingyun : patches for libpurple 1.5.0, maintainer
\n"); g_string_append(info, "henryouly : file transfer, udp sock5 proxy and qq_show, maintainer
\n"); g_string_append(info, "hzhr : maintainer
\n"); diff -r f2d533384535 -r fb3e9bff199e libpurple/protocols/qq/qq_network.c --- a/libpurple/protocols/qq/qq_network.c Thu Dec 25 13:21:27 2008 +0000 +++ b/libpurple/protocols/qq/qq_network.c Sun Dec 28 10:17:15 2008 +0000 @@ -468,7 +468,7 @@ static void udp_pending(gpointer data, gint source, PurpleInputCondition cond) { - PurpleConnection *gc = (PurpleConnection *) data; + PurpleConnection *gc = NULL; qq_data *qd; guint8 *buf; gint buf_len;