Mercurial > pidgin
changeset 23936:54432ea0a5ab
Support some older versions of the ILN command. Apparently some IM
monitoring software inserts these, even though it's invalid on MSNP15.
Also, quit processing the ILN command if the user is not known to us.
Fixes #6656.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Thu, 21 Aug 2008 06:40:00 +0000 |
parents | 2457162f6750 |
children | 60de5d1ee482 |
files | libpurple/protocols/msn/notification.c |
diffstat | 1 files changed, 38 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/msn/notification.c Thu Aug 21 05:23:47 2008 +0000 +++ b/libpurple/protocols/msn/notification.c Thu Aug 21 06:40:00 2008 +0000 @@ -950,10 +950,11 @@ PurpleAccount *account; PurpleConnection *gc; MsnUser *user; - MsnObject *msnobj; + MsnObject *msnobj = NULL; unsigned long clientid; - int networkid; - const char *state, *passport, *friendly; + int networkid = 0; + const char *state, *passport; + char *friendly; session = cmdproc->session; account = session->account; @@ -961,23 +962,47 @@ state = cmd->params[1]; passport = cmd->params[2]; - /*if a contact is actually on the WLM part or the yahoo part*/ - networkid = atoi(cmd->params[3]); - friendly = purple_url_decode(cmd->params[4]); user = msn_userlist_find_user(session->userlist, passport); + if (user == NULL) + /* Where'd this come from? */ + return; + + if (cmd->param_count == 7) { + /* MSNP14+ with Display Picture object */ + networkid = atoi(cmd->params[3]); + friendly = g_strdup(purple_url_decode(cmd->params[4])); + clientid = strtoul(cmd->params[5], NULL, 10); + msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[6])); + } else if (cmd->param_count == 6) { + /* Yes, this is 5. The friendly name could start with a number, + but the display picture object can't... */ + if (isdigit(cmd->params[5][0])) { + /* MSNP14 without Display Picture object */ + networkid = atoi(cmd->params[3]); + friendly = g_strdup(purple_url_decode(cmd->params[4])); + clientid = strtoul(cmd->params[5], NULL, 10); + } else { + /* MSNP8+ with Display Picture object */ + friendly = g_strdup(purple_url_decode(cmd->params[3])); + clientid = strtoul(cmd->params[4], NULL, 10); + msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[5])); + } + } else if (cmd->param_count == 5) { + /* MSNP8+ without Display Picture object */ + friendly = g_strdup(purple_url_decode(cmd->params[3])); + clientid = strtoul(cmd->params[4], NULL, 10); + } else { + purple_debug_warning("msn", "Received ILN with unknown number of parameters.\n"); + return; + } serv_got_alias(gc, passport, friendly); - msn_user_set_friendly_name(user, friendly); + g_free(friendly); - if (cmd->param_count == 7) - { - msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[6])); - msn_user_set_object(user, msnobj); - } + msn_user_set_object(user, msnobj); - clientid = strtoul(cmd->params[5], NULL, 10); user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE) || (user->phone.mobile && user->phone.mobile[0] == '+'); msn_user_set_clientid(user, clientid); msn_user_set_network(user, networkid);