392
415
g_return_if_fail(cmd->payload_cb != NULL);
417
purple_debug_info("MSNP14","MSG payload:{%.*s}\n",cmd->payload_len, cmd->payload);
394
418
cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len);
422
/*send Message to Yahoo Messenger*/
424
uum_send_msg(MsnSession *session,MsnMessage *msg)
427
MsnTransaction *trans;
432
cmdproc = session->notification->cmdproc;
433
g_return_if_fail(msg != NULL);
434
payload = msn_message_gen_payload(msg, &payload_len);
435
purple_debug_info("MSNP14","send UUM,payload{%s},strlen:%d,len:%d\n",
436
payload,strlen(payload),payload_len);
438
trans = msn_transaction_new(cmdproc, "UUM","%s 32 %d %d",msg->remote_user,type,payload_len);
439
msn_transaction_set_payload(trans, payload, strlen(payload));
440
msn_cmdproc_send_trans(cmdproc, trans);
444
ubm_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
448
PurpleConnection *gc;
449
const char *passport;
450
const char *content_type;
452
purple_debug_info("MSNP14","Process UBM payload:%.*s\n", len, payload);
453
msg = msn_message_new_from_cmd(cmdproc->session, cmd);
455
msn_message_parse_payload(msg, payload, len,MSG_LINE_DEM,MSG_BODY_DEM);
457
msn_message_show_readable(msg, "Notification", TRUE);
460
gc = cmdproc->session->account->gc;
461
passport = msg->remote_user;
463
content_type = msn_message_get_content_type(msg);
464
purple_debug_info("MSNP14","type:%d\n",content_type);
465
if(!strcmp(content_type,"text/plain")){
469
char *body_final = NULL;
472
body = msn_message_get_bin_data(msg, &body_len);
473
body_enc = g_markup_escape_text(body, body_len);
475
if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL) {
478
msn_parse_format(value, &pre, &post);
479
body_final = g_strdup_printf("%s%s%s", pre ? pre : "",
480
body_enc ? body_enc : "", post ? post : "");
485
serv_got_im(gc, passport, body_final, 0, time(NULL));
488
if(!strcmp(content_type,"text/x-msmsgscontrol")){
489
if(msn_message_get_attr(msg, "TypingUser") != NULL){
490
serv_got_typing(gc, passport, MSN_TYPING_RECV_TIMEOUT,
494
if(!strcmp(content_type,"text/x-msnmsgr-datacast")){
495
char *username, *str;
496
PurpleAccount *account;
500
account = cmdproc->session->account;
501
user = msg->remote_user;
503
if ((buddy = purple_find_buddy(account, user)) != NULL){
504
username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1);
506
username = g_markup_escape_text(user, -1);
509
str = g_strdup_printf(_("%s just sent you a Nudge!"), username);
511
msn_session_report_user(cmdproc->session,user,str,PURPLE_MESSAGE_SYSTEM);
514
msn_message_destroy(msg);
517
/*Yahoo msg process*/
519
ubm_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
521
purple_debug_info("MSNP14","Processing UBM... \n");
522
if(cmd->payload_len == 0){
525
/* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued
526
* command and we are processing it */
527
if (cmd->payload == NULL){
528
cmdproc->last_cmd->payload_cb = ubm_cmd_post;
529
cmdproc->servconn->payload_len = atoi(cmd->params[2]);
531
g_return_if_fail(cmd->payload_cb != NULL);
533
purple_debug_info("MSNP14","UBM payload:{%.*s}\n", cmd->payload_len, cmd->payload);
534
ubm_cmd_post(cmdproc, cmd, cmd->payload, cmd->payload_len);
398
538
/**************************************************************************
540
* we use MD5 to caculate the Challenges
400
541
**************************************************************************/
403
543
chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
405
545
MsnTransaction *trans;
407
const char *challenge_resp;
408
PurpleCipher *cipher;
409
PurpleCipherContext *context;
413
549
cipher = purple_ciphers_find_cipher("md5");
414
550
context = purple_cipher_context_new(cipher, NULL);
416
551
purple_cipher_context_append(context, (const guchar *)cmd->params[1],
417
552
strlen(cmd->params[1]));
419
challenge_resp = "VT6PX?UQTM4WM%YR";
553
challenge_resp = MSNP13_WLM_PRODUCT_KEY;
421
555
purple_cipher_context_append(context, (const guchar *)challenge_resp,
422
556
strlen(challenge_resp));
436
575
/**************************************************************************
438
577
**************************************************************************/
441
add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
578
/* add contact to xmlnode */
580
msn_add_contact_xml(MsnSession *session, xmlnode *mlNode,const char *passport, MsnListOp list_op, MsnUserType type)
582
xmlnode *d_node,*c_node;
584
const char *email,*domain;
587
g_return_if_fail(passport != NULL);
589
purple_debug_info("MSNP14","Passport: %s, type: %d\n", passport, type);
590
tokens = g_strsplit(passport, "@", 2);
594
if (email == NULL || domain == NULL) {
595
purple_debug_error("msn", "Invalid passport (%s) specified to add to contact xml.\n", passport);
597
g_return_if_reached();
600
/*find a domain Node*/
601
for(d_node = xmlnode_get_child(mlNode,"d"); d_node; d_node = xmlnode_get_next_twin(d_node))
603
const char *attr = xmlnode_get_attrib(d_node,"n");
606
if (!strcmp(attr,domain))
612
/*domain not found, create a new domain Node*/
613
purple_debug_info("msn", "Didn't find existing domain node, adding one.\n");
614
d_node = xmlnode_new("d");
615
xmlnode_set_attrib(d_node, "n", domain);
616
xmlnode_insert_child(mlNode, d_node);
619
/*create contact node*/
620
c_node = xmlnode_new("c");
621
xmlnode_set_attrib(c_node, "n", email);
623
purple_debug_info("MSNP14", "list_op: %d\n", list_op);
624
g_snprintf(fmt_str, sizeof(fmt_str), "%d", list_op);
625
xmlnode_set_attrib(c_node, "l", fmt_str);
627
if (type != MSN_USER_TYPE_UNKNOWN)
628
g_snprintf(fmt_str, sizeof(fmt_str), "%d", type);
629
else if (msn_user_is_yahoo(session->account, passport))
630
g_snprintf(fmt_str, sizeof(fmt_str), "%d", MSN_USER_TYPE_YAHOO);
632
g_snprintf(fmt_str, sizeof(fmt_str), "%d", MSN_USER_TYPE_PASSPORT);
635
//type_str = g_strdup_printf("4");
636
xmlnode_set_attrib(c_node, "t", fmt_str);
638
xmlnode_insert_child(d_node, c_node);
644
msn_notification_post_adl(MsnCmdProc *cmdproc, const char *payload, int payload_len)
646
MsnTransaction *trans;
647
purple_debug_info("MSN Notification","Sending ADL with payload: %s\n", payload);
648
trans = msn_transaction_new(cmdproc, "ADL","%d", strlen(payload));
649
msn_transaction_set_payload(trans, payload, strlen(payload));
650
msn_cmdproc_send_trans(cmdproc, trans);
653
/*dump contact info to NS*/
655
msn_notification_dump_contact(MsnSession *session)
446
const char *passport;
447
const char *friendly;
451
list = cmd->params[1];
452
passport = cmd->params[3];
453
friendly = purple_url_decode(cmd->params[4]);
455
session = cmdproc->session;
457
user = msn_userlist_find_user(session->userlist, passport);
461
user = msn_user_new(session->userlist, passport, friendly);
462
msn_userlist_add_user(session->userlist, user);
465
msn_user_set_friendly_name(user, friendly);
467
list_id = msn_get_list_id(list);
469
if (cmd->param_count >= 6)
470
group_id = atoi(cmd->params[5]);
474
msn_got_add_user(session, user, list_id, group_id);
475
msn_user_update(user);
663
const char *display_name;
665
adl_node = xmlnode_new("ml");
666
adl_node->child = NULL;
667
xmlnode_set_attrib(adl_node, "l", "1");
670
for (l = session->userlist->users; l != NULL; l = l->next){
673
/* skip RL & PL during initial dump */
674
if (!(user->list_op & MSN_LIST_OP_MASK))
677
msn_add_contact_xml(session, adl_node, user->passport,
678
user->list_op & MSN_LIST_OP_MASK, user->type);
680
/* each ADL command may contain up to 150 contacts */
681
if (++adl_count % 150 == 0 || l->next == NULL) {
682
payload = xmlnode_to_str(adl_node,&payload_len);
684
msn_notification_post_adl(session->notification->cmdproc,
685
payload, payload_len);
688
xmlnode_free(adl_node);
691
adl_node = xmlnode_new("ml");
692
adl_node->child = NULL;
693
xmlnode_set_attrib(adl_node, "l", "1");
698
if (adl_count == 0) {
699
payload = xmlnode_to_str(adl_node,&payload_len);
701
msn_notification_post_adl(session->notification->cmdproc, payload, payload_len);
704
xmlnode_free(adl_node);
707
display_name = purple_connection_get_display_name(session->account->gc);
709
&& strcmp(display_name,
710
purple_account_get_username(session->account))) {
711
msn_act_id(session->account->gc, display_name);
716
/*Post FQY to NS,Inform add a Yahoo User*/
718
msn_notification_send_fqy(MsnSession *session, const char *passport)
720
MsnTransaction *trans;
722
char* email,*domain,*payload;
725
cmdproc = session->notification->cmdproc;
727
tokens = g_strsplit(passport, "@", 2);
731
payload = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>", domain, email);
732
trans = msn_transaction_new(cmdproc, "FQY","%d", strlen(payload));
733
msn_transaction_set_payload(trans, payload, strlen(payload));
734
msn_cmdproc_send_trans(cmdproc, trans);
741
blp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
746
adl_cmd_parse(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
749
xmlnode *root, *domain_node;
751
purple_debug_misc("MSN Notification", "Parsing received ADL XML data\n");
753
g_return_if_fail(payload != NULL);
755
root = xmlnode_from_str(payload, (gssize) len);
758
purple_debug_info("MSN Notification", "Invalid XML!\n");
761
for (domain_node = xmlnode_get_child(root, "d"); domain_node; domain_node = xmlnode_get_next_twin(domain_node)) {
762
const gchar * domain = NULL;
763
xmlnode *contact_node = NULL;
765
domain = xmlnode_get_attrib(domain_node, "n");
767
for (contact_node = xmlnode_get_child(domain_node, "c"); contact_node; contact_node = xmlnode_get_next_twin(contact_node)) {
768
// gchar *name = NULL, *friendlyname = NULL, *passport= NULL;
772
// name = xmlnode_get_attrib(contact_node, "n");
773
list = xmlnode_get_attrib(contact_node, "l");
775
list_op = atoi(list);
777
// friendlyname = xmlnode_get_attrib(contact_node, "f");
779
// passport = g_strdup_printf("%s@%s", name, domain);
781
// if (friendlyname != NULL) {
782
// decoded_friendlyname = g_strdup(purple_url_decode(friendlyname));
784
// decoded_friendlyname = g_strdup(passport);
787
if (list_op & MSN_LIST_RL_OP) {
788
/* someone is adding us */
789
// got_new_entry(cmdproc->session->account->gc, passport, decoded_friendly_name);
790
msn_get_contact_list(cmdproc->session->contact, MSN_PS_PENDING_LIST, NULL);
793
// g_free(decoded_friendly_name);
802
adl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
806
g_return_if_fail(cmdproc != NULL);
807
g_return_if_fail(cmdproc->session != NULL);
808
g_return_if_fail(cmdproc->last_cmd != NULL);
809
g_return_if_fail(cmd != NULL);
811
session = cmdproc->session;
813
if ( !strcmp(cmd->params[1], "OK")) {
815
msn_session_finish_login(session);
817
cmdproc->last_cmd->payload_cb = adl_cmd_parse;
824
adl_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
827
PurpleAccount *account;
828
PurpleConnection *gc;
831
session = cmdproc->session;
832
account = session->account;
833
gc = purple_account_get_connection(account);
835
purple_debug_error("msn","ADL error\n");
836
reason = g_strdup_printf(_("Unknown error (%d)"), error);
837
purple_notify_error(gc, NULL, _("Unable to add user"), reason);
842
fqy_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
845
purple_debug_info("MSN Notification","FQY payload:\n%s\n", payload);
846
g_return_if_fail(cmdproc->session != NULL);
847
g_return_if_fail(cmdproc->session->contact != NULL);
848
// msn_notification_post_adl(cmdproc, payload, len);
849
// msn_get_address_book(cmdproc->session->contact, MSN_AB_SAVE_CONTACT, NULL, NULL);
853
fqy_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
855
purple_debug_info("MSNP14","Process FQY\n");
856
cmdproc->last_cmd->payload_cb = fqy_cmd_post;
860
rml_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
863
MsnTransaction *trans;
867
purple_debug_info("MSNP14","Process RML\n");
869
trans = msn_transaction_new(cmdproc, "RML","");
871
msn_transaction_set_payload(trans, payload, strlen(payload));
873
msn_cmdproc_send_trans(cmdproc, trans);
1577
gcf_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
1583
g_return_if_fail(cmd->payload != NULL);
1585
if ( (root = xmlnode_from_str(cmd->payload, cmd->payload_len)) == NULL)
1587
purple_debug_error("MSN","Unable to parse GCF payload into a XML tree");
1591
buf = xmlnode_to_formatted_str(root, NULL);
1593
/* get the payload content */
1594
purple_debug_info("MSNP14","GCF command payload:\n%s\n",buf);
1601
gcf_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
1603
purple_debug_info("MSNP14","Processing GCF command\n");
1604
cmdproc->last_cmd->payload_cb = gcf_cmd_post;
1609
sbs_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
1611
purple_debug_info("MSNP14","Processing SBS... \n");
1612
if(cmd->payload_len == 0){
1615
/*get the payload content*/
1619
* Get the UBX's PSM info
1620
* Post it to the User status
1621
* Thanks for Chris <ukdrizzle@yahoo.co.uk>'s code
1624
ubx_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
1627
MsnSession *session;
1628
PurpleAccount *account;
1630
const char *passport;
1631
char *psm_str, *str;
1632
CurrentMedia media = {NULL, NULL, NULL};
1634
session = cmdproc->session;
1635
account = session->account;
1637
passport = cmd->params[0];
1638
user = msn_userlist_find_user(session->userlist, passport);
1640
psm_str = msn_get_psm(cmd->payload,len);
1641
msn_user_set_statusline(user, psm_str);
1644
str = msn_get_currentmedia(cmd->payload, len);
1645
if (msn_parse_currentmedia(str, &media))
1646
msn_user_set_currentmedia(user, &media);
1648
msn_user_set_currentmedia(user, NULL);
1651
msn_user_update(user);
1655
ubx_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
1657
purple_debug_misc("MSNP14","UBX received.\n");
1658
if(cmd->payload_len == 0){
1661
cmdproc->last_cmd->payload_cb = ubx_cmd_post;
1665
uux_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
1667
purple_debug_misc("MSNP14","UUX received.\n");
1149
1670
/**************************************************************************
1150
1671
* Message Types
1151
1672
**************************************************************************/
1246
1785
g_hash_table_destroy(table);
1788
/*offline Message notification process*/
1790
initial_mdata_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
1792
MsnSession *session;
1793
PurpleConnection *gc;
1795
const char *mdata, *unread;
1797
session = cmdproc->session;
1798
gc = session->account->gc;
1800
if (strcmp(msg->remote_user, "Hotmail"))
1801
/* This isn't an official message. */
1804
/*new a oim session*/
1805
// session->oim = msn_oim_new(session);
1806
// msn_oim_connect(session->oim);
1808
table = msn_message_get_hashtable_from_body(msg);
1810
mdata = g_hash_table_lookup(table, "Mail-Data");
1813
msn_parse_oim_msg(session->oim, mdata);
1815
if (g_hash_table_lookup(table, "Inbox-URL") == NULL)
1817
g_hash_table_destroy(table);
1821
if (session->passport_info.file == NULL)
1823
MsnTransaction *trans;
1824
trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX");
1825
msn_transaction_queue_cmd(trans, msg->cmd);
1827
msn_cmdproc_send_trans(cmdproc, trans);
1829
g_hash_table_destroy(table);
1833
if (!purple_account_get_check_mail(session->account))
1835
g_hash_table_destroy(table);
1839
unread = g_hash_table_lookup(table, "Inbox-Unread");
1843
int count = atoi(unread);
1847
const char *passport;
1850
passport = msn_user_get_passport(session->user);
1851
url = session->passport_info.file;
1853
purple_notify_emails(gc, atoi(unread), FALSE, NULL, NULL,
1854
&passport, &url, NULL, NULL);
1858
g_hash_table_destroy(table);
1861
/*offline Message Notification*/
1863
delete_oim_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
1865
purple_debug_misc("MSN Notification","Delete OIM message.\n");
1250
1869
email_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
1350
msn_notification_add_buddy(MsnNotification *notification, const char *list,
1351
const char *who, const char *store_name,
1969
msn_notification_add_buddy_to_list(MsnNotification *notification, MsnListId list_id,
1354
1972
MsnCmdProc *cmdproc;
1973
MsnListOp list_op = 1 << list_id;
1355
1978
cmdproc = notification->servconn->cmdproc;
1357
if (group_id < 0 && !strcmp(list, "FL"))
1362
msn_cmdproc_send(cmdproc, "ADD", "%s %s %s %d",
1363
list, who, store_name, group_id);
1367
msn_cmdproc_send(cmdproc, "ADD", "%s %s %s", list, who, store_name);
1980
adl_node = xmlnode_new("ml");
1981
adl_node->child = NULL;
1983
msn_add_contact_xml(notification->session, adl_node, who, list_op,
1984
MSN_USER_TYPE_PASSPORT);
1986
payload = xmlnode_to_str(adl_node,&payload_len);
1987
xmlnode_free(adl_node);
1989
msn_notification_post_adl(notification->servconn->cmdproc,
1990
payload,payload_len);
1372
msn_notification_rem_buddy(MsnNotification *notification, const char *list,
1373
const char *who, int group_id)
1995
msn_notification_rem_buddy_from_list(MsnNotification *notification, MsnListId list_id,
1375
1998
MsnCmdProc *cmdproc;
1999
MsnTransaction *trans;
2000
MsnListOp list_op = 1 << list_id;
1376
2005
cmdproc = notification->servconn->cmdproc;
1380
msn_cmdproc_send(cmdproc, "REM", "%s %s %d", list, who, group_id);
1384
msn_cmdproc_send(cmdproc, "REM", "%s %s", list, who);
2007
rml_node = xmlnode_new("ml");
2008
rml_node->child = NULL;
2010
msn_add_contact_xml(notification->session, rml_node, who, list_op, MSN_USER_TYPE_PASSPORT);
2012
payload = xmlnode_to_str(rml_node, &payload_len);
2013
xmlnode_free(rml_node);
2015
purple_debug_info("MSN Notification","Send RML with payload:\n%s\n", payload);
2016
trans = msn_transaction_new(cmdproc, "RML","%d", strlen(payload));
2017
msn_transaction_set_payload(trans, payload, strlen(payload));
2018
msn_cmdproc_send_trans(cmdproc, trans);
1388
2022
/**************************************************************************
1390
2024
**************************************************************************/
1393
2026
msn_notification_init(void)
1399
2032
/* Synchronous */
1400
2033
msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL);
1401
2034
msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd);
1402
msn_table_add_cmd(cbs_table, "ADD", "ADD", add_cmd);
1403
msn_table_add_cmd(cbs_table, "ADD", "ILN", iln_cmd);
1404
msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd);
2035
msn_table_add_cmd(cbs_table, "ADL", "ILN", iln_cmd);
2036
// msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd); /* Removed as of MSNP13 */
1405
2037
msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd);
1406
2038
msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd);
1407
msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd);
2039
msn_table_add_cmd(cbs_table, "USR", "GCF", gcf_cmd);
2040
// msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd); /* Removed as of MSNP13 */
1408
2041
msn_table_add_cmd(cbs_table, "CVR", "CVR", cvr_cmd);
1409
2042
msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd);
1410
2043
msn_table_add_cmd(cbs_table, "REA", "REA", rea_cmd);
1411
2044
msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd);
1412
/* msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd); */
1413
msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL);
2045
msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd);
2046
// msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL);
1414
2047
msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd);
1415
2048
msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd);
1416
2049
msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd);