| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 | 
							- #include "StdAfx.h"
 
- #include "RecieveSocket.h"
 
- #include "Options.h"
 
- #include "Misc.h"
 
- #include "CP_Main.h"
 
- #include "shared/TextConvert.h"
 
- CRecieveSocket::CRecieveSocket(SOCKET sock)
 
- {
 
- 	m_pDataReturnedFromDecrypt = NULL;
 
- 	m_Sock = sock;
 
- 	m_pEncryptor = new CEncryption; //CreateEncryptionInterface("encryptdecrypt.dll");
 
- 	m_pProgress = NULL;
 
- }
 
- CRecieveSocket::~CRecieveSocket()
 
- {
 
- 	if(m_pEncryptor)
 
- 	{
 
- 		m_pEncryptor->FreeBuffer(m_pDataReturnedFromDecrypt);
 
- 		delete m_pEncryptor;
 
- 		m_pEncryptor = NULL;
 
- 	}
 
- }
 
- void CRecieveSocket::FreeDecryptedData()
 
- { 
 
- 	if(g_Opt.m_csPassword == "")
 
- 	{
 
- 		delete [] m_pDataReturnedFromDecrypt;
 
- 	}
 
- 	else
 
- 	{
 
- 		m_pEncryptor->FreeBuffer(m_pDataReturnedFromDecrypt);
 
- 	}
 
- 	m_pDataReturnedFromDecrypt = NULL;
 
- }
 
- LPVOID CRecieveSocket::ReceiveEncryptedData(long lInSize, long &lOutSize)
 
- {
 
- 	if(m_pEncryptor == NULL)
 
- 	{
 
- 		LogSendRecieveInfo("ReceiveEncryptedData::Encryption not initialized");
 
- 		return NULL;
 
- 	}
 
- 	if(m_pDataReturnedFromDecrypt)
 
- 		FreeDecryptedData();
 
- 	char *pInput = new char[lInSize];
 
- 	UCHAR* pOutput = NULL;
 
- 	
 
- 	if(pInput)
 
- 	{
 
- 		int nOut = 0;
 
- 		if(RecieveExactSize(pInput, lInSize))
 
- 		{
 
- 			CStringA csPassword;
 
- 			INT_PTR count = g_Opt.m_csNetworkPasswordArray.GetSize();
 
- 			INT_PTR nIndex;
 
- 			for(int i = -2; i < count; i++)
 
- 			{
 
- 				csPassword.Empty();
 
- 				nIndex = i;
 
- 				//First time through try the last index that was valid
 
- 				if(i == -2)
 
- 				{
 
- 					nIndex = theApp.m_lLastGoodIndexForNextworkPassword;
 
- 					if(nIndex == -2)
 
- 						continue;
 
- 				}
 
- 				if(nIndex == -1)
 
- 				{
 
- 					csPassword = g_Opt.m_csPassword;
 
- 				}
 
- 				else
 
- 				{
 
- 					if(nIndex >= 0 && nIndex < count)
 
- 					{
 
- 						CTextConvert::ConvertToUTF8(g_Opt.m_csNetworkPasswordArray[nIndex], csPassword);
 
- 					}
 
- 					else
 
- 					{
 
- 						continue;
 
- 					}
 
- 				}
 
- 				if(m_pEncryptor->Decrypt((UCHAR*)pInput, lInSize, csPassword, pOutput, nOut) == FALSE)
 
- 				{
 
- 					LogSendRecieveInfo(StrF(_T("ReceiveEncryptedData:: Failed to Decrypt data password = %s"), g_Opt.m_csPassword));
 
- 				}
 
- 				else
 
- 				{
 
- 					theApp.m_lLastGoodIndexForNextworkPassword = (long)nIndex;
 
- 					break;
 
- 				}
 
- 			}
 
- 		}
 
- 		else
 
- 		{
 
- 			LogSendRecieveInfo(StrF(_T("ReceiveEncryptedData:: FAILED"), lInSize));
 
- 		}
 
- 		lOutSize = nOut;
 
- 		delete [] pInput;
 
- 		pInput = NULL;
 
- 	}	
 
- 	else
 
- 	{
 
- 		ASSERT(FALSE);
 
- 		LogSendRecieveInfo(StrF(_T("ReceiveEncryptedData:: Failed to create new data size = %d"), lInSize));
 
- 	}
 
- 	m_pDataReturnedFromDecrypt = pOutput;
 
- 	return pOutput;
 
- }
 
- int recv_to(int fd, char *buffer, int len, int flags, int to) 
 
