| | 790 | CPU_ConnectStart::CPU_ConnectStart() |
| | 791 | : CSrvPacketTcp(ICQ_CHNxNEW) |
| | 792 | { |
| | 793 | pthread_mutex_lock(&s_xMutex); |
| | 794 | if (!s_bRegistered) { |
| | 795 | s_nSequence[m_nService] = 0xffff; |
| | 796 | s_bRegistered = true; |
| | 797 | } |
| | 798 | pthread_mutex_unlock(&s_xMutex); |
| | 799 | |
| | 800 | m_nSize = 12; |
| | 801 | InitBuffer(); |
| | 802 | |
| | 803 | buffer->PackUnsignedLongBE(0x00000001); |
| | 804 | buffer->PackUnsignedLongBE(0x80030004); |
| | 805 | buffer->PackUnsignedLongBE(0x00100000); |
| | 806 | } |
| | 807 | |
| | 808 | CPU_RequestLogonSalt::CPU_RequestLogonSalt(const std::string &id) |
| | 809 | : CPU_CommonFamily(ICQ_SNACxFAM_AUTH, ICQ_SNACxAUTHxREQUEST_SALT) |
| | 810 | { |
| | 811 | m_nSize += id.size() + 4; |
| | 812 | InitBuffer(); |
| | 813 | |
| | 814 | buffer->PackTLV(0x0001, id.size(), id.c_str()); |
| | 815 | } |
| | 816 | |
| | 817 | //-----NewLogon----------------------------------------------------------------- |
| | 818 | CPU_NewLogon::CPU_NewLogon(const char *szPassword, const char *szUin, const char *szMD5Salt) |
| | 819 | : CPU_CommonFamily(ICQ_SNACxFAM_AUTH, ICQ_SNACxAUTHxLOGON) |
| | 820 | { |
| | 821 | // truncate password to MAX 8 characters |
| | 822 | char szPass[MAX_LINE_LEN]; |
| | 823 | if (strlen(szPassword) > 8) |
| | 824 | { |
| | 825 | gLog.Warn(tr("%sPassword too long, truncated to 8 Characters!\n"), L_WARNxSTR); |
| | 826 | strncpy(szPass, szPassword, 8); |
| | 827 | szPass[8] = '\0'; |
| | 828 | } |
| | 829 | else |
| | 830 | { |
| | 831 | strcpy(szPass, szPassword); |
| | 832 | } |
| | 833 | |
| | 834 | std::string toHash = szMD5Salt; |
| | 835 | toHash += szPass; |
| | 836 | toHash += "AOL Instant Messenger (SM)"; |
| | 837 | unsigned char szDigest[16]; |
| | 838 | MD5((const unsigned char *)toHash.c_str(), toHash.size(), szDigest); |
| | 839 | |
| | 840 | unsigned int uinlen = strlen(szUin); |
| | 841 | unsigned int digestlen = strlen(reinterpret_cast<char *>(szDigest)); |
| | 842 | |
| | 843 | m_nSize += uinlen + digestlen + 70; |
| | 844 | InitBuffer(); |
| | 845 | |
| | 846 | buffer->PackTLV(0x0001, uinlen, szUin); |
| | 847 | buffer->PackTLV(0x0025, digestlen, reinterpret_cast<char *>(szDigest)); |
| | 848 | |
| | 849 | buffer->PackTLV(0x0003, 0x0008, "ICQBasic"); |
| | 850 | |
| | 851 | // Static versioning |
| | 852 | buffer->PackUnsignedLongBE(0x00160002); |
| | 853 | buffer->PackUnsignedShortBE(0x010A); |
| | 854 | // Client version major (4 == ICQ2000, 5 == ICQ2001) |
| | 855 | buffer->PackUnsignedLongBE(0x00170002); |
| | 856 | buffer->PackUnsignedShortBE(0x0014); |
| | 857 | // Client version minor |
| | 858 | buffer->PackUnsignedLongBE(0x00180002); |
| | 859 | buffer->PackUnsignedShortBE(0x0022); |
| | 860 | buffer->PackUnsignedLongBE(0x00190002); |
| | 861 | buffer->PackUnsignedShortBE(0x0000); |
| | 862 | // Client version build |
| | 863 | buffer->PackUnsignedLongBE(0x001a0002); |
| | 864 | buffer->PackUnsignedShortBE(0x0BB8); |
| | 865 | buffer->PackUnsignedLongBE(0x00140004); |
| | 866 | buffer->PackUnsignedLongBE(0x0000043D); |
| | 867 | |
| | 868 | // locale info, just use english, usa for now, i don't know what else they use |
| | 869 | buffer->PackTLV(0x000f, 0x0002, "en"); |
| | 870 | buffer->PackTLV(0x000e, 0x0002, "us"); |
| | 871 | } |
| | 872 | |