| 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 } |
| 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 " |
| 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) { |
| 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 } |
| 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 { |
| 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; |
| 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), |
| 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) |
| 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 } |