- {
 
- 	fd_set readset;
 
- 	int result, iof = -1;
 
- 	struct timeval tv;
 
- 	// Initialize the set
 
- 	FD_ZERO(&readset);
 
- 	FD_SET(fd, &readset);
 
- 	// Initialize time out struct
 
- 	tv.tv_sec = 0;
 
- 	tv.tv_usec = to * 1000;
 
- 	// select()
 
- 	result = select(fd+1, &readset, NULL, NULL, &tv);
 
- 	// Check status
 
- 	if (result < 0)
 
- 		return -1;
 
- 	else if (result > 0 && FD_ISSET(fd, &readset)) 
 
- 	{
 
- 		// Set non-blocking mode
 
- 		//if ((iof = fcntl(fd, F_GETFL, 0)) != -1)
 
- 		//	fcntl(fd, F_SETFL, iof | O_NONBLOCK);
 
- 		// receive
 
- 		result = recv(fd, buffer, len, flags);
 
- 		// set as before
 
- 		//if (iof != -1)
 
- 		//	fcntl(fd, F_SETFL, iof);
 
- 		return result;
 
- 	}
 
- 	return -2;
 
- }
 
- BOOL CRecieveSocket::RecieveExactSize(char *pData, long lSize)
 
- {
 
- 	LogSendRecieveInfo(StrF(_T("RecieveExactSize:: ------ Start wanted size %d"), lSize));
 
- 	long lReceiveCount = 0;
 
- 	long lWanted = lSize;
 
- 	long lOffset = 0;
 
- 	CString originalText = _T("");
 
- 	while(lWanted > 0)
 
- 	{		
 
- 		fd_set readset;
 
- 		int res;
 
- 		int timeoutMs = CGetSetOptions::GetNetworkReadTimeoutMS();
 
- 		int loops100msEach = (timeoutMs/100);
 
- 		for(int i = 0; i < loops100msEach; i++)
 
- 		{
 
- 			lReceiveCount = recv_to(m_Sock, pData + lOffset, lWanted, 0, 100);
 
- 			if(lReceiveCount >= 0)
 
- 			{
 
- 				break;
 
- 			}
 
- 			else if(lReceiveCount == SOCKET_ERROR)
 
- 			{
 
- 				ASSERT(FALSE);
 
- 				LogSendRecieveInfo(StrF(_T("RecieveExactSize:: Socket Error")));
 
- 				return FALSE;
 
- 			}
 
- 			if(lReceiveCount == -2 && i > 15)
 
- 			{
 
- 				if(m_pProgress != NULL)
 
- 				{
 
- 					originalText = m_pProgress->GetMessage();
 
- 					m_pProgress->SetMessage(StrF(_T("Requesting data from Server")));					
 
- 					m_pProgress->PumpMessages();
 
- 					if(m_pProgress->Cancelled())
 
- 					{
 
- 						return FALSE;
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		if(lReceiveCount == -2)
 
- 		{
 
- 			ASSERT(FALSE);
 
- 			LogSendRecieveInfo(StrF(_T("RecieveExactSize:: Timeout waiting for server")));
 
- 			return FALSE;
 
- 		}
 
- 		if(lReceiveCount == SOCKET_ERROR)
 
- 		{
 
- 			LogSendRecieveInfo("RecieveExactSize:: ********ERROR if(lReceiveCount == SOCKET_ERROR)*******");
 
- 			return FALSE;
 
- 		}
 
- 		else if(lReceiveCount == 0)
 
- 		{
 
- 			LogSendRecieveInfo("RecieveExactSize:: ********ERROR lRecieveCount == 0");
 
- 			return FALSE;
 
- 		}
 
- 		if(m_pProgress != NULL &&
 
- 			originalText != _T(""))
 
- 		{
 
- 			m_pProgress->SetMessage(originalText);					
 
- 		}
 
- 		lWanted -= lReceiveCount;
 
- 		lOffset += lReceiveCount;
 
- 		LogSendRecieveInfo(StrF(_T("RecieveExactSize:: ------Bytes Read %d Total Recieved %d"), lReceiveCount, lOffset));
 
- 	}
 
- //	LogSendRecieveInfo(StrF(_T("RecieveExactSize:: ------END RecieveExactSize Recieved %d"), lOffset));
 
- 	return TRUE;
 
- }
 
- #define ENCRYPTED_SIZE_CSENDINFO 508
 
- BOOL CRecieveSocket::RecieveCSendInfo(CSendInfo *pInfo)
 
- {
 
- 	BOOL bRet = FALSE;
 
- 	long lOutSize = 0;
 
- 	long lRecieveSize = ENCRYPTED_SIZE_CSENDINFO;
 
- 	LPVOID lpData = ReceiveEncryptedData(lRecieveSize, lOutSize);
 
- 	if(lpData)
 
- 	{
 
- 		memcpy(pInfo, lpData, sizeof(CSendInfo));
 
- 		bRet = (pInfo->m_nSize == sizeof(CSendInfo));
 
- 		FreeDecryptedData();
 
- 	}
 
- 	return bRet;
 
- }
 
 
  |