libpurple/protocols/yahoo/ymsg.c

changeset 37207
e666f49a3e86
parent 37195
3032113d656e
child 37211
63581dad3ef3
equal deleted inserted replaced
37206:9c34b2c88dad 37207:e666f49a3e86
157 GSList *l = pkt->hash; 157 GSList *l = pkt->hash;
158 YahooFriend *f = NULL; 158 YahooFriend *f = NULL;
159 char *name = NULL; 159 char *name = NULL;
160 gboolean unicode = FALSE; 160 gboolean unicode = FALSE;
161 char *message = NULL; 161 char *message = NULL;
162 YahooFederation fed = YAHOO_FEDERATION_NONE;
163 char *fedname = NULL;
164 162
165 if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) { 163 if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) {
166 if (!purple_account_get_remember_password(account)) 164 if (!purple_account_get_remember_password(account))
167 purple_account_set_password(account, NULL, NULL, NULL); 165 purple_account_set_password(account, NULL, NULL, NULL);
168 purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NAME_IN_USE, 166 purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NAME_IN_USE,
188 yahoo_update_status(gc, name, f); 186 yahoo_update_status(gc, name, f);
189 } 187 }
190 name = message = NULL; 188 name = message = NULL;
191 f = NULL; 189 f = NULL;
192 if (pair->value && g_utf8_validate(pair->value, -1, NULL)) { 190 if (pair->value && g_utf8_validate(pair->value, -1, NULL)) {
193 GSList *tmplist;
194
195 name = pair->value; 191 name = pair->value;
196
197 /* Look ahead to see if we have the federation info about the buddy */
198 for (tmplist = l->next; tmplist; tmplist = tmplist->next) {
199 struct yahoo_pair *p = tmplist->data;
200 if (p->key == 7)
201 break;
202 if (p->key == 241) {
203 fed = strtol(p->value, NULL, 10);
204 g_free(fedname);
205 switch (fed) {
206 case YAHOO_FEDERATION_MSN:
207 name = fedname = g_strconcat("msn/", name, NULL);
208 break;
209 case YAHOO_FEDERATION_OCS:
210 name = fedname = g_strconcat("ocs/", name, NULL);
211 break;
212 case YAHOO_FEDERATION_IBM:
213 name = fedname = g_strconcat("ibm/", name, NULL);
214 break;
215 case YAHOO_FEDERATION_NONE:
216 default:
217 fedname = NULL;
218 break;
219 }
220 break;
221 }
222 }
223 f = yahoo_friend_find_or_new(gc, name); 192 f = yahoo_friend_find_or_new(gc, name);
224 f->fed = fed;
225 } 193 }
226 break; 194 break;
227 case 10: /* state */ 195 case 10: /* state */
228 if (!f) 196 if (!f)
229 break; 197 break;
377 break; 345 break;
378 case 244: /* client version number. Yahoo Client Detection */ 346 case 244: /* client version number. Yahoo Client Detection */
379 if(f && strtol(pair->value, NULL, 10)) 347 if(f && strtol(pair->value, NULL, 10))
380 f->version_id = strtol(pair->value, NULL, 10); 348 f->version_id = strtol(pair->value, NULL, 10);
381 break; 349 break;
382 case 241: /* Federated network buddy belongs to */
383 break; /* We process this when get '7' */
384 default: 350 default:
385 purple_debug_warning("yahoo", 351 purple_debug_warning("yahoo",
386 "Unknown status key %d\n", pair->key); 352 "Unknown status key %d\n", pair->key);
387 break; 353 break;
388 } 354 }
397 yahoo_friend_set_status_message(f, yahoo_string_decode(gc, message, unicode)); 363 yahoo_friend_set_status_message(f, yahoo_string_decode(gc, message, unicode));
398 364
399 if (name) /* update the last buddy */ 365 if (name) /* update the last buddy */
400 yahoo_update_status(gc, name, f); 366 yahoo_update_status(gc, name, f);
401 } 367 }
402
403 g_free(fedname);
404 } 368 }
405 369
406 static void yahoo_do_group_check(PurpleAccount *account, GHashTable *ht, const char *name, const char *group) 370 static void yahoo_do_group_check(PurpleAccount *account, GHashTable *ht, const char *name, const char *group)
407 { 371 {
408 PurpleBuddy *b; 372 PurpleBuddy *b;
505 GHashTable *ht; 469 GHashTable *ht;
506 char *norm_bud = NULL; 470 char *norm_bud = NULL;
507 char *temp = NULL; 471 char *temp = NULL;
508 YahooFriend *f = NULL; /* It's your friends. They're going to want you to share your StarBursts. */ 472 YahooFriend *f = NULL; /* It's your friends. They're going to want you to share your StarBursts. */
509 /* But what if you had no friends? */ 473 /* But what if you had no friends? */
510 YahooFederation fed = YAHOO_FEDERATION_NONE;
511 int stealth = 0; 474 int stealth = 0;
512 475
513 ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_slist_free); 476 ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_slist_free);
514 477
515 while (l) { 478 while (l) {
530 } 493 }
531 494
532 break; 495 break;
533 case 301: /* This is 319 before all s/n's in a group after the first. It is followed by an identical 300. */ 496 case 301: /* This is 319 before all s/n's in a group after the first. It is followed by an identical 300. */
534 if(temp != NULL) { 497 if(temp != NULL) {
535 switch (fed) { 498 norm_bud = g_strdup(temp);
536 case YAHOO_FEDERATION_MSN: 499
537 norm_bud = g_strconcat("msn/", temp, NULL);
538 break;
539 case YAHOO_FEDERATION_OCS:
540 norm_bud = g_strconcat("ocs/", temp, NULL);
541 break;
542 case YAHOO_FEDERATION_IBM:
543 norm_bud = g_strconcat("ibm/", temp, NULL);
544 break;
545 case YAHOO_FEDERATION_PBX:
546 norm_bud = g_strconcat("pbx/", temp, NULL);
547 break;
548 case YAHOO_FEDERATION_NONE:
549 norm_bud = g_strdup(temp);
550 break;
551 }
552 if (yd->current_list15_grp) { 500 if (yd->current_list15_grp) {
553 /* This buddy is in a group */ 501 /* This buddy is in a group */
554 f = yahoo_friend_find_or_new(gc, norm_bud); 502 f = yahoo_friend_find_or_new(gc, norm_bud);
555 if (!purple_blist_find_buddy(account, norm_bud)) { 503 if (!purple_blist_find_buddy(account, norm_bud)) {
556 PurpleBuddy *b; 504 PurpleBuddy *b;
561 } 509 }
562 b = purple_buddy_new(account, norm_bud, NULL); 510 b = purple_buddy_new(account, norm_bud, NULL);
563 purple_blist_add_buddy(b, NULL, g, NULL); 511 purple_blist_add_buddy(b, NULL, g, NULL);
564 } 512 }
565 yahoo_do_group_check(account, ht, norm_bud, yd->current_list15_grp); 513 yahoo_do_group_check(account, ht, norm_bud, yd->current_list15_grp);
566 if(fed) { 514
567 f->fed = fed;
568 purple_debug_info("yahoo", "Setting federation to %d\n", f->fed);
569 }
570 if(stealth == 2) 515 if(stealth == 2)
571 f->presence = YAHOO_PRESENCE_PERM_OFFLINE; 516 f->presence = YAHOO_PRESENCE_PERM_OFFLINE;
572 517
573 /* set p2p status not connected and no p2p packet sent */ 518 yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
574 if(fed == YAHOO_FEDERATION_NONE) { 519 f->p2p_packet_sent = 0;
575 yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
576 f->p2p_packet_sent = 0;
577 } else
578 yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_DO_NOT_CONNECT);
579 } else { 520 } else {
580 /* This buddy is on the ignore list (and therefore in no group) */ 521 /* This buddy is on the ignore list (and therefore in no group) */
581 purple_debug_info("yahoo", "%s adding %s to the deny list because of the ignore list / no group was found\n", purple_account_get_username(account), norm_bud); 522 purple_debug_info("yahoo", "%s adding %s to the deny list because of the ignore list / no group was found\n", purple_account_get_username(account), norm_bud);
582 purple_account_privacy_deny_add(account, norm_bud, 1); 523 purple_account_privacy_deny_add(account, norm_bud, 1);
583 } 524 }
584 525
585 g_free(norm_bud); 526 g_free(norm_bud);
586 norm_bud=NULL; 527 norm_bud=NULL;
587 fed = YAHOO_FEDERATION_NONE;
588 stealth = 0; 528 stealth = 0;
589 g_free(temp); 529 g_free(temp);
590 temp = NULL; 530 temp = NULL;
591 } 531 }
592 break; 532 break;
603 } else { 543 } else {
604 purple_debug_warning("yahoo", "yahoo_process_list_15 " 544 purple_debug_warning("yahoo", "yahoo_process_list_15 "
605 "got non-UTF-8 string for key %d\n", pair->key); 545 "got non-UTF-8 string for key %d\n", pair->key);
606 } 546 }
607 break; 547 break;
608 case 241: /* user on federated network */
609 fed = strtol(pair->value, NULL, 10);
610 break;
611 case 59: /* somebody told cookies come here too, but im not sure */ 548 case 59: /* somebody told cookies come here too, but im not sure */
612 if (g_utf8_validate(pair->value, -1, NULL)) { 549 if (g_utf8_validate(pair->value, -1, NULL)) {
613 yahoo_process_cookie(yd, pair->value); 550 yahoo_process_cookie(yd, pair->value);
614 } else { 551 } else {
615 purple_debug_warning("yahoo", "yahoo_process_list_15 " 552 purple_debug_warning("yahoo", "yahoo_process_list_15 "
617 } 554 }
618 break; 555 break;
619 case 317: /* Stealth Setting */ 556 case 317: /* Stealth Setting */
620 stealth = strtol(pair->value, NULL, 10); 557 stealth = strtol(pair->value, NULL, 10);
621 break; 558 break;
622 /* case 242: */ /* this seems related to 241 */
623 /* break; */
624 } 559 }
625 } 560 }
626 561
627 g_hash_table_foreach(ht, yahoo_do_group_cleanup, NULL); 562 g_hash_table_foreach(ht, yahoo_do_group_cleanup, NULL);
628 563
825 char *game = NULL; 760 char *game = NULL;
826 YahooFriend *f = NULL; 761 YahooFriend *f = NULL;
827 GSList *l = pkt->hash; 762 GSList *l = pkt->hash;
828 gint val_11 = 0; 763 gint val_11 = 0;
829 YahooData *yd = purple_connection_get_protocol_data(gc); 764 YahooData *yd = purple_connection_get_protocol_data(gc);
830 YahooFederation fed = YAHOO_FEDERATION_NONE;
831 765
832 account = purple_connection_get_account(gc); 766 account = purple_connection_get_account(gc);
833 767
834 while (l) { 768 while (l) {
835 struct yahoo_pair *pair = l->data; 769 struct yahoo_pair *pair = l->data;
851 purple_debug_warning("yahoo", "yahoo_process_notify " 785 purple_debug_warning("yahoo", "yahoo_process_notify "
852 "got non-UTF-8 string for key %d\n", pair->key); 786 "got non-UTF-8 string for key %d\n", pair->key);
853 } 787 }
854 } else if (pair->key == 11) { 788 } else if (pair->key == 11) {
855 val_11 = strtol(pair->value, NULL, 10); 789 val_11 = strtol(pair->value, NULL, 10);
856 } else if (pair->key == 241) {
857 fed = strtol(pair->value, NULL, 10);
858 } 790 }
859 l = l->next; 791 l = l->next;
860 } 792 }
861 793
862 if (!from || !msg) 794 if (!from || !msg)
863 return; 795 return;
864 796
865 /* disconnect the peer if connected through p2p and sends wrong value for session id */ 797 /* disconnect the peer if connected through p2p and sends wrong value for session id */
866 if( (pkt_type == YAHOO_PKT_TYPE_P2P) && (val_11 != yd->session_id) ) { 798 if ((pkt_type == YAHOO_PKT_TYPE_P2P) && (val_11 != yd->session_id)) {
867 purple_debug_warning("yahoo","p2p: %s sent us notify with wrong session id. Disconnecting p2p connection to peer\n", from); 799 purple_debug_warning("yahoo","p2p: %s sent us notify with wrong session id. Disconnecting p2p connection to peer\n", from);
868 /* remove from p2p connection lists, also calls yahoo_p2p_disconnect_destroy_data */ 800 /* remove from p2p connection lists, also calls yahoo_p2p_disconnect_destroy_data */
869 g_hash_table_remove(yd->peers, from); 801 g_hash_table_remove(yd->peers, from);
870 return; 802 return;
871 } 803 }
872 804
873 if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING")) 805 if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING"))
874 && (purple_account_privacy_check(account, from))) 806 && (purple_account_privacy_check(account, from)))
875 { 807 {
876 char *fed_from = from;
877 switch (fed) {
878 case YAHOO_FEDERATION_MSN:
879 fed_from = g_strconcat("msn/", from, NULL);
880 break;
881 case YAHOO_FEDERATION_OCS:
882 fed_from = g_strconcat("ocs/", from, NULL);
883 break;
884 case YAHOO_FEDERATION_IBM:
885 fed_from = g_strconcat("ibm/", from, NULL);
886 break;
887 case YAHOO_FEDERATION_PBX:
888 fed_from = g_strconcat("pbx/", from, NULL);
889 break;
890 case YAHOO_FEDERATION_NONE:
891 default:
892 break;
893 }
894 808
895 if (stat && *stat == '1') 809 if (stat && *stat == '1')
896 purple_serv_got_typing(gc, fed_from, 0, PURPLE_IM_TYPING); 810 purple_serv_got_typing(gc, from, 0, PURPLE_IM_TYPING);
897 else 811 else
898 purple_serv_got_typing_stopped(gc, fed_from); 812 purple_serv_got_typing_stopped(gc, from);
899
900 if (fed_from != from)
901 g_free(fed_from);
902 813
903 } else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) { 814 } else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) {
904 PurpleBuddy *bud = purple_blist_find_buddy(account, from); 815 PurpleBuddy *bud = purple_blist_find_buddy(account, from);
905 816
906 if (!bud) { 817 if (!bud) {
935 int time; 846 int time;
936 int utf8; 847 int utf8;
937 int buddy_icon; 848 int buddy_icon;
938 char *id; 849 char *id;
939 char *msg; 850 char *msg;
940 YahooFederation fed;
941 char *fed_from;
942 }; 851 };
943 852
944 static void yahoo_process_sms_message(PurpleConnection *gc, struct yahoo_packet *pkt) 853 static void yahoo_process_sms_message(PurpleConnection *gc, struct yahoo_packet *pkt)
945 { 854 {
946 PurpleAccount *account; 855 PurpleAccount *account;
1042 im = g_new0(struct _yahoo_im, 1); 951 im = g_new0(struct _yahoo_im, 1);
1043 list = g_slist_append(list, im); 952 list = g_slist_append(list, im);
1044 im->from = pair->value; 953 im->from = pair->value;
1045 im->time = time(NULL); 954 im->time = time(NULL);
1046 im->utf8 = TRUE; 955 im->utf8 = TRUE;
1047 im->fed = YAHOO_FEDERATION_NONE;
1048 im->fed_from = g_strdup(im->from);
1049 } else { 956 } else {
1050 purple_debug_warning("yahoo", "yahoo_process_message " 957 purple_debug_warning("yahoo", "yahoo_process_message "
1051 "got non-UTF-8 string for key %d\n", pair->key); 958 "got non-UTF-8 string for key %d\n", pair->key);
1052 } 959 }
1053 } else if (im && pair->key == 5) { 960 } else if (im && pair->key == 5) {
1062 if (im) 969 if (im)
1063 im->buddy_icon = strtol(pair->value, NULL, 10); 970 im->buddy_icon = strtol(pair->value, NULL, 10);
1064 } else if (pair->key == 14) { 971 } else if (pair->key == 14) {
1065 if (im) 972 if (im)
1066 im->msg = pair->value; 973 im->msg = pair->value;
1067 } else if (im && pair->key == 241) {
1068 im->fed = strtol(pair->value, NULL, 10);
1069 g_free(im->fed_from);
1070 switch (im->fed) {
1071 case YAHOO_FEDERATION_MSN:
1072 im->fed_from = g_strconcat("msn/",im->from, NULL);
1073 break;
1074 case YAHOO_FEDERATION_OCS:
1075 im->fed_from = g_strconcat("ocs/",im->from, NULL);
1076 break;
1077 case YAHOO_FEDERATION_IBM:
1078 im->fed_from = g_strconcat("ibm/",im->from, NULL);
1079 break;
1080 case YAHOO_FEDERATION_PBX:
1081 im->fed_from = g_strconcat("pbx/",im->from, NULL);
1082 break;
1083 case YAHOO_FEDERATION_NONE:
1084 default:
1085 im->fed_from = g_strdup(im->from);
1086 break;
1087 }
1088 purple_debug_info("yahoo", "Message from federated (%d) buddy %s.\n", im->fed, im->fed_from);
1089
1090 } else if (im && (pair->key == 11)) { 974 } else if (im && (pair->key == 11)) {
1091 /* peer session id */ 975 /* peer session id */
1092 /* disconnect the peer if connected through p2p and sends wrong value for session id */ 976 /* disconnect the peer if connected through p2p and sends wrong value for session id */
1093 if( (im->fed == YAHOO_FEDERATION_NONE) && (pkt_type == YAHOO_PKT_TYPE_P2P) 977 if( (pkt_type == YAHOO_PKT_TYPE_P2P)
1094 && (yd->session_id != strtol(pair->value, NULL, 10)) ) 978 && (yd->session_id != strtol(pair->value, NULL, 10)) )
1095 { 979 {
1096 purple_debug_warning("yahoo","p2p: %s sent us message with wrong session id. Disconnecting p2p connection to peer\n", im->fed_from); 980 purple_debug_warning("yahoo","p2p: %s sent us message with wrong session id. Disconnecting p2p connection to peer\n", im->from);
1097 /* remove from p2p connection lists, also calls yahoo_p2p_disconnect_destroy_data */ 981 /* remove from p2p connection lists, also calls yahoo_p2p_disconnect_destroy_data */
1098 g_hash_table_remove(yd->peers, im->fed_from); 982 g_hash_table_remove(yd->peers, im->from);
1099 g_free(im->fed_from); 983 g_free(im->from);
1100 g_free(im); 984 g_free(im);
1101 return; /* Not sure whether we should process remaining IMs in this packet */ 985 return; /* Not sure whether we should process remaining IMs in this packet */
1102 } 986 }
1103 987
1104 } else if (im && pair->key == 63 && g_utf8_validate(pair->value, -1, NULL)) { 988 } else if (im && pair->key == 63 && g_utf8_validate(pair->value, -1, NULL)) {
1105 /* IMV key */ 989 /* IMV key */
1106 /* Check for the Doodle IMV, no IMvironment for federated buddies */ 990 /* Check for the Doodle IMV */
1107 if (im->from != NULL && im->fed == YAHOO_FEDERATION_NONE) 991 if (im->from != NULL)
1108 { 992 {
1109 g_hash_table_replace(yd->imvironments, g_strdup(im->from), g_strdup(pair->value)); 993 g_hash_table_replace(yd->imvironments, g_strdup(im->from), g_strdup(pair->value));
1110 994
1111 if (strstr(pair->value, "doodle;") != NULL) 995 if (strstr(pair->value, "doodle;") != NULL)
1112 { 996 {
1113 PurpleWhiteboard *wb; 997 PurpleWhiteboard *wb;
1114 998
1115 if (!purple_account_privacy_check(account, im->from)) { 999 if (!purple_account_privacy_check(account, im->from)) {
1116 purple_debug_info("yahoo", "Doodle request from %s dropped.\n", 1000 purple_debug_info("yahoo", "Doodle request from %s dropped.\n",
1117 im->from); 1001 im->from);
1118 g_free(im->fed_from); 1002 g_free(im->from);
1119 g_free(im); 1003 g_free(im);
1120 return; 1004 return;
1121 } 1005 }
1122 /* I'm not sure the following ever happens -DAA */ 1006 /* I'm not sure the following ever happens -DAA */
1123 wb = purple_whiteboard_get_session(account, im->from); 1007 wb = purple_whiteboard_get_session(account, im->from);
1147 _("Your Yahoo! message did not get sent."), NULL, 1031 _("Your Yahoo! message did not get sent."), NULL,
1148 purple_request_cpar_from_connection(gc)); 1032 purple_request_cpar_from_connection(gc));
1149 } 1033 }
1150 1034
1151 for (l = list; l; l = l->next) { 1035 for (l = list; l; l = l->next) {
1152 YahooFriend *f;
1153 char *m, *m2; 1036 char *m, *m2;
1154 im = l->data; 1037 im = l->data;
1155 1038
1156 if (!im->fed_from || !im->msg) { 1039 if (!im->from || !im->msg) {
1157 g_free(im->fed_from); 1040 g_free(im->from);
1158 g_free(im); 1041 g_free(im);
1159 continue; 1042 continue;
1160 } 1043 }
1161 1044
1162 if (!purple_account_privacy_check(account, im->fed_from)) { 1045 if (!purple_account_privacy_check(account, im->from)) {
1163 purple_debug_info("yahoo", "Message from %s dropped.\n", im->fed_from); 1046 purple_debug_info("yahoo", "Message from %s dropped.\n", im->from);
1164 return; 1047 return;
1165 } 1048 }
1166 1049
1167 /* 1050 /*
1168 * TODO: Is there anything else we should check when determining whether 1051 * TODO: Is there anything else we should check when determining whether
1196 m = m2; 1079 m = m2;
1197 purple_util_chrreplace(m, '\r', '\n'); 1080 purple_util_chrreplace(m, '\r', '\n');
1198 if (!strcmp(m, "<ding>")) { 1081 if (!strcmp(m, "<ding>")) {
1199 char *username; 1082 char *username;
1200 1083
1201 username = g_markup_escape_text(im->fed_from, -1); 1084 username = g_markup_escape_text(im->from, -1);
1202 purple_protocol_got_attention(gc, username, YAHOO_BUZZ); 1085 purple_protocol_got_attention(gc, username, YAHOO_BUZZ);
1203 g_free(username); 1086 g_free(username);
1204 g_free(m); 1087 g_free(m);
1205 g_free(im->fed_from); 1088 g_free(im->from);
1206 g_free(im); 1089 g_free(im);
1207 continue; 1090 continue;
1208 } 1091 }
1209 1092
1210 m2 = yahoo_codes_to_html(m); 1093 m2 = yahoo_codes_to_html(m);
1211 g_free(m); 1094 g_free(m);
1212 1095
1213 purple_serv_got_im(gc, im->fed_from, m2, 0, im->time); 1096 purple_serv_got_im(gc, im->from, m2, 0, im->time);
1214 g_free(m2); 1097 g_free(m2);
1215 1098
1216 /* Official clients don't share buddy images with federated buddies */ 1099 g_free(im->from);
1217 if (im->fed == YAHOO_FEDERATION_NONE) {
1218 if ((f = yahoo_friend_find(gc, im->from)) && im->buddy_icon == 2) {
1219 if (yahoo_friend_get_buddy_icon_need_request(f)) {
1220 yahoo_send_picture_request(gc, im->from);
1221 yahoo_friend_set_buddy_icon_need_request(f, FALSE);
1222 }
1223 }
1224 }
1225
1226 g_free(im->fed_from);
1227 g_free(im); 1100 g_free(im);
1228 } 1101 }
1229 1102
1230 g_slist_free(list); 1103 g_slist_free(list);
1231 } 1104 }
1269 1142
1270 struct yahoo_add_request { 1143 struct yahoo_add_request {
1271 PurpleConnection *gc; 1144 PurpleConnection *gc;
1272 char *id; 1145 char *id;
1273 char *who; 1146 char *who;
1274 YahooFederation fed;
1275 }; 1147 };
1276 1148
1277 static void 1149 static void
1278 yahoo_buddy_add_authorize_cb(const char *message, gpointer data) 1150 yahoo_buddy_add_authorize_cb(const char *message, gpointer data)
1279 { 1151 {
1281 struct yahoo_packet *pkt; 1153 struct yahoo_packet *pkt;
1282 YahooData *yd = purple_connection_get_protocol_data(add_req->gc); 1154 YahooData *yd = purple_connection_get_protocol_data(add_req->gc);
1283 const char *who = add_req->who; 1155 const char *who = add_req->who;
1284 1156
1285 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15, YAHOO_STATUS_AVAILABLE, yd->session_id); 1157 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
1286 if (add_req->fed) { 1158 yahoo_packet_hash(pkt, "ssii",
1287 who += 4; 1159 1, add_req->id,
1288 yahoo_packet_hash(pkt, "ssiii", 1160 5, who,
1289 1, add_req->id, 1161 13, 1,
1290 5, who, 1162 334, 0);
1291 241, add_req->fed,
1292 13, 1,
1293 334, 0);
1294 }
1295 else {
1296 yahoo_packet_hash(pkt, "ssii",
1297 1, add_req->id,
1298 5, who,
1299 13, 1,
1300 334, 0);
1301 }
1302 1163
1303 yahoo_packet_send_and_free(pkt, yd); 1164 yahoo_packet_send_and_free(pkt, yd);
1304 1165
1305 g_free(add_req->id); 1166 g_free(add_req->id);
1306 g_free(add_req->who); 1167 g_free(add_req->who);
1320 encoded_msg = yahoo_string_encode(add_req->gc, msg, FALSE); 1181 encoded_msg = yahoo_string_encode(add_req->gc, msg, FALSE);
1321 1182
1322 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15, 1183 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15,
1323 YAHOO_STATUS_AVAILABLE, yd->session_id); 1184 YAHOO_STATUS_AVAILABLE, yd->session_id);
1324 1185
1325 if (add_req->fed) { 1186 yahoo_packet_hash(pkt, "ssiiis",
1326 who += 4; /* Skip fed identifier (msn|ocs|ibm)/' */ 1187 1, add_req->id,
1327 yahoo_packet_hash(pkt, "ssiiiis", 1188 5, who,
1328 1, add_req->id, 1189 13, 2,
1329 5, who, 1190 334, 0,
1330 241, add_req->fed, 1191 97, 1, /* UTF-8 */
1331 13, 2, 1192 14, encoded_msg ? encoded_msg : "");
1332 334, 0,
1333 97, 1, /* UTF-8 */
1334 14, encoded_msg ? encoded_msg : "");
1335 }
1336 else {
1337 yahoo_packet_hash(pkt, "ssiiis",
1338 1, add_req->id,
1339 5, who,
1340 13, 2,
1341 334, 0,
1342 97, 1, /* UTF-8 */
1343 14, encoded_msg ? encoded_msg : "");
1344 }
1345 1193
1346 1194
1347 yahoo_packet_send_and_free(pkt, yd); 1195 yahoo_packet_send_and_free(pkt, yd);
1348 1196
1349 g_free(encoded_msg); 1197 g_free(encoded_msg);
1384 1232
1385 account = purple_connection_get_account(gc); 1233 account = purple_connection_get_account(gc);
1386 1234
1387 /* Buddy authorized/declined our addition */ 1235 /* Buddy authorized/declined our addition */
1388 if (pkt->status == 1) { 1236 if (pkt->status == 1) {
1389 char *temp = NULL;
1390 char *who = NULL; 1237 char *who = NULL;
1391 int response = 0; 1238 int response = 0;
1392 YahooFederation fed = YAHOO_FEDERATION_NONE;
1393 1239
1394 while (l) { 1240 while (l) {
1395 struct yahoo_pair *pair = l->data; 1241 struct yahoo_pair *pair = l->data;
1396 1242
1397 switch (pair->key) { 1243 switch (pair->key) {
1398 case 4: 1244 case 4:
1399 if (g_utf8_validate(pair->value, -1, NULL)) {
1400 temp = pair->value;
1401 } else {
1402 purple_debug_warning("yahoo", "yahoo_buddy_auth_req_15 "
1403 "got non-UTF-8 string for key %d\n", pair->key);
1404 }
1405 break; 1245 break;
1406 case 13: 1246 case 13:
1407 response = strtol(pair->value, NULL, 10); 1247 response = strtol(pair->value, NULL, 10);
1408 break; 1248 break;
1409 case 14: 1249 case 14:
1410 msg = pair->value; 1250 msg = pair->value;
1411 break; 1251 break;
1412 case 241:
1413 fed = strtol(pair->value, NULL, 10);
1414 break;
1415 } 1252 }
1416 l = l->next; 1253 l = l->next;
1417 }
1418
1419 switch (fed) {
1420 case YAHOO_FEDERATION_MSN:
1421 who = g_strconcat("msn/", temp, NULL);
1422 break;
1423 case YAHOO_FEDERATION_OCS:
1424 who = g_strconcat("ocs/", temp, NULL);
1425 break;
1426 case YAHOO_FEDERATION_IBM:
1427 who = g_strconcat("ibm/", temp, NULL);
1428 break;
1429 case YAHOO_FEDERATION_NONE:
1430 default:
1431 who = g_strdup(temp);
1432 break;
1433 } 1254 }
1434 1255
1435 if (response == 1) /* Authorized */ 1256 if (response == 1) /* Authorized */
1436 purple_debug_info("yahoo", "Received authorization from buddy '%s'.\n", who ? who : "(Unknown Buddy)"); 1257 purple_debug_info("yahoo", "Received authorization from buddy '%s'.\n", who ? who : "(Unknown Buddy)");
1437 else if (response == 2) { /* Declined */ 1258 else if (response == 2) { /* Declined */
1443 } 1264 }
1444 /* Buddy requested authorization to add us. */ 1265 /* Buddy requested authorization to add us. */
1445 else if (pkt->status == 3) { 1266 else if (pkt->status == 3) {
1446 struct yahoo_add_request *add_req; 1267 struct yahoo_add_request *add_req;
1447 const char *firstname = NULL, *lastname = NULL; 1268 const char *firstname = NULL, *lastname = NULL;
1448 char *temp = NULL;
1449 1269
1450 add_req = g_new0(struct yahoo_add_request, 1); 1270 add_req = g_new0(struct yahoo_add_request, 1);
1451 add_req->gc = gc; 1271 add_req->gc = gc;
1452 add_req->fed = YAHOO_FEDERATION_NONE;
1453 1272
1454 while (l) { 1273 while (l) {
1455 struct yahoo_pair *pair = l->data; 1274 struct yahoo_pair *pair = l->data;
1456 1275
1457 switch (pair->key) { 1276 switch (pair->key) {
1458 case 4: 1277 case 4:
1459 if (g_utf8_validate(pair->value, -1, NULL)) {
1460 temp = pair->value;
1461 } else {
1462 purple_debug_warning("yahoo", "yahoo_buddy_auth_req_15 "
1463 "got non-UTF-8 string for key %d\n", pair->key);
1464 }
1465 break; 1278 break;
1466 case 5: 1279 case 5:
1467 if (g_utf8_validate(pair->value, -1, NULL)) { 1280 if (g_utf8_validate(pair->value, -1, NULL)) {
1468 add_req->id = g_strdup(pair->value); 1281 add_req->id = g_strdup(pair->value);
1469 } else { 1282 } else {
1480 } else { 1293 } else {
1481 purple_debug_warning("yahoo", "yahoo_buddy_auth_req_15 " 1294 purple_debug_warning("yahoo", "yahoo_buddy_auth_req_15 "
1482 "got non-UTF-8 string for key %d\n", pair->key); 1295 "got non-UTF-8 string for key %d\n", pair->key);
1483 } 1296 }
1484 break; 1297 break;
1485 case 241:
1486 add_req->fed = strtol(pair->value, NULL, 10);
1487 break;
1488 case 254: 1298 case 254:
1489 if (g_utf8_validate(pair->value, -1, NULL)) { 1299 if (g_utf8_validate(pair->value, -1, NULL)) {
1490 lastname = pair->value; 1300 lastname = pair->value;
1491 } else { 1301 } else {
1492 purple_debug_warning("yahoo", "yahoo_buddy_auth_req_15 " 1302 purple_debug_warning("yahoo", "yahoo_buddy_auth_req_15 "
1494 } 1304 }
1495 break; 1305 break;
1496 1306
1497 } 1307 }
1498 l = l->next; 1308 l = l->next;
1499 }
1500 switch (add_req->fed) {
1501 case YAHOO_FEDERATION_MSN:
1502 add_req->who = g_strconcat("msn/", temp, NULL);
1503 break;
1504 case YAHOO_FEDERATION_OCS:
1505 add_req->who = g_strconcat("ocs/", temp, NULL);
1506 break;
1507 case YAHOO_FEDERATION_IBM:
1508 add_req->who = g_strconcat("ibm/", temp, NULL);
1509 break;
1510 case YAHOO_FEDERATION_NONE:
1511 default:
1512 add_req->who = g_strdup(temp);
1513 break;
1514 } 1309 }
1515 1310
1516 if (add_req->id && add_req->who) { 1311 if (add_req->id && add_req->who) {
1517 char *alias = NULL, *dec_msg = NULL; 1312 char *alias = NULL, *dec_msg = NULL;
1518 1313
2406 char *decoded_group; 2201 char *decoded_group;
2407 char *buf; 2202 char *buf;
2408 YahooFriend *f; 2203 YahooFriend *f;
2409 GSList *l = pkt->hash; 2204 GSList *l = pkt->hash;
2410 YahooData *yd = purple_connection_get_protocol_data(gc); 2205 YahooData *yd = purple_connection_get_protocol_data(gc);
2411 YahooFederation fed = YAHOO_FEDERATION_NONE;
2412 2206
2413 while (l) { 2207 while (l) {
2414 struct yahoo_pair *pair = l->data; 2208 struct yahoo_pair *pair = l->data;
2415 2209
2416 switch (pair->key) { 2210 switch (pair->key) {
2426 } 2220 }
2427 break; 2221 break;
2428 case 65: 2222 case 65:
2429 group = pair->value; 2223 group = pair->value;
2430 break; 2224 break;
2431 case 241:
2432 fed = strtol(pair->value, NULL, 10);
2433 break;
2434 } 2225 }
2435 2226
2436 l = l->next; 2227 l = l->next;
2437 } 2228 }
2438 2229
2439 if (!temp) 2230 if (!temp)
2440 return; 2231 return;
2441 if (!group) 2232 if (!group)
2442 group = ""; 2233 group = "";
2443 2234
2444 switch (fed) { 2235 who = g_strdup(temp);
2445 case YAHOO_FEDERATION_MSN:
2446 who = g_strconcat("msn/", temp, NULL);
2447 break;
2448 case YAHOO_FEDERATION_OCS:
2449 who = g_strconcat("ocs/", temp, NULL);
2450 break;
2451 case YAHOO_FEDERATION_IBM:
2452 who = g_strconcat("ibm/", temp, NULL);
2453 break;
2454 case YAHOO_FEDERATION_NONE:
2455 default:
2456 who = g_strdup(temp);
2457 break;
2458 }
2459 2236
2460 if (!err || (err == 2)) { /* 0 = ok, 2 = already on serv list */ 2237 if (!err || (err == 2)) { /* 0 = ok, 2 = already on serv list */
2461 f = yahoo_friend_find_or_new(gc, who); 2238 f = yahoo_friend_find_or_new(gc, who);
2462 yahoo_update_status(gc, who, f); 2239 yahoo_update_status(gc, who, f);
2463 f->fed = fed;
2464 2240
2465 if( !g_hash_table_lookup(yd->peers, who) ) { 2241 if( !g_hash_table_lookup(yd->peers, who) ) {
2466 /* we are not connected as client, so set friend to not connected */ 2242 /* we are not connected as client, so set friend to not connected */
2467 if(fed) 2243 yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
2468 yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_DO_NOT_CONNECT); 2244 f->p2p_packet_sent = 0;
2469 else {
2470 yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
2471 f->p2p_packet_sent = 0;
2472 }
2473 } 2245 }
2474 else /* we are already connected. set friend to YAHOO_P2PSTATUS_WE_ARE_CLIENT */ 2246 else /* we are already connected. set friend to YAHOO_P2PSTATUS_WE_ARE_CLIENT */
2475 yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_WE_ARE_CLIENT); 2247 yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_WE_ARE_CLIENT);
2476 g_free(who); 2248 g_free(who);
2477 return; 2249 return;
2861 if( strcmp(purple_normalize(account, purple_account_get_username(account)), who) == 0) 2633 if( strcmp(purple_normalize(account, purple_account_get_username(account)), who) == 0)
2862 return; 2634 return;
2863 2635
2864 /* send packet to only those friends who arent p2p connected and to whom we havent already sent. Do not send if this condition doesn't hold good */ 2636 /* send packet to only those friends who arent p2p connected and to whom we havent already sent. Do not send if this condition doesn't hold good */
2865 if( !( f && (yahoo_friend_get_p2p_status(f) == YAHOO_P2PSTATUS_NOT_CONNECTED) && (f->p2p_packet_sent == 0)) ) 2637 if( !( f && (yahoo_friend_get_p2p_status(f) == YAHOO_P2PSTATUS_NOT_CONNECTED) && (f->p2p_packet_sent == 0)) )
2866 return;
2867
2868 /* Dont send p2p packet to buddies of other protocols */
2869 if(f->fed)
2870 return; 2638 return;
2871 2639
2872 /* Finally, don't try to connect to buddies not online or on sms */ 2640 /* Finally, don't try to connect to buddies not online or on sms */
2873 if( (f->status == YAHOO_STATUS_OFFLINE) || f->sms ) 2641 if( (f->status == YAHOO_STATUS_OFFLINE) || f->sms )
2874 return; 2642 return;
3902 presence = purple_buddy_get_presence(b); 3670 presence = purple_buddy_get_presence(b);
3903 3671
3904 if (purple_presence_is_online(presence)) { 3672 if (purple_presence_is_online(presence)) {
3905 if (yahoo_friend_get_game(f)) 3673 if (yahoo_friend_get_game(f))
3906 return "game"; 3674 return "game";
3907
3908 if (f->fed)
3909 return "external";
3910 } 3675 }
3911 return NULL; 3676 return NULL;
3912 } 3677 }
3913 3678
3914 static const char *yahoo_get_status_string(enum yahoo_status a) 3679 static const char *yahoo_get_status_string(enum yahoo_status a)
4216 3981
4217 return m; 3982 return m;
4218 3983
4219 } 3984 }
4220 3985
4221 if (f && f->status != YAHOO_STATUS_OFFLINE && f->fed == YAHOO_FEDERATION_NONE) { 3986 if (f && f->status != YAHOO_STATUS_OFFLINE) {
4222 if (!yd->wm) { 3987 if (!yd->wm) {
4223 act = purple_menu_action_new(_("Join in Chat"), 3988 act = purple_menu_action_new(_("Join in Chat"),
4224 PURPLE_CALLBACK(yahoo_chat_goto_menu), 3989 PURPLE_CALLBACK(yahoo_chat_goto_menu),
4225 NULL, NULL); 3990 NULL, NULL);
4226 m = g_list_append(m, act); 3991 m = g_list_append(m, act);
4256 if (f) { 4021 if (f) {
4257 act = purple_menu_action_new(_("Presence Settings"), NULL, NULL, 4022 act = purple_menu_action_new(_("Presence Settings"), NULL, NULL,
4258 build_presence_submenu(f, gc)); 4023 build_presence_submenu(f, gc));
4259 m = g_list_append(m, act); 4024 m = g_list_append(m, act);
4260 4025
4261 if (f->fed == YAHOO_FEDERATION_NONE) { 4026 act = purple_menu_action_new(_("Start Doodling"),
4262 act = purple_menu_action_new(_("Start Doodling"), 4027 PURPLE_CALLBACK(yahoo_doodle_blist_node),
4263 PURPLE_CALLBACK(yahoo_doodle_blist_node), 4028 NULL, NULL);
4264 NULL, NULL); 4029 m = g_list_append(m, act);
4265 m = g_list_append(m, act);
4266 }
4267 4030
4268 #if 0 4031 #if 0
4269 /* XXX: it doesn't seems to work */ 4032 /* XXX: it doesn't seems to work */
4270 act = purple_menu_action_new(_("Set User Info..."), 4033 act = purple_menu_action_new(_("Set User Info..."),
4271 PURPLE_CALLBACK(yahoo_userinfo_blist_node), 4034 PURPLE_CALLBACK(yahoo_userinfo_blist_node),
4542 struct yahoo_packet *pkt = NULL; 4305 struct yahoo_packet *pkt = NULL;
4543 char *msg = yahoo_html_to_codes(purple_message_get_contents(pmsg)); 4306 char *msg = yahoo_html_to_codes(purple_message_get_contents(pmsg));
4544 char *msg2; 4307 char *msg2;
4545 PurpleWhiteboard *wb; 4308 PurpleWhiteboard *wb;
4546 int ret = 1; 4309 int ret = 1;
4547 const char *fed_who;
4548 gsize lenb = 0; 4310 gsize lenb = 0;
4549 glong lenc = 0; 4311 glong lenc = 0;
4550 struct yahoo_p2p_data *p2p_data; 4312 struct yahoo_p2p_data *p2p_data;
4551 YahooFederation fed = YAHOO_FEDERATION_NONE;
4552 const gchar *rcpt = purple_message_get_recipient(pmsg); 4313 const gchar *rcpt = purple_message_get_recipient(pmsg);
4553 4314
4554 msg2 = yahoo_string_encode(gc, msg, TRUE); 4315 msg2 = yahoo_string_encode(gc, msg, TRUE);
4555 4316
4556 if(msg2) { 4317 if(msg2) {
4565 g_free(msg); 4326 g_free(msg);
4566 g_free(msg2); 4327 g_free(msg2);
4567 return -E2BIG; 4328 return -E2BIG;
4568 } 4329 }
4569 } 4330 }
4570
4571 fed = yahoo_get_federation_from_name(rcpt);
4572 4331
4573 if (rcpt[0] == '+') { 4332 if (rcpt[0] == '+') {
4574 /* we have an sms to be sent */ 4333 /* we have an sms to be sent */
4575 gchar *carrier = NULL; 4334 gchar *carrier = NULL;
4576 const char *alias = NULL; 4335 const char *alias = NULL;
4618 4377
4619 return ret; 4378 return ret;
4620 } 4379 }
4621 4380
4622 pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, yd->session_id); 4381 pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, yd->session_id);
4623 fed_who = rcpt; 4382 yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5);
4624 switch (fed) {
4625 case YAHOO_FEDERATION_MSN:
4626 case YAHOO_FEDERATION_OCS:
4627 case YAHOO_FEDERATION_IBM:
4628 case YAHOO_FEDERATION_PBX:
4629 fed_who += 4;
4630 break;
4631 case YAHOO_FEDERATION_NONE:
4632 default:
4633 break;
4634 }
4635 yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5, fed_who);
4636 if (fed)
4637 yahoo_packet_hash_int(pkt, 241, fed);
4638 4383
4639 yahoo_packet_hash_str(pkt, 97, "1"); /* UTF-8 */ 4384 yahoo_packet_hash_str(pkt, 97, "1"); /* UTF-8 */
4640 yahoo_packet_hash_str(pkt, 14, msg2); 4385 yahoo_packet_hash_str(pkt, 14, msg2);
4641 4386
4642 /* 4387 /*
4672 yahoo_packet_hash_str(pkt, 206, "2"); 4417 yahoo_packet_hash_str(pkt, 206, "2");
4673 4418
4674 /* We may need to not send any packets over 2000 bytes, but I'm not sure yet. */ 4419 /* We may need to not send any packets over 2000 bytes, but I'm not sure yet. */
4675 if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) { 4420 if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) {
4676 /* if p2p link exists, send through it. To-do: key 15, time value to be sent in case of p2p */ 4421 /* if p2p link exists, send through it. To-do: key 15, time value to be sent in case of p2p */
4677 if( (p2p_data = g_hash_table_lookup(yd->peers, rcpt)) && !fed) { 4422 if( (p2p_data = g_hash_table_lookup(yd->peers, rcpt))) {
4678 yahoo_packet_hash_int(pkt, 11, p2p_data->session_id); 4423 yahoo_packet_hash_int(pkt, 11, p2p_data->session_id);
4679 yahoo_p2p_write_pkt(p2p_data->source, pkt); 4424 yahoo_p2p_write_pkt(p2p_data->source, pkt);
4680 } 4425 }
4681 else { 4426 else {
4682 yahoo_packet_send(pkt, yd); 4427 yahoo_packet_send(pkt, yd);
4683 if(!fed) 4428 yahoo_send_p2p_pkt(gc, rcpt, 0); /* send p2p packet, with val_13=0 */
4684 yahoo_send_p2p_pkt(gc, rcpt, 0); /* send p2p packet, with val_13=0 */
4685 } 4429 }
4686 } 4430 }
4687 else 4431 else
4688 ret = -E2BIG; 4432 ret = -E2BIG;
4689 4433
4697 4441
4698 unsigned int yahoo_send_typing(PurpleConnection *gc, const char *who, PurpleIMTypingState state) 4442 unsigned int yahoo_send_typing(PurpleConnection *gc, const char *who, PurpleIMTypingState state)
4699 { 4443 {
4700 YahooData *yd = purple_connection_get_protocol_data(gc); 4444 YahooData *yd = purple_connection_get_protocol_data(gc);
4701 struct yahoo_p2p_data *p2p_data; 4445 struct yahoo_p2p_data *p2p_data;
4702 YahooFederation fed = YAHOO_FEDERATION_NONE;
4703 struct yahoo_packet *pkt = NULL; 4446 struct yahoo_packet *pkt = NULL;
4704
4705 fed = yahoo_get_federation_from_name(who);
4706 4447
4707 /* Don't do anything if sms is being typed */ 4448 /* Don't do anything if sms is being typed */
4708 if( strncmp(who, "+", 1) == 0 ) 4449 if( strncmp(who, "+", 1) == 0 )
4709 return 0; 4450 return 0;
4710 4451
4711 pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, yd->session_id); 4452 pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, yd->session_id);
4712 4453
4713 /* check to see if p2p link exists, send through it */ 4454 /* check to see if p2p link exists, send through it */
4714 if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !fed) { 4455 if( (p2p_data = g_hash_table_lookup(yd->peers, who))) {
4715 yahoo_packet_hash(pkt, "sssssis", 49, "TYPING", 1, purple_connection_get_display_name(gc), 4456 yahoo_packet_hash(pkt, "sssssis", 49, "TYPING", 1, purple_connection_get_display_name(gc),
4716 14, " ", 13, state == PURPLE_IM_TYPING ? "1" : "0", 4457 14, " ", 13, state == PURPLE_IM_TYPING ? "1" : "0",
4717 5, who, 11, p2p_data->session_id, 1002, "1"); /* To-do: key 15 to be sent in case of p2p */ 4458 5, who, 11, p2p_data->session_id, 1002, "1"); /* To-do: key 15 to be sent in case of p2p */
4718 yahoo_p2p_write_pkt(p2p_data->source, pkt); 4459 yahoo_p2p_write_pkt(p2p_data->source, pkt);
4719 yahoo_packet_free(pkt); 4460 yahoo_packet_free(pkt);
4720 } 4461 }
4721 else { /* send through yahoo server */ 4462 else { /* send through yahoo server */
4722 4463
4723 const char *fed_who = who;
4724 switch (fed) {
4725 case YAHOO_FEDERATION_MSN:
4726 case YAHOO_FEDERATION_OCS:
4727 case YAHOO_FEDERATION_IBM:
4728 case YAHOO_FEDERATION_PBX:
4729 fed_who += 4;
4730 break;
4731 case YAHOO_FEDERATION_NONE:
4732 default:
4733 break;
4734 }
4735
4736 yahoo_packet_hash(pkt, "ssssss", 49, "TYPING", 1, purple_connection_get_display_name(gc), 4464 yahoo_packet_hash(pkt, "ssssss", 49, "TYPING", 1, purple_connection_get_display_name(gc),
4737 14, " ", 13, state == PURPLE_IM_TYPING ? "1" : "0", 4465 14, " ", 13, state == PURPLE_IM_TYPING ? "1" : "0",
4738 5, fed_who, 1002, "1"); 4466 5, 1002, "1");
4739 if (fed)
4740 yahoo_packet_hash_int(pkt, 241, fed);
4741 yahoo_packet_send_and_free(pkt, yd); 4467 yahoo_packet_send_and_free(pkt, yd);
4742 } 4468 }
4743 4469
4744 return 0; 4470 return 0;
4745 } 4471 }
4986 { 4712 {
4987 YahooData *yd = purple_connection_get_protocol_data(gc); 4713 YahooData *yd = purple_connection_get_protocol_data(gc);
4988 struct yahoo_packet *pkt; 4714 struct yahoo_packet *pkt;
4989 const char *group = NULL; 4715 const char *group = NULL;
4990 char *group2; 4716 char *group2;
4991 const char *bname; 4717 const char *bname = purple_buddy_get_name(buddy);
4992 const char *fed_bname;
4993 YahooFederation fed = YAHOO_FEDERATION_NONE;
4994 4718
4995 if (!yd->logged_in) 4719 if (!yd->logged_in)
4996 return; 4720 return;
4997 4721
4998 fed_bname = bname = purple_buddy_get_name(buddy);
4999 if (!purple_account_privacy_check(purple_connection_get_account(gc), bname)) 4722 if (!purple_account_privacy_check(purple_connection_get_account(gc), bname))
5000 return; 4723 return;
5001
5002 fed = yahoo_get_federation_from_name(bname);
5003 if (fed != YAHOO_FEDERATION_NONE)
5004 fed_bname += 4;
5005 4724
5006 group = purple_group_get_name(purple_buddy_get_group(buddy)); 4725 group = purple_group_get_name(purple_buddy_get_group(buddy));
5007 4726
5008 group2 = yahoo_string_encode(gc, group, FALSE); 4727 group2 = yahoo_string_encode(gc, group, FALSE);
5009 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, yd->session_id); 4728 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, yd->session_id);
5010 if (fed) { 4729 yahoo_packet_hash(pkt, "ssssssssss",
5011 yahoo_packet_hash(pkt, "sssssssisss", 4730 14, "",
5012 14, "", 4731 65, group2,
5013 65, group2, 4732 97, "1", /* UTF-8 */
5014 97, "1", /* UTF-8 */ 4733 1, purple_connection_get_display_name(gc),
5015 1, purple_connection_get_display_name(gc), 4734 302, "319",
5016 302, "319", 4735 300, "319",
5017 300, "319", 4736 7,
5018 7, fed_bname, 4737 334, "0",
5019 241, fed, 4738 301, "319",
5020 334, "0", 4739 303, "319");
5021 301, "319",
5022 303, "319"
5023 );
5024 }
5025 else {
5026 yahoo_packet_hash(pkt, "ssssssssss",
5027 14, "",
5028 65, group2,
5029 97, "1", /* UTF-8 */
5030 1, purple_connection_get_display_name(gc),
5031 302, "319",
5032 300, "319",
5033 7, fed_bname,
5034 334, "0",
5035 301, "319",
5036 303, "319"
5037 );
5038 }
5039 4740
5040 yahoo_packet_send_and_free(pkt, yd); 4741 yahoo_packet_send_and_free(pkt, yd);
5041 g_free(group2); 4742 g_free(group2);
5042 } 4743 }
5043 4744
5049 PurpleGroup *g; 4750 PurpleGroup *g;
5050 gboolean remove = TRUE; 4751 gboolean remove = TRUE;
5051 char *cg; 4752 char *cg;
5052 const char *bname, *gname; 4753 const char *bname, *gname;
5053 YahooFriend *f = NULL; 4754 YahooFriend *f = NULL;
5054 YahooFederation fed = YAHOO_FEDERATION_NONE;
5055 4755
5056 bname = purple_buddy_get_name(buddy); 4756 bname = purple_buddy_get_name(buddy);
5057 f = yahoo_friend_find(gc, bname); 4757 f = yahoo_friend_find(gc, bname);
5058 if (!f) 4758 if (!f)
5059 return; 4759 return;
5060 fed = f->fed;
5061 4760
5062 gname = purple_group_get_name(group); 4761 gname = purple_group_get_name(group);
5063 buddies = purple_blist_find_buddies(purple_connection_get_account(gc), bname); 4762 buddies = purple_blist_find_buddies(purple_connection_get_account(gc), bname);
5064 for (l = buddies; l; l = l->next) { 4763 for (l = buddies; l; l = l->next) {
5065 g = purple_buddy_get_group(l->data); 4764 g = purple_buddy_get_group(l->data);
5077 } 4776 }
5078 4777
5079 cg = yahoo_string_encode(gc, gname, FALSE); 4778 cg = yahoo_string_encode(gc, gname, FALSE);
5080 pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, yd->session_id); 4779 pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, yd->session_id);
5081 4780
5082 switch (fed) {
5083 case YAHOO_FEDERATION_MSN:
5084 case YAHOO_FEDERATION_OCS:
5085 case YAHOO_FEDERATION_IBM:
5086 bname += 4;
5087 break;
5088 case YAHOO_FEDERATION_NONE:
5089 default:
5090 break;
5091 }
5092
5093 yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 4781 yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc),
5094 7, bname, 65, cg); 4782 7, bname, 65, cg);
5095 if (fed)
5096 yahoo_packet_hash_int(pkt, 241, fed);
5097 yahoo_packet_send_and_free(pkt, yd); 4783 yahoo_packet_send_and_free(pkt, yd);
5098 g_free(cg); 4784 g_free(cg);
5099 } 4785 }
5100 4786
5101 void yahoo_add_deny(PurpleConnection *gc, const char *who) { 4787 void yahoo_add_deny(PurpleConnection *gc, const char *who) {
5102 YahooData *yd = purple_connection_get_protocol_data(gc); 4788 YahooData *yd = purple_connection_get_protocol_data(gc);
5103 struct yahoo_packet *pkt; 4789 struct yahoo_packet *pkt;
5104 YahooFederation fed = YAHOO_FEDERATION_NONE;
5105 4790
5106 if (!yd->logged_in) 4791 if (!yd->logged_in)
5107 return; 4792 return;
5108 4793
5109 if (!who || who[0] == '\0') 4794 if (!who || who[0] == '\0')
5110 return; 4795 return;
5111 4796
5112 fed = yahoo_get_federation_from_name(who);
5113
5114 pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, yd->session_id); 4797 pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, yd->session_id);
5115 4798
5116 if(fed) 4799 yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "1");
5117 yahoo_packet_hash(pkt, "ssis", 1, purple_connection_get_display_name(gc), 7, who+4, 241, fed, 13, "1");
5118 else
5119 yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "1");
5120 4800
5121 yahoo_packet_send_and_free(pkt, yd); 4801 yahoo_packet_send_and_free(pkt, yd);
5122 } 4802 }
5123 4803
5124 void yahoo_rem_deny(PurpleConnection *gc, const char *who) { 4804 void yahoo_rem_deny(PurpleConnection *gc, const char *who) {
5125 YahooData *yd = purple_connection_get_protocol_data(gc); 4805 YahooData *yd = purple_connection_get_protocol_data(gc);
5126 struct yahoo_packet *pkt; 4806 struct yahoo_packet *pkt;
5127 YahooFederation fed = YAHOO_FEDERATION_NONE;
5128 4807
5129 if (!yd->logged_in) 4808 if (!yd->logged_in)
5130 return; 4809 return;
5131 4810
5132 if (!who || who[0] == '\0') 4811 if (!who || who[0] == '\0')
5133 return; 4812 return;
5134 fed = yahoo_get_federation_from_name(who);
5135 4813
5136 pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, yd->session_id); 4814 pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, yd->session_id);
5137 4815
5138 if(fed) 4816 yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "2");
5139 yahoo_packet_hash(pkt, "ssis", 1, purple_connection_get_display_name(gc), 7, who+4, 241, fed, 13, "2");
5140 else
5141 yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "2");
5142 4817
5143 yahoo_packet_send_and_free(pkt, yd); 4818 yahoo_packet_send_and_free(pkt, yd);
5144 } 4819 }
5145 4820
5146 void yahoo_set_permit_deny(PurpleConnection *gc) 4821 void yahoo_set_permit_deny(PurpleConnection *gc)
5180 * don't bother letting the server know. 4855 * don't bother letting the server know.
5181 */ 4856 */
5182 if (!f) 4857 if (!f)
5183 return; 4858 return;
5184 4859
5185 if(f->fed) { 4860 temp = who;
5186 temp = who+4;
5187 } else
5188 temp = who;
5189 4861
5190 /* If old and new are the same, we would probably 4862 /* If old and new are the same, we would probably
5191 * end up deleting the buddy, which would be bad. 4863 * end up deleting the buddy, which would be bad.
5192 * This might happen because of the charset conversation. 4864 * This might happen because of the charset conversation.
5193 */ 4865 */
5198 g_free(gpo); 4870 g_free(gpo);
5199 return; 4871 return;
5200 } 4872 }
5201 4873
5202 pkt = yahoo_packet_new(YAHOO_SERVICE_CHGRP_15, YAHOO_STATUS_AVAILABLE, yd->session_id); 4874 pkt = yahoo_packet_new(YAHOO_SERVICE_CHGRP_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
5203 if(f->fed) 4875 yahoo_packet_hash(pkt, "ssssssss", 1, purple_connection_get_display_name(gc),
5204 yahoo_packet_hash(pkt, "ssssissss", 1, purple_connection_get_display_name(gc), 4876 302, "240", 300, "240", 7, temp, 224, gpo, 264, gpn, 301,
5205 302, "240", 300, "240", 7, temp, 241, f->fed, 224, gpo, 264, gpn, 301, 4877 "240", 303, "240");
5206 "240", 303, "240");
5207 else
5208 yahoo_packet_hash(pkt, "ssssssss", 1, purple_connection_get_display_name(gc),
5209 302, "240", 300, "240", 7, temp, 224, gpo, 264, gpn, 301,
5210 "240", 303, "240");
5211 yahoo_packet_send_and_free(pkt, yd); 4878 yahoo_packet_send_and_free(pkt, yd);
5212 4879
5213 g_free(gpn); 4880 g_free(gpn);
5214 g_free(gpo); 4881 g_free(gpo);
5215 } 4882 }

mercurial