From: Jon K. <em...@us...> - 2005-07-18 11:35:58
|
Update of /cvsroot/licq/licq/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10553/src Modified Files: icqd-srv.cpp icqd-tcp.cpp icqd.cpp icqpacket.cpp Log Message: A few things I have built up recently. * Fix registration. This requires showing an image to the user to verify that th ey are a human, not a spambot. * Use the IBCM method for accepting file transfers. We can now accept files from Miranda... still checking about the problem with files from ICQ5. Index: icqd-srv.cpp =================================================================== RCS file: /cvsroot/licq/licq/src/icqd-srv.cpp,v retrieving revision 1.163 retrieving revision 1.164 diff -u -d -r1.163 -r1.164 --- icqd-srv.cpp 7 Jul 2005 15:10:21 -0000 1.163 +++ icqd-srv.cpp 18 Jul 2005 11:35:47 -0000 1.164 @@ -572,6 +572,12 @@ void CICQDaemon::icqRegister(const char *_szPasswd) { + if (m_szRegisterPasswd) + { + free(m_szRegisterPasswd); + m_szRegisterPasswd = 0; + } + m_szRegisterPasswd = strdup(_szPasswd); m_bRegistering = true; m_nRegisterThreadId = pthread_self(); @@ -591,7 +597,30 @@ gLog.Info(tr("%sRegistering a new user...\n"), L_SRVxSTR); ICQEvent *e = SendExpectEvent_Server(0, p, NULL); e->thread_plugin = m_nRegisterThreadId; - m_nRegisterThreadId = 0; +} + +//-----ICQ::icqVerifyRegistration +void CICQDaemon::icqVerifyRegistration() +{ + CPU_RegisterFirst *pFirst = new CPU_RegisterFirst(); + SendEvent_Server(pFirst); + + CPU_VerifyRegistration *pVerify = new CPU_VerifyRegistration(); + gLog.Info(tr("%sRequesting verification image...\n"), L_SRVxSTR); + SendEvent_Server(pVerify); + + m_nRegisterThreadId = pthread_self(); +} + +//-----ICQ:: +void CICQDaemon::icqVerify(const char *szVerification) +{ + CPU_SendVerification *p = new CPU_SendVerification(m_szRegisterPasswd, + szVerification); + gLog.Info(tr("%sSending verification for registration.\n"), L_SRVxSTR); + + ICQEvent *e = SendExpectEvent_Server(0, p, NULL); + // e->thread_plugin = m_nRegisterThreadId; } //-----ICQ::icqRelogon------------------------------------------------------- @@ -2011,8 +2040,13 @@ case ICQ_CHNxNEW: if (m_bRegistering) { - icqRegisterFinish(); - m_bRegistering = false; + if (m_bVerify) + icqVerifyRegistration(); + else + { + icqRegisterFinish(); + m_bRegistering = false; + } } break; @@ -5530,12 +5564,23 @@ { case ICQ_SNACxNEW_UIN_ERROR: { - gLog.Warn(tr("%sRegistration error.\n"), L_WARNxSTR); + gLog.Warn(tr("%sVerification required. Reconnecting...\n"), L_WARNxSTR); ICQEvent *e = DoneServerEvent(nSubSequence, EVENT_ERROR); if (e) - ProcessDoneEvent(e); - + delete e; + m_bVerify = true; + + // Reconnect now + char *szPasswd = strdup(m_szRegisterPasswd); // gets deleted in postLogoff + int nSD = m_nTCPSrvSocketDesc; + m_nTCPSrvSocketDesc = -1; + m_eStatus = STATUS_OFFLINE_MANUAL; + m_bLoggingOn = false; + gSocketManager.CloseSocket(nSD); + postLogoff(nSD, NULL); + icqRegister(szPasswd); + free(szPasswd); break; } case ICQ_SNACxNEW_UIN: @@ -5545,13 +5590,15 @@ if (e) ProcessDoneEvent(e); + m_bVerify = false; + m_bRegistering = false; + packet.UnpackUnsignedShort(); // flags packet.UnpackUnsignedLong(); // id - // 46 bytes of shit - for (int x = 0; x < 11; x++) + // 40 bytes of shit + for (int x = 0; x < 10; x++) packet.UnpackUnsignedLong(); - packet.UnpackUnsignedShort(); unsigned long nNewUin = packet.UnpackUnsignedLong(); @@ -5576,6 +5623,8 @@ m_szRegisterPasswd = 0; } + PushPluginSignal(new CICQSignal(SIGNAL_NEW_OWNER, 0, szUin, LICQ_PPID)); + // Reconnect now int nSD = m_nTCPSrvSocketDesc; m_nTCPSrvSocketDesc = -1; @@ -5586,6 +5635,44 @@ icqLogon(ICQ_STATUS_ONLINE); break; } + + case ICQ_SNACxSEND_IMAGE: + { + packet.UnpackUnsignedShort(); // flags + packet.UnpackUnsignedLong(); // id + m_bVerify = false; + + if (!packet.readTLV()) + { + char *buf; + gLog.Unknown(tr("%sUnknown server response:\n%s\n"), L_UNKNOWNxSTR, + packet.print(buf)); + delete [] buf; + break; + } + + char *szJPEG = packet.UnpackStringTLV(0x0002); + + // Save it in a file + char szFilename[MAX_FILENAME_LEN]; + snprintf(szFilename, MAX_FILENAME_LEN, "%s/%s", BASE_DIR, "Licq_verify.jpg"); + FILE *fp = fopen(szFilename, "w"); + if (fp == 0) + { + gLog.Warn(tr("%sUnable to open file (%s):\n%s%s.\n"), L_WARNxSTR, + szFilename, L_BLANKxSTR, strerror(errno)); + break; + } + + fwrite(szJPEG, packet.getTLVLen(0x0002), 1, fp); + fclose(fp); + + // Push a signal to the plugin to load the file + gLog.Info("%sReceived verification image.\n", L_SRVxSTR); + PushPluginSignal(new CICQSignal(SIGNAL_VERIFY_IMAGE, 0, 0, LICQ_PPID)); + break; + } + default: { char *buf; Index: icqd-tcp.cpp =================================================================== RCS file: /cvsroot/licq/licq/src/icqd-tcp.cpp,v retrieving revision 1.82 retrieving revision 1.83 diff -u -d -r1.82 -r1.83 --- icqd-tcp.cpp 15 Jul 2005 16:14:41 -0000 1.82 +++ icqd-tcp.cpp 18 Jul 2005 11:35:47 -0000 1.83 @@ -840,23 +840,25 @@ //-----CICQDaemon::fileAccept----------------------------------------------------------------------------- void CICQDaemon::icqFileTransferAccept(unsigned long nUin, unsigned short nPort, - unsigned short nSequence, unsigned long nMsgID[2], bool bDirect) + unsigned short nSequence, unsigned long nMsgID[2], bool bDirect, + const char *szDesc, const char *szFile, unsigned long nFileSize) { // basically a fancy tcp ack packet which is sent late ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); if (u == NULL) return; - gLog.Info(tr("%sAccepting file transfer from %s (#%hu).\n"), - bDirect ? L_TCPxSTR : L_SRVxSTR, u->GetAlias(), -nSequence); - if (bDirect) - { - CPT_AckFileAccept p(nPort, nSequence, u); - AckTCP(p, u->SocketDesc(ICQ_CHNxNONE)); - } - else - { - CPU_AckFileAccept *p = new CPU_AckFileAccept(u, nMsgID, nSequence, nPort); - SendEvent_Server(p); - } + gLog.Info(tr("%sAccepting file transfer from %s (#%hu).\n"), + bDirect ? L_TCPxSTR : L_SRVxSTR, u->GetAlias(), -nSequence); + if (bDirect) + { + CPT_AckFileAccept p(nPort, nSequence, u); + AckTCP(p, u->SocketDesc(ICQ_CHNxNONE)); + } + else + { + CPU_AckFileAccept *p = new CPU_AckFileAccept(u, nMsgID, + nSequence, nPort, szDesc, szFile, nFileSize); + SendEvent_Server(p); + } gUserManager.DropUser(u); } @@ -1754,7 +1756,7 @@ if (junkChar != 0x0D) messageTmp[j++] = junkChar; } messageTmp[j] = '\0'; - + message = parseRTF(messageTmp); if (nInVersion <= 4) Index: icqd.cpp =================================================================== RCS file: /cvsroot/licq/licq/src/icqd.cpp,v retrieving revision 1.102 retrieving revision 1.103 diff -u -d -r1.102 -r1.103 --- icqd.cpp 7 Jul 2005 15:10:22 -0000 1.102 +++ icqd.cpp 18 Jul 2005 11:35:48 -0000 1.103 @@ -148,6 +148,7 @@ m_nServerAck = 0; m_bLoggingOn = false; m_bOnlineNotifies = true; + m_bVerify = false; m_szRegisterPasswd = 0; m_nRegisterThreadId = 0; Index: icqpacket.cpp =================================================================== RCS file: /cvsroot/licq/licq/src/icqpacket.cpp,v retrieving revision 1.117 retrieving revision 1.118 diff -u -d -r1.117 -r1.118 --- icqpacket.cpp 14 Jul 2005 15:05:37 -0000 1.117 +++ icqpacket.cpp 18 Jul 2005 11:35:48 -0000 1.118 @@ -683,19 +683,54 @@ buffer->PackUnsignedShortBE(0x0001); buffer->PackUnsignedShortBE(nPassLen+51); buffer->PackUnsignedLongBE(0x00000000); - buffer->PackUnsignedLongBE(0x28000300); + buffer->PackUnsignedLongBE(0x28000000); buffer->PackUnsignedLongBE(0); buffer->PackUnsignedLongBE(0); - buffer->PackUnsignedLongBE(0x82270000); - buffer->PackUnsignedLongBE(0x82270000); + buffer->PackUnsignedLongBE(0);//x82270000); + buffer->PackUnsignedLongBE(0);//x82270000); for (int x = 0; x < 4; x++) buffer->PackUnsignedLongBE(0); buffer->PackLNTS(szPasswd); - buffer->PackUnsignedLongBE(0x82270000); - buffer->PackUnsignedLongBE(0x00001902); + buffer->PackUnsignedLongBE(0);//x82270000); + buffer->PackUnsignedLongBE(0xf2070000); } #endif +CPU_VerifyRegistration::CPU_VerifyRegistration() + : CPU_CommonFamily(ICQ_SNACxFAM_NEWUIN, ICQ_SNACxREQUEST_IMAGE) +{ + // Yes, it's empty + + InitBuffer(); +} + +CPU_SendVerification::CPU_SendVerification(const char *szPasswd, const char *szVerify) + : CPU_CommonFamily(ICQ_SNACxFAM_NEWUIN, ICQ_SNACxREGISTER_USER) +{ + int nPassLen = strlen(szPasswd); + int nVerifyLen = strlen(szVerify); + m_nSize += 55 + nPassLen + nVerifyLen + 4; + + InitBuffer(); + + buffer->PackUnsignedShortBE(0x0001); + buffer->PackUnsignedShortBE(nPassLen+51); + buffer->PackUnsignedLongBE(0x00000000); + buffer->PackUnsignedLongBE(0x28000000); + buffer->PackUnsignedLongBE(0); + buffer->PackUnsignedLongBE(0); + buffer->PackUnsignedLongBE(0);//x82270000); + buffer->PackUnsignedLongBE(0);//x82270000); + for (int x = 0; x < 4; x++) buffer->PackUnsignedLongBE(0); + buffer->PackLNTS(szPasswd); + buffer->PackUnsignedLongBE(0);//x82270000); + buffer->PackUnsignedLongBE(0xf2070000); + // Verification TLV + buffer->PackUnsignedShortBE(0x0009); + buffer->PackUnsignedShortBE(nVerifyLen); + buffer->Pack(szVerify, nVerifyLen); +} + //-----Logon-------------------------------------------------------------------- CPU_Logon::CPU_Logon(const char *szPassword, const char *szUin, unsigned short _nLogonStatus) : CSrvPacketTcp(ICQ_CHNxNEW) @@ -2271,13 +2306,12 @@ //-----AckFileAccept----------------------------------------------------------- CPU_AckFileAccept::CPU_AckFileAccept(ICQUser *u,//unsigned long nUin, - unsigned long nMsgID[2], - unsigned short nSequence, - unsigned short nPort) - : CPU_AdvancedMessage(u, ICQ_CMDxSUB_FILE, 0, true, nSequence, nMsgID[0], - nMsgID[1]) + unsigned long nMsgID[2], unsigned short nSequence, unsigned short nPort, + const char *szDesc, const char *szFile, unsigned long nFileSize) + : CPU_AdvancedMessage(u, ICQ_CMDxSUB_ICBM, 0, true, nSequence, nMsgID[0], + nMsgID[1]) { -#if 1 +#if 0 // XXX This is not the ICBM way yet! // XXX It doesnt' even work! Perhaps try ICBM and it'll work? m_nSize += 15; @@ -2289,32 +2323,30 @@ buffer->PackUnsignedLong(0); // filesize buffer->PackUnsignedLong(nPort); // port #else - m_nSize += 76; -// m_nExtraLen += 4; m_nSize += 4; //the ack request + int nFileLen = strlen(szFile), nDescLen = strlen(szDesc); + m_nSize += 66 + nFileLen + nDescLen; InitBuffer(); - buffer->PackUnsignedShort(0x32); // len of following plugin info + buffer->PackUnsignedShort(0x29); // len of following plugin info buffer->PackUnsignedLongBE(0xF02D12D9); buffer->PackUnsignedLongBE(0x3091D311); buffer->PackUnsignedLongBE(0x8DD70010); buffer->PackUnsignedLongBE(0x4B06462E); buffer->PackUnsignedShortBE(0x0000); - buffer->PackUnsignedLong(13); // strlen - is 13 bytes though - buffer->Pack("File Transfer", 13); - buffer->PackUnsignedLongBE(0x00000101); - buffer->PackUnsignedLongBE(0x00000000); + buffer->PackUnsignedLong(4); // strlen - is 13 bytes though + buffer->Pack("File", 4); + buffer->PackUnsignedLongBE(0x00000100); + buffer->PackUnsignedLongBE(0x00010000); buffer->PackUnsignedLongBE(0); buffer->PackUnsignedShortBE(0); buffer->PackChar(0); - buffer->PackUnsignedLong(20); //remaining - is 4 bytes - //dont count last 4 bytes - buffer->PackUnsignedLong(0); // file desc - is 4 bytes - buffer->PackChar(0); // file desc + buffer->PackUnsignedLong(19 + nDescLen + nFileLen); + buffer->PackUnsignedLong(nDescLen); // file desc - is 4 bytes + buffer->Pack(szDesc, nDescLen); // file desc buffer->PackUnsignedLong(ReversePort(nPort)); // port reversed - buffer->PackString(""); // filename - buffer->PackUnsignedLong(0); // filesize + buffer->PackString(szFile); // filename + buffer->PackUnsignedLong(nFileSize); // filesize buffer->PackUnsignedLong(nPort); // port -// buffer->PackUnsignedLongBE(0x00030000); // ack request #endif } @@ -4353,6 +4385,7 @@ buffer->PackUnsignedShort(m_nSubCommand); buffer->PackUnsignedShort(m_nStatus); buffer->PackUnsignedShort(m_nMsgType); + buffer->PackUnsignedShort(m_nMsgLen); buffer->Pack(m_szMessage, m_nMsgLen); m_szLocalPortOffset = NULL; |