1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
/*
Copyright (c) 2013-18 Miranda NG team (https://miranda-ng.org)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation version 2
of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdafx.h"
#include "resource.h"
/////////////////////////////////////////////////////////////////////////////////////////
// Captcha form
bool CVkProto::RunCaptchaForm(LPCSTR szUrl, CMStringA &result)
{
debugLogA("CVkProto::RunCaptchaForm: reading picture from %s", szUrl);
result.Empty();
CAPTCHA_FORM_PARAMS param = {};
if (getBool("UseCaptchaAssistant", false)) {
CMStringA szCaptchaAssistant(FORMAT, "http://ca.tiflohelp.ru/?link=%s", ptrA(ExpUrlEncode(szUrl)));
Utils_OpenUrl(szCaptchaAssistant);
}
else {
NETLIBHTTPREQUEST req = { sizeof(req) };
req.requestType = REQUEST_GET;
req.szUrl = (LPSTR)szUrl;
req.flags = VK_NODUMPHEADERS;
NETLIBHTTPREQUEST *reply = Netlib_HttpTransaction(m_hNetlibUser, &req);
if (reply == nullptr)
return false;
if (reply->resultCode != 200) {
debugLogA("CVkProto::RunCaptchaForm: failed with code %d", reply->resultCode);
return false;
}
IMGSRVC_MEMIO memio = { 0 };
memio.iLen = reply->dataLength;
memio.pBuf = reply->pData;
memio.fif = FIF_UNKNOWN; /* detect */
param.bmp = (HBITMAP)CallService(MS_IMG_LOADFROMMEM, (WPARAM)&memio);
BITMAP bmp = { 0 };
GetObject(param.bmp, sizeof(bmp), &bmp);
param.w = bmp.bmWidth;
param.h = bmp.bmHeight;
}
CVkCaptchaForm dlg(this, ¶m);
if (!dlg.DoModal())
return false;
debugLogA("CVkProto::RunCaptchaForm: user entered text %s", param.Result);
result = param.Result;
return true;
}
/////////////////////////////////////////////////////////////////////////////////////////
// fill a request from JSON
bool CVkProto::ApplyCaptcha(AsyncHttpRequest *pReq, const JSONNode &jnErrorNode)
{
debugLogA("CVkProto::ApplyCaptcha");
if (!IsOnline())
return false;
CMStringA szUrl(jnErrorNode["captcha_img"].as_mstring());
CMStringA szSid(jnErrorNode["captcha_sid"].as_mstring());
if (szUrl.IsEmpty() || szSid.IsEmpty())
return false;
CMStringA userReply;
if (!RunCaptchaForm(szUrl, userReply))
return false;
pReq << CHAR_PARAM("captcha_sid", szSid) << CHAR_PARAM("captcha_key", userReply.GetString());
pReq->bNeedsRestart = true;
return true;
}
|