summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/VKontakte/res/resource.rc37
-rw-r--r--protocols/VKontakte/src/misc.cpp124
-rw-r--r--protocols/VKontakte/src/resource.h2
-rw-r--r--protocols/VKontakte/src/version.h2
-rw-r--r--protocols/VKontakte/src/vk_options.cpp62
-rw-r--r--protocols/VKontakte/src/vk_options.h5
-rw-r--r--protocols/VKontakte/src/vk_proto.h6
-rw-r--r--protocols/VKontakte/src/vk_queue.cpp41
-rw-r--r--protocols/VKontakte/src/vk_struct.cpp2
-rw-r--r--protocols/VKontakte/src/vk_thread.cpp185
10 files changed, 56 insertions, 410 deletions
diff --git a/protocols/VKontakte/res/resource.rc b/protocols/VKontakte/res/resource.rc
index 61bbd7613b..aa59a26207 100644
--- a/protocols/VKontakte/res/resource.rc
+++ b/protocols/VKontakte/res/resource.rc
@@ -259,11 +259,8 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- LTEXT "E-mail or phone number:",IDC_STATIC,0,0,95,12
- EDITTEXT IDC_LOGIN,96,0,89,12,ES_AUTOHSCROLL
- LTEXT "Password:",IDC_STATIC,0,16,94,12
- EDITTEXT IDC_PASSWORD,95,16,90,12,ES_PASSWORD | ES_AUTOHSCROLL
- CONTROL "Open VKontakte site",IDC_URL,"Hyperlink",WS_TABSTOP,0,49,174,12
+ CONTROL "Open VKontakte site",IDC_URL,"Hyperlink",WS_TABSTOP,0,0,174,12
+ PUSHBUTTON "Token Request",IDC_TOKENREQ,16,12,88,14
END
IDD_OPT_ADV DIALOGEX 0, 0, 304, 233
@@ -307,27 +304,21 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- GROUPBOX "Login settings",IDC_STATIC,4,8,293,49
- RTEXT "E-mail or phone number:",IDC_STATIC,12,17,150,10
- EDITTEXT IDC_LOGIN,167,16,121,12,ES_AUTOHSCROLL
- RTEXT "Password:",IDC_STATIC,12,30,150,10
- EDITTEXT IDC_PASSWORD,167,30,121,12,ES_PASSWORD | ES_AUTOHSCROLL
- CONTROL "Open VKontakte site",IDC_URL,"Hyperlink",WS_TABSTOP,59,44,174,11
- GROUPBOX "Local settings",IDC_STATIC,4,58,293,111
- RTEXT "Contact list group:",IDC_STATIC,12,71,150,8
- EDITTEXT IDC_GROUPNAME,167,69,121,12,ES_AUTOHSCROLL
- RTEXT "Language for names and titles:",IDC_STATIC,12,86,148,10
- COMBOBOX IDC_COMBO_LANGUAGE,167,84,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- RTEXT "Mark message as read:",IDC_STATIC,12,101,150,12,SS_CENTERIMAGE
- COMBOBOX IDC_COMBO_MARKASREAD,167,101,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- RTEXT "Sync history on protocol online:",IDC_STATIC,12,117,150,12,SS_CENTERIMAGE
- COMBOBOX IDC_COMBO_SYNCHISTORY,167,117,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Local settings",IDC_STATIC,4,8,293,111
+ RTEXT "Contact list group:",IDC_STATIC,12,21,150,8
+ EDITTEXT IDC_GROUPNAME,167,19,121,12,ES_AUTOHSCROLL
+ RTEXT "Language for names and titles:",IDC_STATIC,12,36,148,10
+ COMBOBOX IDC_COMBO_LANGUAGE,167,34,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Mark message as read:",IDC_STATIC,12,51,150,12,SS_CENTERIMAGE
+ COMBOBOX IDC_COMBO_MARKASREAD,167,51,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Sync history on protocol online:",IDC_STATIC,12,67,150,12,SS_CENTERIMAGE
+ COMBOBOX IDC_COMBO_SYNCHISTORY,167,67,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
CONTROL "Load last messages when message window open and local history is empty",IDC_LASTHISTORYLOAD,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,133,278,10
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,83,278,10
CONTROL "Use local time for received messages",IDC_USE_LOCAL_TIME,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,143,278,10
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,93,278,10
CONTROL "Load only friends to local contact list",IDC_LOADONLYFRIENDS,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,153,278,10
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,103,278,10
END
IDD_CAPTCHAFORM DIALOGEX 0, 0, 258, 224
diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp
index b407cb7ac4..9a805a5f52 100644
--- a/protocols/VKontakte/src/misc.cpp
+++ b/protocols/VKontakte/src/misc.cpp
@@ -149,6 +149,9 @@ void CVkProto::CheckUpdate()
if (getDword("LastAccessTokenTime", 0) < 1740009600)
ClearAccessToken();
+ delSetting("Login");
+ delSetting("Password");
+
}
//////////////////////// bIint64IDCompatibility /////////////////////////////////////////
@@ -234,13 +237,6 @@ void CVkProto::ClearAccessToken()
ShutdownSession();
}
-wchar_t* CVkProto::GetUserStoredPassword()
-{
- debugLogA("CVkProto::GetUserStoredPassword");
- ptrA szRawPass(getStringA("Password"));
- return (szRawPass != nullptr) ? mir_utf8decodeW(szRawPass) : nullptr;
-}
-
void CVkProto::SetAllContactStatuses(int iStatus)
{
debugLogA("CVkProto::SetAllContactStatuses (%d)", iStatus);
@@ -410,10 +406,7 @@ bool CVkProto::CheckJsonResult(AsyncHttpRequest *pReq, const JSONNode &jnNode)
MsgPopup(TranslateT("You have to validate your account before you can use VK in Miranda NG"), TranslateT("Error"), true);
if (jnRedirectUri) {
T2Utf szRedirectUri(jnRedirectUri.as_mstring());
- AsyncHttpRequest *pRedirectReq = new AsyncHttpRequest(this, REQUEST_GET, szRedirectUri, false, &CVkProto::OnOAuthAuthorize);
- pRedirectReq->m_bApiReq = false;
- pRedirectReq->bIsMainConn = true;
- Push(pRedirectReq);
+ LogIn(szRedirectUri);
}
break;
case VKERR_FLOOD_CONTROL:
@@ -483,115 +476,6 @@ void CVkProto::OnReceiveSmth(MHttpResponse *reply, AsyncHttpRequest *pReq)
/////////////////////////////////////////////////////////////////////////////////////////
// Quick & dirty form parser
-static CMStringA getAttr(char *szSrc, LPCSTR szAttrName)
-{
- char *pEnd = strchr(szSrc, '>');
- if (pEnd == nullptr)
- return "";
-
- *pEnd = 0;
-
- char *p1 = strstr(szSrc, szAttrName);
- if (p1 == nullptr) {
- *pEnd = '>';
- return "";
- }
-
- p1 += mir_strlen(szAttrName);
- if (p1[0] != '=' || p1[1] != '\"') {
- *pEnd = '>';
- return "";
- }
-
- p1 += 2;
- char *p2 = strchr(p1, '\"');
- *pEnd = '>';
- if (p2 == nullptr)
- return "";
-
- return CMStringA(p1, (int)(p2 - p1));
-}
-
-bool CVkProto::AutoFillForm(char *pBody, CMStringA &szAction, CMStringA& szResult)
-{
- debugLogA("CVkProto::AutoFillForm");
- szResult.Empty();
-
- char *pFormBeg = strstr(pBody, "<form ");
- if (pFormBeg == nullptr)
- return false;
-
- char *pFormEnd = strstr(pFormBeg, "</form>");
- if (pFormEnd == nullptr)
- return false;
-
- *pFormEnd = 0;
-
- szAction = getAttr(pFormBeg, "action");
-
- CMStringA result;
- char *pFieldBeg = pFormBeg;
- while (true) {
- if ((pFieldBeg = strstr(pFieldBeg + 1, "<input ")) == nullptr)
- break;
-
- CMStringA type = getAttr(pFieldBeg, "type");
- if (type != "submit") {
- CMStringA name = getAttr(pFieldBeg, "name");
- CMStringA value = getAttr(pFieldBeg, "value");
- if (name == "email")
- value = (char*)T2Utf(ptrW(getWStringA("Login")));
- else if (name == "pass")
- value = (char*)T2Utf(ptrW(GetUserStoredPassword()));
- else if (name == "captcha_key") {
- char *pCaptchaBeg = strstr(pFormBeg, "<img id=\"captcha\"");
- if (!pCaptchaBeg)
- pCaptchaBeg = strstr(pFormBeg, "<img src=\"/captcha.php");
-
- if (pCaptchaBeg)
- if (!RunCaptchaForm(getAttr(pCaptchaBeg, "src"), value))
- return false;
- }
- else if (name == "code") {
- char szPrefixTel[10], szSufixTel[10];
- CMStringW wszTitle;
- char *pPhonePref = strstr(pFormBeg, "<span class=\"field_prefix\">");
- if (pPhonePref && sscanf(pPhonePref, "<span class=\"field_prefix\">%[^<]", szPrefixTel) == 1) {
- pPhonePref = strstr(pPhonePref + 1, "<span class=\"field_prefix\">&nbsp;");
- if (pPhonePref && sscanf(pPhonePref, "<span class=\"field_prefix\">&nbsp;%[^<]", szSufixTel) == 1) {
- wszTitle.Format(TranslateT("Enter the missing digits between %s and %s of the phone number linked to your account"),
- ptrW(mir_a2u(szPrefixTel)).get(), ptrW(mir_a2u(szSufixTel)).get());
- MessageBoxW(nullptr, wszTitle, TranslateT("Attention!"), MB_ICONWARNING | MB_OK);
- }
- }
-
- value = RunConfirmationCode(wszTitle);
- if (value.IsEmpty())
- return false;
- }
-
- if (!result.IsEmpty())
- result.AppendChar('&');
- result += name + "=";
- result += mir_urlEncode(value);
- }
- }
-
- szResult = result;
- debugLogA("CVkProto::AutoFillForm result = \"%s\"", szResult.c_str());
- return true;
-}
-
-CMStringW CVkProto::RunConfirmationCode(LPCWSTR pwszTitle)
-{
- ENTER_STRING pForm = {};
- pForm.type = 0;
- CMStringW wszTitle(FORMAT, L"%s: %s", m_tszUserName, IsEmpty(pwszTitle) ? TranslateT("Enter confirmation code") : pwszTitle);
- pForm.caption = wszTitle;
- pForm.szModuleName = m_szModuleName;
- pForm.szDataPrefix = "confirmcode_";
- return (!EnterString(&pForm)) ? CMStringW() : CMStringW(ptrW(pForm.ptszResult));
-}
CMStringW CVkProto::RunRenameNick(LPCWSTR pwszOldName)
{
diff --git a/protocols/VKontakte/src/resource.h b/protocols/VKontakte/src/resource.h
index 2910a8dc08..309d06f3e4 100644
--- a/protocols/VKontakte/src/resource.h
+++ b/protocols/VKontakte/src/resource.h
@@ -28,8 +28,6 @@
#define IDI_FORWARD 126
#define IDI_RELOADMESSAGE 130
#define IDD_TOKENFORM 131
-#define IDC_LOGIN 1001
-#define IDC_PASSWORD 1002
#define IDC_URL 1003
#define IDC_VALUE 1004
#define IDC_WHITERECT 1005
diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h
index 8f8e165fa4..2c5f916731 100644
--- a/protocols/VKontakte/src/version.h
+++ b/protocols/VKontakte/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 1
#define __RELEASE_NUM 18
-#define __BUILD_NUM 5
+#define __BUILD_NUM 6
#include <stdver.h>
diff --git a/protocols/VKontakte/src/vk_options.cpp b/protocols/VKontakte/src/vk_options.cpp
index a3addd5943..b82babbaf1 100644
--- a/protocols/VKontakte/src/vk_options.cpp
+++ b/protocols/VKontakte/src/vk_options.cpp
@@ -22,56 +22,34 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
class CVkAccMgrForm : public CVkDlgBase
{
typedef CVkDlgBase CSuper;
-
- CCtrlEdit m_edtLogin;
- CCtrlEdit m_edtPassword;
CCtrlHyperlink m_hlLink;
-
- pass_ptrW m_pwszOldPass;
- ptrW m_pwszOldLogin;
+ CCtrlButton m_btnTokenReq;
public:
CVkAccMgrForm(CVkProto *proto, HWND hwndParent) :
CVkDlgBase(proto, IDD_ACCMGRUI),
- m_edtLogin(this, IDC_LOGIN),
- m_edtPassword(this, IDC_PASSWORD),
+ m_btnTokenReq(this, IDC_TOKENREQ),
m_hlLink(this, IDC_URL, "https://vk.com/")
{
SetParent(hwndParent);
-
- CreateLink(m_edtLogin, "Login", L"");
+ m_btnTokenReq.OnClick = Callback(this, &CVkAccMgrForm::On_btnTokenReq_Click);
}
bool OnInitDialog() override
{
CSuper::OnInitDialog();
-
- m_pwszOldLogin = m_edtLogin.GetText();
- m_edtLogin.SendMsg(EM_LIMITTEXT, 1024, 0);
-
- m_pwszOldPass = m_proto->GetUserStoredPassword();
- m_edtPassword.SetText(m_pwszOldPass);
- m_edtPassword.SendMsg(EM_LIMITTEXT, 1024, 0);
return true;
}
bool OnApply() override
{
- pass_ptrW pwszNewPass(m_edtPassword.GetText());
- bool bPassChanged = mir_wstrcmp(m_pwszOldPass, pwszNewPass) != 0;
- if (bPassChanged) {
- T2Utf szRawPasswd(pwszNewPass);
- m_proto->setString("Password", szRawPasswd);
- pass_ptrA pszPass(szRawPasswd.detach());
- m_pwszOldPass = pwszNewPass.detach();
- }
-
- ptrW pwszNewLogin(m_edtLogin.GetText());
- if (bPassChanged || mir_wstrcmpi(m_pwszOldLogin, pwszNewLogin))
- m_proto->ClearAccessToken();
- m_pwszOldLogin = pwszNewLogin.detach();
return true;
}
+
+ void On_btnTokenReq_Click(CCtrlButton*)
+ {
+ m_proto->LogIn();
+ }
};
MWindow CVkProto::OnCreateAccMgrUI(MWindow hwndParent)
@@ -160,9 +138,6 @@ static vkMarkMsgAsReadMethods[] =
CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto) :
CVkDlgBase(proto, IDD_OPT_MAIN),
- m_edtLogin(this, IDC_LOGIN),
- m_edtPassword(this, IDC_PASSWORD),
- m_hlLink(this, IDC_URL, "https://vk.com/"),
m_edtGroupName(this, IDC_GROUPNAME),
m_cbxVKLang(this, IDC_COMBO_LANGUAGE),
m_cbLoadLastMessageOnMsgWindowsOpen(this, IDC_LASTHISTORYLOAD),
@@ -171,7 +146,6 @@ CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto) :
m_cbxMarkAsRead(this, IDC_COMBO_MARKASREAD),
m_cbxSyncHistory(this, IDC_COMBO_SYNCHISTORY)
{
- CreateLink(m_edtLogin, "Login", L"");
CreateLink(m_edtGroupName, m_proto->m_vkOptions.pwszDefaultGroup);
CreateLink(m_cbLoadLastMessageOnMsgWindowsOpen, m_proto->m_vkOptions.bLoadLastMessageOnMsgWindowsOpen);
CreateLink(m_cbUseLocalTime, m_proto->m_vkOptions.bUseLocalTime);
@@ -180,13 +154,6 @@ CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto) :
bool CVkOptionAccountForm::OnInitDialog()
{
- m_pwszOldLogin = m_edtLogin.GetText();
- m_edtLogin.SendMsg(EM_LIMITTEXT, 1024, 0);
-
- m_pwszOldPass = m_proto->GetUserStoredPassword();
- m_edtPassword.SetText(m_pwszOldPass);
- m_edtPassword.SendMsg(EM_LIMITTEXT, 1024, 0);
-
m_pwszOldGroup = m_edtGroupName.GetText();
int iListIndex = MarkMsgReadOn::markOnRead;
@@ -227,19 +194,6 @@ bool CVkOptionAccountForm::OnApply()
m_pwszOldGroup = pwszGroupName;
}
- pass_ptrW pwszNewPass(m_edtPassword.GetText());
- bool bPassChanged = mir_wstrcmp(m_pwszOldPass, pwszNewPass) != 0;
- if (bPassChanged) {
- T2Utf szRawPasswd(pwszNewPass);
- m_proto->setString("Password", szRawPasswd);
- pass_ptrA pszPass(szRawPasswd.detach());
- m_pwszOldPass = pwszNewPass;
- }
-
- ptrW pwszNewLogin(m_edtLogin.GetText());
- if (bPassChanged || mir_wstrcmpi(m_pwszOldLogin, pwszNewLogin))
- m_proto->ClearAccessToken();
- m_pwszOldLogin = pwszNewLogin;
return true;
}
diff --git a/protocols/VKontakte/src/vk_options.h b/protocols/VKontakte/src/vk_options.h
index 6ef06c66c1..3deab3f976 100644
--- a/protocols/VKontakte/src/vk_options.h
+++ b/protocols/VKontakte/src/vk_options.h
@@ -24,9 +24,6 @@ typedef CProtoDlgBase<CVkProto> CVkDlgBase;
class CVkOptionAccountForm : public CVkDlgBase
{
- CCtrlEdit m_edtLogin;
- CCtrlEdit m_edtPassword;
- CCtrlHyperlink m_hlLink;
CCtrlEdit m_edtGroupName;
CCtrlCombo m_cbxVKLang;
CCtrlCheck m_cbLoadLastMessageOnMsgWindowsOpen;
@@ -35,8 +32,6 @@ class CVkOptionAccountForm : public CVkDlgBase
CCtrlCombo m_cbxSyncHistory;
CCtrlCombo m_cbxMarkAsRead;
- pass_ptrW m_pwszOldPass;
- ptrW m_pwszOldLogin;
ptrW m_pwszOldGroup;
public:
diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h
index a6fa6d1f69..9ad64b825e 100644
--- a/protocols/VKontakte/src/vk_proto.h
+++ b/protocols/VKontakte/src/vk_proto.h
@@ -82,7 +82,6 @@ struct CVkProto : public PROTO<CVkProto>
//==== Events ========================================================================
int __cdecl OnOptionsInit(WPARAM, LPARAM);
- void OnOAuthAuthorize(MHttpResponse*, AsyncHttpRequest*);
void OnReceiveAvatar(MHttpResponse*, AsyncHttpRequest*);
//==== Services ======================================================================
@@ -133,7 +132,6 @@ struct CVkProto : public PROTO<CVkProto>
bool CheckHealthThreads();
void OnTimerTic();
void ClearAccessToken();
- wchar_t* GetUserStoredPassword(void);
void ShowCaptchaInBrowser(HBITMAP hBitmap);
static mir_cs m_csTimer;
@@ -147,6 +145,8 @@ struct CVkProto : public PROTO<CVkProto>
int ForwardMsg(MCONTACT hContact, std::vector<MEVENT> &vForvardEvents, const char* szMsg);
uint8_t GetContactType(MCONTACT hContact);
+ void LogIn(LPCSTR pszUrl = nullptr);
+
private:
VKPeerType GetVKPeerType(VKUserID_t iPeerId);
@@ -377,8 +377,6 @@ private:
JSONNode& CheckJsonResponse(AsyncHttpRequest *pReq, MHttpResponse *reply, JSONNode &root);
bool CheckJsonResult(AsyncHttpRequest *pReq, const JSONNode &Node);
void OnReceiveSmth(MHttpResponse*, AsyncHttpRequest*);
- bool AutoFillForm(char*, CMStringA&, CMStringA&);
- CMStringW RunConfirmationCode(LPCWSTR pwszTitle);
CMStringW RunRenameNick(LPCWSTR pwszOldName);
void GrabCookies(MHttpResponse *nhr, CMStringA szDefDomain = "");
void ApplyCookies(MHttpRequest*);
diff --git a/protocols/VKontakte/src/vk_queue.cpp b/protocols/VKontakte/src/vk_queue.cpp
index d8cd125e2b..13a4556a51 100644
--- a/protocols/VKontakte/src/vk_queue.cpp
+++ b/protocols/VKontakte/src/vk_queue.cpp
@@ -55,7 +55,9 @@ bool CVkProto::ExecuteRequest(AsyncHttpRequest *pReq)
ApplyCookies(pReq);
}
- debugLogA("CVkProto::ExecuteRequest \n====\n%s\n====\n", pReq->m_szUrl.c_str());
+ CMStringA szParam(pReq->m_szParam);
+ szParam.Replace(m_szAccessToken, "*secret*");
+ debugLogA("CVkProto::ExecuteRequest \n====\n%s\n%s\n====\n", pReq->m_szUrl.c_str(), szParam.c_str());
NLHR_PTR reply(Netlib_HttpTransaction(m_hNetlibUser, pReq));
{
mir_cslock lck(m_csWorkThreadTimer);
@@ -112,7 +114,7 @@ bool CVkProto::RestartRequest(AsyncHttpRequest* pReq)
pReq->m_iRetry--;
Push(pReq);
-
+ return true;
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -158,39 +160,8 @@ void CVkProto::WorkerThread(void*)
if (m_szAccessToken != nullptr)
// try to receive a response from server
RetrieveMyInfo();
- else {
- // Initialize new OAuth session
- extern char szBlankUrl[];
- extern char szVKUserAgent[];
-
- AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_GET, "https://oauth.vk.com/authorize", false, &CVkProto::OnOAuthAuthorize);
- pReq
- << INT_PARAM("client_id", VK_APP_ID)
- << CHAR_PARAM("scope", szScore)
- << CHAR_PARAM("redirect_uri", szBlankUrl)
- << CHAR_PARAM("display", "mobile")
- << CHAR_PARAM("response_type", "token")
- << VER_API;
-
- // Headers
- pReq->AddHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7");
- pReq->AddHeader("Accept-language", "ru-RU,ru;q=0.9");
- pReq->AddHeader("dht", "1");
- pReq->AddHeader("origin", "https://oauth.vk.com");
- pReq->AddHeader("referer", "https://oauth.vk.com/");
- pReq->AddHeader("sec-ch-ua-mobile", "?0");
- pReq->AddHeader("sec-ch-ua-platform", "Windows");
- pReq->AddHeader("sec-fetch-dest", "document");
- pReq->AddHeader("sec-fetch-mode", "navigate");
- pReq->AddHeader("sec-fetch-site", "same-site");
- pReq->AddHeader("sec-fetch-user", "?1");
- pReq->AddHeader("upgrade-insecure-requests", "1");
- //Headers
-
- pReq->m_bApiReq = false;
- pReq->bIsMainConn = true;
- Push(pReq);
- }
+ else
+ LogIn();
CloseAPIConnection();
diff --git a/protocols/VKontakte/src/vk_struct.cpp b/protocols/VKontakte/src/vk_struct.cpp
index adbe4d2fb5..a36a53a0d0 100644
--- a/protocols/VKontakte/src/vk_struct.cpp
+++ b/protocols/VKontakte/src/vk_struct.cpp
@@ -58,6 +58,8 @@ AsyncHttpRequest::AsyncHttpRequest(CVkProto *ppro, int iRequestType, LPCSTR _url
m_szUrl = _url;
flags = NLHRF_DUMPASTEXT | NLHRF_HTTP11 | NLHRF_REDIRECT;
+ flags |= VK_NODUMPHEADERS;
+
if (bSecure) {
flags |= NLHRF_SSL;
this << CHAR_PARAM("access_token", ppro->m_szAccessToken);
diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp
index d17f542d4f..ba92c7ff06 100644
--- a/protocols/VKontakte/src/vk_thread.cpp
+++ b/protocols/VKontakte/src/vk_thread.cpp
@@ -21,12 +21,11 @@ UINT_PTR CVkProto::m_Timer;
mir_cs CVkProto::m_csTimer;
char szBlankUrl[] = "https://oauth.vk.com/blank.html";
-char szChallengekUrl[] = "/challenge.html";
char szScore[] = "friends,photos,audio,docs,video,wall,messages,offline,status,notifications,groups";
char szVKTokenBeg[] = "access_token=";
char szVKCookieDomain[] = ".vk.com";
-static char szVKLoginDomain[] = "https://m.vk.com";
+
static char szFieldsName[] = "id, first_name, last_name, photo_100, bdate, sex, timezone, "
"contacts, last_seen, online, status, country, city, relation, interests, activities, "
@@ -207,8 +206,10 @@ void CVkProto::OnLoggedOut()
bool CVkProto::LoadToken(LPCSTR pszUrlSring)
{
LPCSTR p = strstr(pszUrlSring, szVKTokenBeg);
- if (!p)
+ if (!p) {
+ debugLogA("CVkProto::LoadToken error");
return false;
+ }
p += sizeof(szVKTokenBeg) - 1;
for (LPCSTR q = p + 1; *q; q++) {
@@ -221,175 +222,27 @@ bool CVkProto::LoadToken(LPCSTR pszUrlSring)
m_szAccessToken = mir_strdup(p);
setString("AccessToken", m_szAccessToken);
setDword("LastAccessTokenTime", time(0));
+ debugLogA("CVkProto::LoadToken OK");
return true;
}
-void CVkProto::OnOAuthAuthorize(MHttpResponse *reply, AsyncHttpRequest*)
+void CVkProto::LogIn(LPCSTR pszUrl)
{
- debugLogA("CVkProto::OnOAuthAuthorize %d", reply->resultCode);
- GrabCookies(reply, szVKCookieDomain);
-
- if (reply->resultCode == 404 && !m_bErr404Return) {
- m_bErr404Return = true;
- setString("AccessScore", szScore);
- AsyncHttpRequest* pReq = new AsyncHttpRequest(this, REQUEST_GET, "https://oauth.vk.com/authorize", false, &CVkProto::OnOAuthAuthorize);
- pReq
- << INT_PARAM("client_id", VK_APP_ID)
- << CHAR_PARAM("scope", szScore)
- << CHAR_PARAM("redirect_uri", szBlankUrl)
- << CHAR_PARAM("display", "mobile")
- << CHAR_PARAM("response_type", "token")
- << VER_API;
- pReq->m_bApiReq = false;
- pReq->bIsMainConn = true;
- ApplyCookies(pReq);
- Push(pReq);
- return;
- }
-
- if (reply->resultCode == 302) { // manual redirect
- LPCSTR pszLocation = reply->FindHeader("Location");
- if (pszLocation) {
- if (!_strnicmp(pszLocation, szBlankUrl, sizeof(szBlankUrl) - 1)) {
- m_szAccessToken = nullptr;
- LPCSTR p = strstr(pszLocation, szVKTokenBeg);
- if (LoadToken(pszLocation))
- RetrieveMyInfo();
- else
- ConnectionFailed(LOGINERR_NOSERVER);
- return;
-
- }
- else if (!_strnicmp(pszLocation, szChallengekUrl, sizeof(szChallengekUrl) - 1)) {
- CMStringA szTokenReq(
- FORMAT,
- "https://oauth.vk.com/authorize?client_id=%d&scope=%s&redirect_uri=%s&display=mobile&response_type=token&v=%s", VK_APP_ID,
- mir_urlEncode(szScore).c_str(),
- mir_urlEncode(szBlankUrl).c_str(),
- VER_API
- );
-
- CVkTokenForm dlg(this, szTokenReq.c_str());
- if (dlg.DoModal() && LoadToken(dlg.Result))
- RetrieveMyInfo();
- else
- ConnectionFailed(LOGINERR_NOSERVER);
-
- return;
- }
- else {
- AsyncHttpRequest *pRedirectReq = new AsyncHttpRequest();
- pRedirectReq->requestType = REQUEST_GET;
- pRedirectReq->flags = NLHRF_DUMPASTEXT | NLHRF_HTTP11;
- pRedirectReq->m_pFunc = &CVkProto::OnOAuthAuthorize;
- pRedirectReq->AddHeader("Referer", m_szPrevUrl);
- pRedirectReq->Redirect(reply);
- if (!pRedirectReq->m_szUrl.IsEmpty()) {
- if (pRedirectReq->m_szUrl[0] == '/')
- pRedirectReq->m_szUrl = szVKLoginDomain + pRedirectReq->m_szUrl;
- ApplyCookies(pRedirectReq);
- m_szPrevUrl = pRedirectReq->m_szUrl;
- }
-
- pRedirectReq->m_bApiReq = false;
- pRedirectReq->bIsMainConn = true;
- // Headers
- pRedirectReq->AddHeader("dht", "1");
- pRedirectReq->AddHeader("sec-ch-ua-platform", "Windows");
- pRedirectReq->AddHeader("sec-fetch-dest", "document");
- pRedirectReq->AddHeader("sec-fetch-mode", "navigate");
- pRedirectReq->AddHeader("sec-fetch-site", "same-site");
- pRedirectReq->AddHeader("sec-fetch-user", "?1");
- pRedirectReq->AddHeader("upgrade-insecure-requests", "1");
- //Headers
-
- Push(pRedirectReq);
- }
- }
- else
- ConnectionFailed(LOGINERR_NOSERVER);
- return;
- }
-
- if (reply->resultCode == 200 && !IsEmpty(reply->szUrl) && strstr(reply->szUrl, szChallengekUrl)) {
- debugLogA("CVkProto::OnOAuthAuthorize szChallengekUrl");
- CVkTokenForm dlg(this, reply->szUrl);
- if (dlg.DoModal() && LoadToken(dlg.Result))
- RetrieveMyInfo();
- else
- ConnectionFailed(LOGINERR_NOSERVER);
-
- return;
- }
+ debugLogA("CVkProto::LogIn %s", pszUrl ? pszUrl : " ");
+ CMStringA szTokenReq(
+ FORMAT,
+ "https://oauth.vk.com/authorize?client_id=%d&scope=%s&redirect_uri=%s&display=mobile&response_type=token&v=%s",
+ VK_APP_ID,
+ mir_urlEncode(szScore).c_str(),
+ mir_urlEncode(szBlankUrl).c_str(),
+ VER_API
+ );
- if (reply->resultCode != 200 || reply->body.IsEmpty() || (!(strstr(reply->body, "method=\"post\"") || strstr(reply->body, "method=\"POST\"")) && !strstr(reply->body, "meta http-equiv=\"refresh\""))) { // something went wrong
+ CVkTokenForm dlg(this, pszUrl ? pszUrl : szTokenReq.c_str());
+ if (dlg.DoModal() && LoadToken(dlg.Result))
+ RetrieveMyInfo();
+ else
ConnectionFailed(LOGINERR_NOSERVER);
- return;
- }
-
- LPCSTR pBlankUrl = strstr(reply->body, szBlankUrl);
- if (pBlankUrl) {
- debugLogA("CVkProto::OnOAuthAuthorize blank ulr found");
- if (LoadToken(pBlankUrl))
- RetrieveMyInfo();
- else {
- debugLogA("CVkProto::OnOAuthAuthorize blank ulr found, access_token not found");
- ConnectionFailed(LOGINERR_NOSERVER);
- }
- return;
- }
-
- auto *pMsgWarning = strstr(reply->body, "service_msg_warning");
- if (pMsgWarning) {
- auto *p1 = strchr(pMsgWarning, '>');
- auto *p2 = strchr(pMsgWarning, '<');
- if (p1 && p2 && (p1 + 1 < p2)) {
- CMStringA szMsg(p1 + 1, (int)(p2 - p1 - 1));
- MsgPopup(ptrW(mir_utf8decodeW(szMsg)), TranslateT("Service message"), true);
- debugLogA("CVkProto::OnOAuthAuthorize %s", szMsg.c_str());
- }
- ConnectionFailed(LOGINERR_WRONGPASSWORD);
- return;
- }
-
- CMStringA szAction, szBody;
- bool bSuccess = AutoFillForm(reply->body.GetBuffer(), szAction, szBody);
- if (!bSuccess || szAction.IsEmpty() || szBody.IsEmpty()) {
- if (m_bPrevError) {
- ConnectionFailed(LOGINERR_NOSERVER);
- return;
- }
- m_bPrevError = true;
- }
-
- AsyncHttpRequest *pReq = new AsyncHttpRequest();
- pReq->requestType = REQUEST_POST;
- pReq->flags = NLHRF_DUMPASTEXT | NLHRF_HTTP11;
- pReq->m_szParam = szBody;
- pReq->m_szUrl = szAction;
- if (!pReq->m_szUrl.IsEmpty() && pReq->m_szUrl[0] == '/')
- pReq->m_szUrl = szVKLoginDomain + pReq->m_szUrl;
- m_szPrevUrl = pReq->m_szUrl;
- pReq->m_pFunc = &CVkProto::OnOAuthAuthorize;
- pReq->AddHeader("Content-Type", "application/x-www-form-urlencoded");
- pReq->Redirect(reply);
- ApplyCookies(pReq);
- // Headers
-
- pReq->AddHeader("dht", "1");
- pReq->AddHeader("origin", "https://oauth.vk.com");
- pReq->AddHeader("referer", "https://oauth.vk.com/");
-
- pReq->AddHeader("sec-ch-ua-platform", "Windows");
- pReq->AddHeader("sec-fetch-dest", "document");
- pReq->AddHeader("sec-fetch-mode", "navigate");
- pReq->AddHeader("sec-fetch-site", "same-site");
- pReq->AddHeader("sec-fetch-user", "?1");
- pReq->AddHeader("upgrade-insecure-requests", "1");
- //Headers
- pReq->m_bApiReq = false;
- pReq->bIsMainConn = true;
- Push(pReq);
}
/////////////////////////////////////////////////////////////////////////////////////////