Mercurial > pidgin
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); |