comparison src/protocols/yahoo/yahoo.c @ 3157:2bb8b7380814

[gaim-migrate @ 3173] This should fix Yahoo so it works 100% Many thanks to Toby Gray for the patch. We went to the zoo together; it was fun. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Thu, 18 Apr 2002 23:49:42 +0000
parents 3805d9d344f2
children df6981a51853
comparison
equal deleted inserted replaced
3156:3fd77e1a6fa1 3157:2bb8b7380814
376 376
377 static void yahoo_process_status(struct gaim_connection *gc, struct yahoo_packet *pkt) 377 static void yahoo_process_status(struct gaim_connection *gc, struct yahoo_packet *pkt)
378 { 378 {
379 struct yahoo_data *yd = gc->proto_data; 379 struct yahoo_data *yd = gc->proto_data;
380 GSList *l = pkt->hash; 380 GSList *l = pkt->hash;
381 struct yahoo_packet *newpkt;
382 char *name = NULL; 381 char *name = NULL;
383 int state = 0; 382 int state = 0;
384 int gamestate = 0; 383 int gamestate = 0;
385 char *msg = NULL; 384 char *msg = NULL;
386 385
743 char *password_hash = g_malloc(25); 742 char *password_hash = g_malloc(25);
744 char *crypt_hash = g_malloc(25); 743 char *crypt_hash = g_malloc(25);
745 char *hash_string_p = g_malloc(50 + strlen(sn)); 744 char *hash_string_p = g_malloc(50 + strlen(sn));
746 char *hash_string_c = g_malloc(50 + strlen(sn)); 745 char *hash_string_c = g_malloc(50 + strlen(sn));
747 746
748 int ordering;
749 char checksum; 747 char checksum;
750 748
751 char sv; 749 int sv;
752 750
753 char *result6 = g_malloc(25); 751 char *result6 = g_malloc(25);
754 char *result96 = g_malloc(25); 752 char *result96 = g_malloc(25);
755 753
756 sv = seed[15]; 754 sv = seed[15];
757 checksum = sv % 16; 755 sv = sv % 8;
758
759 /* I bet there's some really cool mathematical pattern here if I looked hard enough.
760 * But, this works. */
761 switch (checksum) {
762 case 1:
763 case 6:
764 case 9:
765 case 14:
766
767 checksum = seed[9];
768 break;
769 case 3:
770 case 11:
771 checksum = seed[1];
772 break;
773 case 4:
774 case 12:
775 checksum = seed[3];
776 break;
777 case 5:
778 case 8:
779 case 13:
780 case 0:
781 checksum = seed[7];
782 break;
783 }
784 checksum = seed[checksum % 16];
785
786 ordering = sv % 8;
787 756
788 md5_init(&ctx); 757 md5_init(&ctx);
789 md5_append(&ctx, gc->password, strlen(gc->password)); 758 md5_append(&ctx, gc->password, strlen(gc->password));
790 md5_finish(&ctx, result); 759 md5_finish(&ctx, result);
791 to_y64(password_hash, result, 16); 760 to_y64(password_hash, result, 16);
793 md5_init(&ctx); 762 md5_init(&ctx);
794 crypt_result = yahoo_crypt(gc->password, "$1$_2S43d5f$"); 763 crypt_result = yahoo_crypt(gc->password, "$1$_2S43d5f$");
795 md5_append(&ctx, crypt_result, strlen(crypt_result)); 764 md5_append(&ctx, crypt_result, strlen(crypt_result));
796 md5_finish(&ctx, result); 765 md5_finish(&ctx, result);
797 to_y64(crypt_hash, result, 16); 766 to_y64(crypt_hash, result, 16);
798 767
799 /* I bet there's a nice pattern here, too. */ 768 switch (sv) {
800 switch (ordering) {
801 case 1: 769 case 1:
802 case 6: 770 case 6:
771 checksum = seed[seed[9] % 16];
803 g_snprintf(hash_string_p, strlen(sn) + 50, 772 g_snprintf(hash_string_p, strlen(sn) + 50,
804 "%c%s%s%s", checksum, gc->username, seed, password_hash); 773 "%c%s%s%s", checksum, gc->username, seed, password_hash);
805 g_snprintf(hash_string_c, strlen(sn) + 50, 774 g_snprintf(hash_string_c, strlen(sn) + 50,
806 "%c%s%s%s", checksum, gc->username, seed, crypt_hash); 775 "%c%s%s%s", checksum, gc->username, seed, crypt_hash);
807 break; 776 break;
808 case 2: 777 case 2:
809 case 7: 778 case 7:
779 checksum = seed[seed[15] % 16];
810 g_snprintf(hash_string_p, strlen(sn) + 50, 780 g_snprintf(hash_string_p, strlen(sn) + 50,
811 "%c%s%s%s", checksum, seed, password_hash, gc->username); 781 "%c%s%s%s", checksum, seed, password_hash, gc->username);
782 g_snprintf(hash_string_c, strlen(sn) + 50,
783 "%c%s%s%s", checksum, seed, crypt_hash, gc->username);
784 break;
785 case 3:
786 checksum = seed[seed[1] % 16];
787 g_snprintf(hash_string_p, strlen(sn) + 50,
788 "%c%s%s%s", checksum, gc->username, password_hash, seed);
789 g_snprintf(hash_string_c, strlen(sn) + 50,
790 "%c%s%s%s", checksum, gc->username, crypt_hash, seed);
791 break;
792 case 4:
793 checksum = seed[seed[3] % 16];
794 g_snprintf(hash_string_p, strlen(sn) + 50,
795 "%c%s%s%s", checksum, password_hash, seed, gc->username);
812 g_snprintf(hash_string_c, strlen(sn) + 50, 796 g_snprintf(hash_string_c, strlen(sn) + 50,
813 "%c%s%s%s", checksum, seed, crypt_hash, gc->username); 797 "%c%s%s%s", checksum, crypt_hash, seed, gc->username);
814 break; 798 break;
815 case 3:
816 g_snprintf(hash_string_p, strlen(sn) + 50,
817 "%c%s%s%s", checksum, gc->username, password_hash, seed);
818 g_snprintf(hash_string_c, strlen(sn) + 50,
819 "%c%s%s%s", checksum, gc->username, crypt_hash, seed);
820 break;
821 case 4:
822 g_snprintf(hash_string_p, strlen(sn) + 50,
823 "%c%s%s%s", checksum, gc->username, password_hash, seed);
824 g_snprintf(hash_string_c, strlen(sn) + 50,
825 "%c%s%s%s", checksum, gc->username, crypt_hash, seed);
826 break;
827 case 0: 799 case 0:
828 case 5: 800 case 5:
801 checksum = seed[seed[7] % 16];
829 g_snprintf(hash_string_p, strlen(sn) + 50, 802 g_snprintf(hash_string_p, strlen(sn) + 50,
830 "%c%s%s%s", checksum, password_hash, gc->username, seed); 803 "%c%s%s%s", checksum, password_hash, gc->username, seed);
831 g_snprintf(hash_string_c, strlen(sn) + 50, 804 g_snprintf(hash_string_c, strlen(sn) + 50,
832 "%c%s%s%s", checksum, crypt_hash, gc->username, seed); 805 "%c%s%s%s", checksum, crypt_hash, gc->username, seed);
833 break; 806 break;
834 } 807 }
835 808
836 debug_printf("\nPassword: %s\n", hash_string_p);
837 debug_printf("Crypt: %s\n\n", hash_string_c);
838
839 md5_init(&ctx); 809 md5_init(&ctx);
840 md5_append(&ctx, hash_string_p, strlen(hash_string_c)); 810 md5_append(&ctx, hash_string_p, strlen(hash_string_p));
841 md5_finish(&ctx, result); 811 md5_finish(&ctx, result);
842 to_y64(result6, result, 16); 812 to_y64(result6, result, 16);
843 813
844 md5_init(&ctx); 814 md5_init(&ctx);
845 md5_append(&ctx, hash_string_c, strlen(hash_string_c)); 815 md5_append(&ctx, hash_string_c, strlen(hash_string_c));
846 md5_finish(&ctx, result); 816 md5_finish(&ctx, result);
847 to_y64(result96, result, 16); 817 to_y64(result96, result, 16);
848
849 md5_init(&ctx);
850 md5_append(&ctx, gc->password, strlen(gc->password));
851 md5_finish(&ctx, result);
852 to_y64(password_hash, result, 16);
853 818
854 pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0); 819 pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0);
855 yahoo_packet_hash(pack, 0, gc->username); 820 yahoo_packet_hash(pack, 0, gc->username);
856 yahoo_packet_hash(pack, 6, result6); 821 yahoo_packet_hash(pack, 6, result6);
857 yahoo_packet_hash(pack, 96, result96); 822 yahoo_packet_hash(pack, 96, result96);