| 683 } |
684 } |
| 684 |
685 |
| 685 if (who && subj && email && *email) { |
686 if (who && subj && email && *email) { |
| 686 char *from = g_strdup_printf("%s (%s)", who, email); |
687 char *from = g_strdup_printf("%s (%s)", who, email); |
| 687 |
688 |
| 688 gaim_notify_email(gc, subj, from, gc->username, |
689 gaim_notify_email(gc, subj, from, gaim_account_get_username(account), |
| 689 "http://mail.yahoo.com/", NULL, NULL); |
690 "http://mail.yahoo.com/", NULL, NULL); |
| 690 |
691 |
| 691 g_free(from); |
692 g_free(from); |
| 692 } else if (count > 0) { |
693 } else if (count > 0) { |
| 693 const char *to = gc->username; |
694 const char *to = gaim_account_get_username(account); |
| 694 const char *url = "http://mail.yahoo.com/"; |
695 const char *url = "http://mail.yahoo.com/"; |
| 695 |
696 |
| 696 gaim_notify_emails(gc, count, FALSE, NULL, NULL, &to, &url, |
697 gaim_notify_emails(gc, count, FALSE, NULL, NULL, &to, &url, |
| 697 NULL, NULL); |
698 NULL, NULL); |
| 698 } |
699 } |
| 758 * Sorry, Yahoo. |
762 * Sorry, Yahoo. |
| 759 */ |
763 */ |
| 760 |
764 |
| 761 md5_byte_t result[16]; |
765 md5_byte_t result[16]; |
| 762 md5_state_t ctx; |
766 md5_state_t ctx; |
| |
767 |
| 763 char *crypt_result; |
768 char *crypt_result; |
| 764 char *password_hash = g_malloc(25); |
769 char password_hash[25]; |
| 765 char *crypt_hash = g_malloc(25); |
770 char crypt_hash[25]; |
| 766 char *hash_string_p = g_malloc(50 + strlen(sn)); |
771 char *hash_string_p = g_malloc(50 + strlen(sn)); |
| 767 char *hash_string_c = g_malloc(50 + strlen(sn)); |
772 char *hash_string_c = g_malloc(50 + strlen(sn)); |
| 768 |
773 |
| 769 char checksum; |
774 char checksum; |
| 770 |
775 |
| 771 int sv; |
776 int sv; |
| 772 |
777 |
| 773 char *result6 = g_malloc(25); |
778 char result6[25]; |
| 774 char *result96 = g_malloc(25); |
779 char result96[25]; |
| 775 |
780 |
| 776 sv = seed[15]; |
781 sv = seed[15]; |
| 777 sv = sv % 8; |
782 sv = sv % 8; |
| 778 |
783 |
| 779 md5_init(&ctx); |
784 md5_init(&ctx); |
| 780 md5_append(&ctx, gc->password, strlen(gc->password)); |
785 md5_append(&ctx, pass, strlen(pass)); |
| 781 md5_finish(&ctx, result); |
786 md5_finish(&ctx, result); |
| 782 to_y64(password_hash, result, 16); |
787 to_y64(password_hash, result, 16); |
| 783 |
788 |
| 784 md5_init(&ctx); |
789 md5_init(&ctx); |
| 785 crypt_result = yahoo_crypt(gc->password, "$1$_2S43d5f$"); |
790 crypt_result = yahoo_crypt(pass, "$1$_2S43d5f$"); |
| 786 md5_append(&ctx, crypt_result, strlen(crypt_result)); |
791 md5_append(&ctx, crypt_result, strlen(crypt_result)); |
| 787 md5_finish(&ctx, result); |
792 md5_finish(&ctx, result); |
| 788 to_y64(crypt_hash, result, 16); |
793 to_y64(crypt_hash, result, 16); |
| 789 |
794 |
| 790 switch (sv) { |
795 switch (sv) { |
| 791 case 1: |
796 case 1: |
| 792 case 6: |
797 case 6: |
| 793 checksum = seed[seed[9] % 16]; |
798 checksum = seed[seed[9] % 16]; |
| 794 g_snprintf(hash_string_p, strlen(sn) + 50, |
799 g_snprintf(hash_string_p, strlen(sn) + 50, |
| 795 "%c%s%s%s", checksum, gc->username, seed, password_hash); |
800 "%c%s%s%s", checksum, name, seed, password_hash); |
| 796 g_snprintf(hash_string_c, strlen(sn) + 50, |
801 g_snprintf(hash_string_c, strlen(sn) + 50, |
| 797 "%c%s%s%s", checksum, gc->username, seed, crypt_hash); |
802 "%c%s%s%s", checksum, name, seed, crypt_hash); |
| 798 break; |
803 break; |
| 799 case 2: |
804 case 2: |
| 800 case 7: |
805 case 7: |
| 801 checksum = seed[seed[15] % 16]; |
806 checksum = seed[seed[15] % 16]; |
| 802 g_snprintf(hash_string_p, strlen(sn) + 50, |
807 g_snprintf(hash_string_p, strlen(sn) + 50, |
| 803 "%c%s%s%s", checksum, seed, password_hash, gc->username); |
808 "%c%s%s%s", checksum, seed, password_hash, name); |
| 804 g_snprintf(hash_string_c, strlen(sn) + 50, |
809 g_snprintf(hash_string_c, strlen(sn) + 50, |
| 805 "%c%s%s%s", checksum, seed, crypt_hash, gc->username); |
810 "%c%s%s%s", checksum, seed, crypt_hash, name); |
| 806 break; |
811 break; |
| 807 case 3: |
812 case 3: |
| 808 checksum = seed[seed[1] % 16]; |
813 checksum = seed[seed[1] % 16]; |
| 809 g_snprintf(hash_string_p, strlen(sn) + 50, |
814 g_snprintf(hash_string_p, strlen(sn) + 50, |
| 810 "%c%s%s%s", checksum, gc->username, password_hash, seed); |
815 "%c%s%s%s", checksum, name, password_hash, seed); |
| 811 g_snprintf(hash_string_c, strlen(sn) + 50, |
816 g_snprintf(hash_string_c, strlen(sn) + 50, |
| 812 "%c%s%s%s", checksum, gc->username, crypt_hash, seed); |
817 "%c%s%s%s", checksum, name, crypt_hash, seed); |
| 813 break; |
818 break; |
| 814 case 4: |
819 case 4: |
| 815 checksum = seed[seed[3] % 16]; |
820 checksum = seed[seed[3] % 16]; |
| 816 g_snprintf(hash_string_p, strlen(sn) + 50, |
821 g_snprintf(hash_string_p, strlen(sn) + 50, |
| 817 "%c%s%s%s", checksum, password_hash, seed, gc->username); |
822 "%c%s%s%s", checksum, password_hash, seed, name); |
| 818 g_snprintf(hash_string_c, strlen(sn) + 50, |
823 g_snprintf(hash_string_c, strlen(sn) + 50, |
| 819 "%c%s%s%s", checksum, crypt_hash, seed, gc->username); |
824 "%c%s%s%s", checksum, crypt_hash, seed, name); |
| 820 break; |
825 break; |
| 821 case 0: |
826 case 0: |
| 822 case 5: |
827 case 5: |
| 823 checksum = seed[seed[7] % 16]; |
828 checksum = seed[seed[7] % 16]; |
| 824 g_snprintf(hash_string_p, strlen(sn) + 50, |
829 g_snprintf(hash_string_p, strlen(sn) + 50, |
| 825 "%c%s%s%s", checksum, password_hash, gc->username, seed); |
830 "%c%s%s%s", checksum, password_hash, name, seed); |
| 826 g_snprintf(hash_string_c, strlen(sn) + 50, |
831 g_snprintf(hash_string_c, strlen(sn) + 50, |
| 827 "%c%s%s%s", checksum, crypt_hash, gc->username, seed); |
832 "%c%s%s%s", checksum, crypt_hash, name, seed); |
| 828 break; |
833 break; |
| 829 } |
834 } |
| 830 |
835 |
| 831 md5_init(&ctx); |
836 md5_init(&ctx); |
| 832 md5_append(&ctx, hash_string_p, strlen(hash_string_p)); |
837 md5_append(&ctx, hash_string_p, strlen(hash_string_p)); |
| 837 md5_append(&ctx, hash_string_c, strlen(hash_string_c)); |
842 md5_append(&ctx, hash_string_c, strlen(hash_string_c)); |
| 838 md5_finish(&ctx, result); |
843 md5_finish(&ctx, result); |
| 839 to_y64(result96, result, 16); |
844 to_y64(result96, result, 16); |
| 840 |
845 |
| 841 pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0); |
846 pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0); |
| 842 yahoo_packet_hash(pack, 0, gc->username); |
847 yahoo_packet_hash(pack, 0, name); |
| 843 yahoo_packet_hash(pack, 6, result6); |
848 yahoo_packet_hash(pack, 6, result6); |
| 844 yahoo_packet_hash(pack, 96, result96); |
849 yahoo_packet_hash(pack, 96, result96); |
| 845 yahoo_packet_hash(pack, 1, gc->username); |
850 yahoo_packet_hash(pack, 1, name); |
| 846 |
851 |
| 847 yahoo_send_packet(yd, pack); |
852 yahoo_send_packet(yd, pack); |
| 848 |
853 |
| 849 g_free(result6); |
|
| 850 g_free(result96); |
|
| 851 g_free(password_hash); |
|
| 852 g_free(crypt_hash); |
|
| 853 g_free(hash_string_p); |
854 g_free(hash_string_p); |
| 854 g_free(hash_string_c); |
855 g_free(hash_string_c); |
| 855 |
856 |
| 856 yahoo_packet_free(pack); |
857 yahoo_packet_free(pack); |
| 857 } |
858 } |
| 858 } |
859 } |
| 859 |
860 |
| 860 static void yahoo_packet_process(struct gaim_connection *gc, struct yahoo_packet *pkt) |
861 static void yahoo_packet_process(GaimConnection *gc, struct yahoo_packet *pkt) |
| 861 { |
862 { |
| 862 switch (pkt->service) |
863 switch (pkt->service) |
| 863 { |
864 { |
| 864 case YAHOO_SERVICE_LOGON: |
865 case YAHOO_SERVICE_LOGON: |
| 865 case YAHOO_SERVICE_LOGOFF: |
866 case YAHOO_SERVICE_LOGOFF: |
| 962 } |
962 } |
| 963 } |
963 } |
| 964 |
964 |
| 965 static void yahoo_got_connected(gpointer data, gint source, GaimInputCondition cond) |
965 static void yahoo_got_connected(gpointer data, gint source, GaimInputCondition cond) |
| 966 { |
966 { |
| 967 struct gaim_connection *gc = data; |
967 GaimConnection *gc = data; |
| 968 struct yahoo_data *yd; |
968 struct yahoo_data *yd; |
| 969 struct yahoo_packet *pkt; |
969 struct yahoo_packet *pkt; |
| 970 |
970 |
| 971 if (!g_slist_find(connections, gc)) { |
971 if (!g_slist_find(connections, gc)) { |
| 972 close(source); |
972 close(source); |
| 973 return; |
973 return; |
| 974 } |
974 } |
| 975 |
975 |
| 976 if (source < 0) { |
976 if (source < 0) { |
| 977 hide_login_progress(gc, "Unable to connect"); |
977 gaim_connection_error(gc, "Unable to connect"); |
| 978 signoff(gc); |
|
| 979 return; |
978 return; |
| 980 } |
979 } |
| 981 |
980 |
| 982 yd = gc->proto_data; |
981 yd = gc->proto_data; |
| 983 yd->fd = source; |
982 yd->fd = source; |
| 984 |
983 |
| 985 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YAHOO_STATUS_AVAILABLE, 0); |
984 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YAHOO_STATUS_AVAILABLE, 0); |
| 986 |
985 |
| 987 yahoo_packet_hash(pkt, 1, gc->username); |
986 yahoo_packet_hash(pkt, 1, gaim_account_get_username(gaim_connection_get_account(gc))); |
| 988 yahoo_send_packet(yd, pkt); |
987 yahoo_send_packet(yd, pkt); |
| 989 |
988 |
| 990 yahoo_packet_free(pkt); |
989 yahoo_packet_free(pkt); |
| 991 |
990 |
| 992 gc->inpa = gaim_input_add(yd->fd, GAIM_INPUT_READ, yahoo_pending, gc); |
991 gc->inpa = gaim_input_add(yd->fd, GAIM_INPUT_READ, yahoo_pending, gc); |
| 993 } |
992 } |
| 994 |
993 |
| 995 static void yahoo_login(struct gaim_account *account) { |
994 static void yahoo_login(GaimAccount *account) { |
| 996 struct gaim_connection *gc = new_gaim_conn(account); |
995 GaimConnection *gc = gaim_account_get_connection(account); |
| 997 struct yahoo_data *yd = gc->proto_data = g_new0(struct yahoo_data, 1); |
996 struct yahoo_data *yd = gc->proto_data = g_new0(struct yahoo_data, 1); |
| 998 |
997 |
| 999 set_login_progress(gc, 1, _("Connecting")); |
998 gaim_connection_update_progress(gc, _("Connecting"), 1, 2); |
| 1000 |
999 |
| 1001 yd->fd = -1; |
1000 yd->fd = -1; |
| 1002 yd->hash = g_hash_table_new(g_str_hash, g_str_equal); |
1001 yd->hash = g_hash_table_new(g_str_hash, g_str_equal); |
| 1003 yd->games = g_hash_table_new(g_str_hash, g_str_equal); |
1002 yd->games = g_hash_table_new(g_str_hash, g_str_equal); |
| 1004 |
1003 |
| 1005 |
1004 if (proxy_connect(account, gaim_account_get_string(account, "server", YAHOO_PAGER_HOST), |
| 1006 if (!g_ascii_strncasecmp(account->proto_opt[USEROPT_PAGERHOST], "cs.yahoo.com", strlen("cs.yahoo.com"))) { |
1005 gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), |
| 1007 /* Figured out the new auth method -- cs.yahoo.com likes to disconnect on buddy remove and add now */ |
1006 yahoo_got_connected, gc) != 0) { |
| 1008 gaim_debug(GAIM_DEBUG_INFO, "yahoo", |
1007 gaim_connection_error(gc, "Connection problem"); |
| 1009 "Setting new Yahoo! server.\n"); |
|
| 1010 g_snprintf(account->proto_opt[USEROPT_PAGERHOST], |
|
| 1011 strlen("scs.yahoo.com") + 1, "scs.yahoo.com"); |
|
| 1012 save_prefs(); |
|
| 1013 } |
|
| 1014 |
|
| 1015 |
|
| 1016 if (proxy_connect(account, account->proto_opt[USEROPT_PAGERHOST][0] ? |
|
| 1017 account->proto_opt[USEROPT_PAGERHOST] : YAHOO_PAGER_HOST, |
|
| 1018 account->proto_opt[USEROPT_PAGERPORT][0] ? |
|
| 1019 atoi(account->proto_opt[USEROPT_PAGERPORT]) : YAHOO_PAGER_PORT, |
|
| 1020 yahoo_got_connected, gc) != 0) { |
|
| 1021 hide_login_progress(gc, "Connection problem"); |
|
| 1022 signoff(gc); |
|
| 1023 return; |
1008 return; |
| 1024 } |
1009 } |
| 1025 |
1010 |
| 1026 } |
1011 } |
| 1027 |
1012 |
| 1193 } |
1178 } |
| 1194 |
1179 |
| 1195 return m; |
1180 return m; |
| 1196 } |
1181 } |
| 1197 |
1182 |
| 1198 static void yahoo_act_id(struct gaim_connection *gc, const char *entry) |
1183 static void yahoo_act_id(GaimConnection *gc, const char *entry) |
| 1199 { |
1184 { |
| 1200 struct yahoo_data *yd = gc->proto_data; |
1185 struct yahoo_data *yd = gc->proto_data; |
| 1201 |
1186 |
| 1202 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_IDACT, YAHOO_STATUS_AVAILABLE, 0); |
1187 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_IDACT, YAHOO_STATUS_AVAILABLE, 0); |
| 1203 yahoo_packet_hash(pkt, 3, entry); |
1188 yahoo_packet_hash(pkt, 3, entry); |
| 1204 yahoo_send_packet(yd, pkt); |
1189 yahoo_send_packet(yd, pkt); |
| 1205 yahoo_packet_free(pkt); |
1190 yahoo_packet_free(pkt); |
| 1206 |
1191 |
| 1207 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", entry); |
1192 gaim_connection_set_display_name(gc, entry); |
| 1208 } |
1193 } |
| 1209 |
1194 |
| 1210 static void yahoo_show_act_id(struct gaim_connection *gc) |
1195 static void yahoo_show_act_id(GaimConnection *gc) |
| 1211 { |
1196 { |
| 1212 gaim_request_input(gc, NULL, _("Active which ID?"), NULL, |
1197 gaim_request_input(gc, NULL, _("Active which ID?"), NULL, |
| 1213 gc->displayname, FALSE, |
1198 gaim_connection_get_display_name(gc), FALSE, |
| 1214 _("OK"), G_CALLBACK(yahoo_act_id), |
1199 _("OK"), G_CALLBACK(yahoo_act_id), |
| 1215 _("Cancel"), NULL, gc); |
1200 _("Cancel"), NULL, gc); |
| 1216 } |
1201 } |
| 1217 |
1202 |
| 1218 static GList *yahoo_actions(struct gaim_connection *gc) { |
1203 static GList *yahoo_actions(GaimConnection *gc) { |
| 1219 GList *m = NULL; |
1204 GList *m = NULL; |
| 1220 struct proto_actions_menu *pam; |
1205 struct proto_actions_menu *pam; |
| 1221 |
1206 |
| 1222 pam = g_new0(struct proto_actions_menu, 1); |
1207 pam = g_new0(struct proto_actions_menu, 1); |
| 1223 pam->label = _("Activate ID"); |
1208 pam->label = _("Activate ID"); |
| 1226 m = g_list_append(m, pam); |
1211 m = g_list_append(m, pam); |
| 1227 |
1212 |
| 1228 return m; |
1213 return m; |
| 1229 } |
1214 } |
| 1230 |
1215 |
| 1231 static int yahoo_send_im(struct gaim_connection *gc, const char *who, const char *what, int len, int flags) |
1216 static int yahoo_send_im(GaimConnection *gc, const char *who, const char *what, int len, int flags) |
| 1232 { |
1217 { |
| 1233 struct yahoo_data *yd = gc->proto_data; |
1218 struct yahoo_data *yd = gc->proto_data; |
| 1234 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, 0); |
1219 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, 0); |
| 1235 char *msg = g_strdup(what); |
1220 char *msg = g_strdup(what); |
| 1236 |
1221 |
| 1237 yahoo_packet_hash(pkt, 1, gc->displayname); |
1222 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
| 1238 yahoo_packet_hash(pkt, 5, who); |
1223 yahoo_packet_hash(pkt, 5, who); |
| 1239 yahoo_packet_hash(pkt, 14, msg); |
1224 yahoo_packet_hash(pkt, 14, msg); |
| 1240 |
1225 |
| 1241 yahoo_send_packet(yd, pkt); |
1226 yahoo_send_packet(yd, pkt); |
| 1242 |
1227 |
| 1243 yahoo_packet_free(pkt); |
1228 yahoo_packet_free(pkt); |
| 1244 |
1229 |
| 1245 return 1; |
1230 return 1; |
| 1246 } |
1231 } |
| 1247 |
1232 |
| 1248 int yahoo_send_typing(struct gaim_connection *gc, char *who, int typ) |
1233 int yahoo_send_typing(GaimConnection *gc, char *who, int typ) |
| 1249 { |
1234 { |
| 1250 struct yahoo_data *yd = gc->proto_data; |
1235 struct yahoo_data *yd = gc->proto_data; |
| 1251 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0); |
1236 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0); |
| 1252 yahoo_packet_hash(pkt, 49, "TYPING"); |
1237 yahoo_packet_hash(pkt, 49, "TYPING"); |
| 1253 yahoo_packet_hash(pkt, 1, gc->displayname); |
1238 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
| 1254 yahoo_packet_hash(pkt, 14, " "); |
1239 yahoo_packet_hash(pkt, 14, " "); |
| 1255 yahoo_packet_hash(pkt, 13, typ == TYPING ? "1" : "0"); |
1240 yahoo_packet_hash(pkt, 13, typ == TYPING ? "1" : "0"); |
| 1256 yahoo_packet_hash(pkt, 5, who); |
1241 yahoo_packet_hash(pkt, 5, who); |
| 1257 yahoo_packet_hash(pkt, 1002, "1"); |
1242 yahoo_packet_hash(pkt, 1002, "1"); |
| 1258 |
1243 |
| 1398 group = g->name; |
1383 group = g->name; |
| 1399 else |
1384 else |
| 1400 group = "Buddies"; |
1385 group = "Buddies"; |
| 1401 |
1386 |
| 1402 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); |
1387 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); |
| 1403 yahoo_packet_hash(pkt, 1, gc->displayname); |
1388 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
| 1404 yahoo_packet_hash(pkt, 7, who); |
1389 yahoo_packet_hash(pkt, 7, who); |
| 1405 yahoo_packet_hash(pkt, 65, group); |
1390 yahoo_packet_hash(pkt, 65, group); |
| 1406 yahoo_send_packet(yd, pkt); |
1391 yahoo_send_packet(yd, pkt); |
| 1407 yahoo_packet_free(pkt); |
1392 yahoo_packet_free(pkt); |
| 1408 } |
1393 } |
| 1409 |
1394 |
| 1410 static void yahoo_remove_buddy(struct gaim_connection *gc, char *who, char *group) |
1395 static void yahoo_remove_buddy(GaimConnection *gc, char *who, char *group) |
| 1411 { |
1396 { |
| 1412 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
1397 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
| 1413 |
1398 |
| 1414 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); |
1399 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); |
| 1415 yahoo_packet_hash(pkt, 1, gc->displayname); |
1400 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
| 1416 yahoo_packet_hash(pkt, 7, who); |
1401 yahoo_packet_hash(pkt, 7, who); |
| 1417 yahoo_packet_hash(pkt, 65, group); |
1402 yahoo_packet_hash(pkt, 65, group); |
| 1418 yahoo_send_packet(yd, pkt); |
1403 yahoo_send_packet(yd, pkt); |
| 1419 yahoo_packet_free(pkt); |
1404 yahoo_packet_free(pkt); |
| 1420 } |
1405 } |