From 35df0639c0bd3ad7f1a7f73604b859e100a6c50c Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 24 Nov 2017 22:25:19 +0300 Subject: GMailNotifier: major rework to Miranda Netlib functions --- plugins/GmailNotifier/src/check.cpp | 258 ++++++++++++++++-------------------- 1 file changed, 111 insertions(+), 147 deletions(-) (limited to 'plugins/GmailNotifier/src/check.cpp') diff --git a/plugins/GmailNotifier/src/check.cpp b/plugins/GmailNotifier/src/check.cpp index e2d5af213a..9a74b69765 100644 --- a/plugins/GmailNotifier/src/check.cpp +++ b/plugins/GmailNotifier/src/check.cpp @@ -2,151 +2,7 @@ #pragma comment(lib, "Wininet.lib") - -void CheckMailInbox(Account *curAcc) -{ - // internet connection handle - // internet request handle - HINTERNET hHTTPConnection = nullptr, hHTTPRequest = nullptr; - - DBVARIANT dbv; - static char *contentType = "Content-Type: application/x-www-form-urlencoded"; - char requestBuffer[256] = "continue=https%3A%2F%2Fmail.google.com%2Fa%2F"; - char fileBuffer[_MAX_DOWN_BUFFER] = ""; - char *tail; - char str[64]; - char temp[_MAX_DOWN_BUFFER] = ""; - unsigned long bufferLength; - - if (curAcc->IsChecking) - return; - - curAcc->IsChecking = TRUE; - - if (!db_get_s(curAcc->hContact, "CList", "MyHandle", &dbv)) { - mir_strcpy(curAcc->results.content, dbv.pszVal); - db_free(&dbv); - } - else mir_strcpy(curAcc->results.content, curAcc->name); - - tail = strstr(curAcc->results.content, " ["); - if (tail) *tail = '\0'; - mir_strcat(curAcc->results.content, " ["); - - mir_strcpy(str, curAcc->results.content); - mir_strcat(str, Translate("Checking...")); - mir_strcat(str, "]"); - - db_set_s(curAcc->hContact, "CList", "MyHandle", str); - // internet open handle - HINTERNET hHTTPOpen = InternetOpenA("", INTERNET_OPEN_TYPE_PRECONFIG, "", "", 0); - if (!hHTTPOpen) { - mir_strcat(curAcc->results.content, Translate("Can't open Internet!")); - goto error_handle; - } - - if (curAcc->hosted[0]) { - hHTTPConnection = InternetConnectA(hHTTPOpen, - "www.google.com", - INTERNET_DEFAULT_HTTPS_PORT, - nullptr, - nullptr, - INTERNET_SERVICE_HTTP, - 0, - 0); - - if (!hHTTPConnection) { - mir_strcat(curAcc->results.content, Translate("Can't reach server!")); - goto error_handle; - } - mir_strcpy(str, "/a/"); - mir_strcat(str, curAcc->hosted); - mir_strcat(str, "/LoginAction"); - hHTTPRequest = HttpOpenRequestA(hHTTPConnection, "POST", str, HTTP_VERSIONA, nullptr, nullptr, INTERNET_FLAG_SECURE, 0); - mir_strcat(requestBuffer, curAcc->hosted); - mir_strcat(requestBuffer, "%2Ffeed%2Fatom&service=mail&userName="); - mir_strcat(requestBuffer, curAcc->name); - tail = strchr(requestBuffer, '@'); - *tail = '\0'; - mir_strcat(requestBuffer, "&password="); - mir_strcat(requestBuffer, curAcc->pass); - if (!HttpSendRequestA(hHTTPRequest, contentType, (int)mir_strlen(contentType) + 1, requestBuffer, (int)mir_strlen(requestBuffer) + 1)) { - mir_strcpy(curAcc->results.content, Translate("Can't send account data!")); - goto error_handle; - } - - InternetCloseHandle(hHTTPConnection); - InternetCloseHandle(hHTTPRequest); - hHTTPRequest = nullptr; - } - - hHTTPConnection = InternetConnectA(hHTTPOpen, "mail.google.com", INTERNET_DEFAULT_HTTPS_PORT, nullptr, nullptr, INTERNET_SERVICE_HTTP, 0, 0); - if (!hHTTPConnection) { - mir_strcat(curAcc->results.content, Translate("Can't reach server!")); - goto error_handle; - } - if (curAcc->hosted[0]) { - mir_strcpy(str, "/a/"); - mir_strcat(str, curAcc->hosted); - mir_strcat(str, "/feed/atom"); - } - else mir_strcpy(str, "/mail/feed/atom"); - - hHTTPRequest = HttpOpenRequest(hHTTPConnection, L"GET", _A2T(str), nullptr, nullptr, nullptr, INTERNET_FLAG_SECURE | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD, 0); - InternetSetOption(hHTTPRequest, INTERNET_OPTION_USERNAME, _A2T(curAcc->name), (int)mir_strlen(curAcc->name) + 1); - InternetSetOption(hHTTPRequest, INTERNET_OPTION_PASSWORD, _A2T(curAcc->pass), (int)mir_strlen(curAcc->pass) + 1); - if (!HttpSendRequest(hHTTPRequest, nullptr, 0, nullptr, 0)) { - mir_strcat(curAcc->results.content, Translate("Can't get RSS feed!")); - goto error_handle; - } - while (InternetReadFile(hHTTPRequest, temp, _MAX_DOWN_BUFFER, &bufferLength) && bufferLength > 0) { - temp[bufferLength] = '\0'; - mir_strcat(fileBuffer, temp); - } - - fileBuffer[_MAX_DOWN_BUFFER - 1] = '\0'; - curAcc->results_num = ParsePage(fileBuffer, &curAcc->results); - if (curAcc->results_num == -1) { - mir_strcat(curAcc->results.content, Translate("Wrong name or password!")); - goto error_handle; - } - InternetCloseHandle(hHTTPOpen); - InternetCloseHandle(hHTTPConnection); - InternetCloseHandle(hHTTPRequest); - - mir_strcat(curAcc->results.content, _itoa(curAcc->results_num, str, 10)); - mir_strcat(curAcc->results.content, "]"); - - curAcc->IsChecking = FALSE; - return; - -error_handle: - curAcc->results_num = -1; - InternetCloseHandle(hHTTPOpen); - InternetCloseHandle(hHTTPConnection); - InternetCloseHandle(hHTTPRequest); - - mir_strcat(curAcc->results.content, "]"); - - curAcc->IsChecking = FALSE; -} - -void __cdecl Check_ThreadFunc(void *lpParam) -{ - InternetSetCookieA("https://mail.google.com/mail/", "GX", ""); - if (lpParam) { - CheckMailInbox((Account *)lpParam); - NotifyUser((Account *)lpParam); - } - else { - for (int i = 0; i < acc_num && GetContactProto(acc[i].hContact); i++) { - CheckMailInbox(&acc[i]); - NotifyUser(&acc[i]); - } - } -} - -int ParsePage(char *page, resultLink *prst) +static int ParsePage(char *page, resultLink *prst) { char *str_head; char *str_tail; @@ -155,8 +11,6 @@ int ParsePage(char *page, resultLink *prst) wchar_t str[64]; prst->next = nullptr; - if (strstr(page, "Unauthorized")) - return -1; if (!(str_head = strstr(page, ""))) return 0; @@ -186,3 +40,113 @@ int ParsePage(char *page, resultLink *prst) prst->next = nullptr; return num; } + +void CheckMailInbox(Account *curAcc) +{ + if (curAcc->IsChecking) + return; + + curAcc->IsChecking = true; + + mir_strcpy(curAcc->results.content, curAcc->name); + mir_strcat(curAcc->results.content, " ["); + + char str[64]; + mir_snprintf(str, "%s%s]", curAcc->results.content, Translate("Checking...")); + db_set_s(curAcc->hContact, "CList", "MyHandle", str); + + if (curAcc->hosted[0]) { + CMStringA szUrl(FORMAT, "https://www.google.com/a/%s/LoginAction", curAcc->hosted); + CMStringA szBody("continue=https%3A%2F%2Fmail.google.com%2Fa%2F"); + szBody.Append(curAcc->hosted); + szBody.Append("%2Ffeed%2Fatom&service=mail&userName="); + char *tail = strchr(curAcc->name, '@'); + if (tail) *tail = 0; + szBody.Append(curAcc->name); + if (tail) *tail = '@'; + szBody.Append("&password="); + szBody.Append(curAcc->pass); + + NETLIBHTTPHEADER headers[1] = { + { "Content-Type", "application/x-www-form-urlencoded" } + }; + + NETLIBHTTPREQUEST nlr = {}; + nlr.cbSize = sizeof(nlr); + nlr.szUrl = szUrl.GetBuffer(); + nlr.requestType = REQUEST_POST; + nlr.headersCount = _countof(headers); + nlr.headers = headers; + nlr.dataLength = szBody.GetLength(); + nlr.pData = szBody.GetBuffer(); + + NETLIBHTTPREQUEST *nlu = Netlib_HttpTransaction(hNetlibUser, &nlr); + if (nlu == nullptr || nlu->resultCode != 200) { + mir_strcpy(curAcc->results.content, Translate("Can't send account data!")); + + Netlib_FreeHttpRequest(nlu); + curAcc->results_num = -1; + mir_strcat(curAcc->results.content, "]"); + curAcc->IsChecking = false; + return; + } + + Netlib_FreeHttpRequest(nlu); + } + + // go! + CMStringA loginPass(FORMAT, "%s:%s", curAcc->name, curAcc->pass); + ptrA loginPassEncoded(mir_base64_encode((BYTE*)loginPass.c_str(), loginPass.GetLength())); + + CMStringA szUrl("https://mail.google.com"), szAuth(FORMAT, "Basic %s", loginPassEncoded.get()); + if (curAcc->hosted[0]) + szUrl.AppendFormat("/a/%s/feed/atom", curAcc->hosted); + else + szUrl.Append("/mail/feed/atom"); + + NETLIBHTTPHEADER headers[1] = { + { "Authorization", szAuth.GetBuffer() } + }; + + NETLIBHTTPREQUEST nlr = {}; + nlr.cbSize = sizeof(nlr); + nlr.szUrl = szUrl.GetBuffer(); + nlr.requestType = REQUEST_GET; + + NETLIBHTTPREQUEST *nlu = Netlib_HttpTransaction(hNetlibUser, &nlr); + if (nlu == nullptr) { + if (nlr.resultCode == 401) + mir_strcat(curAcc->results.content, Translate("Wrong name or password!")); + else + mir_strcat(curAcc->results.content, Translate("Can't get RSS feed!")); + Netlib_FreeHttpRequest(nlu); + + curAcc->results_num = -1; + mir_strcat(curAcc->results.content, "]"); + curAcc->IsChecking = false; + return; + } + + curAcc->results_num = ParsePage(nlu->pData, &curAcc->results); + mir_strcat(curAcc->results.content, _itoa(curAcc->results_num, str, 10)); + mir_strcat(curAcc->results.content, "]"); + + curAcc->IsChecking = false; +} + +void __cdecl Check_ThreadFunc(void *lpParam) +{ + if (lpParam) { + CheckMailInbox((Account *)lpParam); + NotifyUser((Account *)lpParam); + } + else { + for (int i = 0; i < g_accs.getCount(); i++) { + Account &acc = g_accs[i]; + if (GetContactProto(acc.hContact)) { + CheckMailInbox(&acc); + NotifyUser(&acc); + } + } + } +} -- cgit v1.2.3