diff options
-rw-r--r-- | protocols/VKontakte/res/resource.rc | 21 | ||||
-rw-r--r-- | protocols/VKontakte/src/misc.cpp | 2 | ||||
-rw-r--r-- | protocols/VKontakte/src/resource.h | 10 | ||||
-rw-r--r-- | protocols/VKontakte/src/version.h | 4 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_dialogs.cpp | 62 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_dialogs.h | 25 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_proto.h | 1 | ||||
-rw-r--r-- | protocols/VKontakte/src/vk_thread.cpp | 71 |
8 files changed, 164 insertions, 32 deletions
diff --git a/protocols/VKontakte/res/resource.rc b/protocols/VKontakte/res/resource.rc index 2fba44b44d..1cd05feab3 100644 --- a/protocols/VKontakte/res/resource.rc +++ b/protocols/VKontakte/res/resource.rc @@ -143,6 +143,14 @@ BEGIN TOPMARGIN, 7
BOTTOMMARGIN, 257
END
+
+ IDD_TOKENFORM, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 255
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 148
+ END
END
#endif // APSTUDIO_INVOKED
@@ -376,6 +384,19 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,160,243,50,14
END
+IDD_TOKENFORM DIALOGEX 0, 0, 263, 155
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Dialog"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,146,134,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,197,134,50,14
+ EDITTEXT IDC_TOKENVAL,15,83,231,47,ES_MULTILINE | ES_AUTOHSCROLL | WS_HSCROLL
+ PUSHBUTTON "Token Request",IDC_TOKENREQ,16,134,88,14
+ LTEXT "Instruction:",IDC_STATIC,15,7,228,9
+ EDITTEXT IDC_INSTRUCTION,15,20,233,56,ES_MULTILINE | ES_READONLY | NOT WS_BORDER
+END
+
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp index 35780ca621..9c1d86ed89 100644 --- a/protocols/VKontakte/src/misc.cpp +++ b/protocols/VKontakte/src/misc.cpp @@ -594,6 +594,8 @@ CMStringW CVkProto::RunRenameNick(LPCWSTR pwszOldName) void CVkProto::GrabCookies(MHttpResponse *nhr, CMStringA szDefDomain)
{
debugLogA("CVkProto::GrabCookies");
+ if (!nhr)
+ return;
for (auto &hdr : *nhr) {
if (_stricmp(hdr->szName, "Set-cookie"))
diff --git a/protocols/VKontakte/src/resource.h b/protocols/VKontakte/src/resource.h index b80d89af36..2910a8dc08 100644 --- a/protocols/VKontakte/src/resource.h +++ b/protocols/VKontakte/src/resource.h @@ -1,6 +1,6 @@ //{{NO_DEPENDENCIES}}
// Включаемый файл, созданный в Microsoft Visual C++.
-// Используется e:\github\miranda-ng\protocols\VKontakte\res\resource.rc
+// Используется E:\github\miranda-ng\protocols\VKontakte\res\resource.rc
//
#define IDOPENBROWSER 3
#define IDD_ACCMGRUI 101
@@ -27,6 +27,7 @@ #define IDD_VKUSERFORM 124
#define IDI_FORWARD 126
#define IDI_RELOADMESSAGE 130
+#define IDD_TOKENFORM 131
#define IDC_LOGIN 1001
#define IDC_PASSWORD 1002
#define IDC_URL 1003
@@ -132,15 +133,16 @@ #define IDC_STATIC_MESSAGE 1120
#define IDC_ADD_ORIG_VER_IN_EDITED_MES 1122
#define IDC_IMG_300 1123
-
+#define IDC_TOKENVAL 1124
+#define IDC_TOKENREQ 1125
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
-#define _APS_NEXT_RESOURCE_VALUE 131
+#define _APS_NEXT_RESOURCE_VALUE 132
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1124
+#define _APS_NEXT_CONTROL_VALUE 1126
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h index 7dd0a47a50..d1a08f58e6 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 17
-#define __BUILD_NUM 6
+#define __RELEASE_NUM 18
+#define __BUILD_NUM 0
#include <stdver.h>
diff --git a/protocols/VKontakte/src/vk_dialogs.cpp b/protocols/VKontakte/src/vk_dialogs.cpp index b03687c33d..7f6ca6e2ec 100644 --- a/protocols/VKontakte/src/vk_dialogs.cpp +++ b/protocols/VKontakte/src/vk_dialogs.cpp @@ -98,8 +98,70 @@ void CVkCaptchaForm::On_btnOpenInBrowser_Click(CCtrlButton*) void CVkCaptchaForm::On_edtValue_Change(CCtrlEdit*)
{
m_btnOk.Enable(!IsEmpty(ptrA(m_edtValue.GetTextA())));
+
+}
+
+////////////////////////////////// IDD_TOKENFORM //////////////////////////////////////////
+CVkTokenForm::CVkTokenForm(CVkProto* proto, CMStringA& _szTokenReq) :
+ CVkDlgBase(proto, IDD_TOKENFORM),
+ m_instruction(this, IDC_INSTRUCTION),
+ m_edtValue(this, IDC_TOKENVAL),
+ m_btnTokenReq(this, IDC_TOKENREQ),
+ m_btnOk(this, IDOK),
+ m_TokenReq(_szTokenReq)
+{
+ m_btnTokenReq.OnClick = Callback(this, &CVkTokenForm::On_btnTokenReq_Click);
+ m_edtValue.OnChange = Callback(this, &CVkTokenForm::On_edtValue_Change);
+ m_szAccName = proto->m_szModuleName;
}
+bool CVkTokenForm::OnInitDialog()
+{
+ Window_SetIcon_IcoLib(m_hwnd, Skin_GetIconHandle(SKINICON_OTHER_KEYS));
+
+ CMStringW wszCaption(Translate("Logon for "));
+ wszCaption += m_szAccName;
+
+ SetCaption(wszCaption.c_str());
+
+ m_btnOk.Disable();
+ if (!m_TokenReq.IsEmpty()) {
+ m_instruction.SetText(TranslateT("For logon to protocol VK, you need to authorize in the browser and copy the received address from its address bar in the field below.\nDo not change anything when copying!\nYou will have to ignore the anti - copy message that you will see in your browser.Unfortunately, Miranda NG cannot authorize you in any other way right now."));
+ Utils_OpenUrl(m_TokenReq.c_str());
+ return true;
+ }
+
+ return false;
+}
+
+void CVkTokenForm::OnDestroy()
+{
+ Window_FreeIcon_IcoLib(m_hwnd);
+}
+
+bool CVkTokenForm::OnApply()
+{
+ m_edtValue.GetTextA(Result, _countof(Result));
+ return true;
+}
+
+void CVkTokenForm::On_edtValue_Change(CCtrlEdit*)
+{
+ extern char szVKTokenBeg[];
+ ptrA pszUrlSring(m_edtValue.GetTextA());
+
+ if (!IsEmpty(pszUrlSring) && strstr(pszUrlSring, szVKTokenBeg))
+ m_btnOk.Enable();
+ else
+ m_btnOk.Disable();
+}
+
+void CVkTokenForm::On_btnTokenReq_Click(CCtrlButton*)
+{
+ Utils_OpenUrl(m_TokenReq.c_str());
+}
+
+
////////////////////////////////// IDD_WALLPOST ///////////////////////////////////////////
CVkWallPostForm::CVkWallPostForm(CVkProto *proto, WALLPOST_FORM_PARAMS *param) :
diff --git a/protocols/VKontakte/src/vk_dialogs.h b/protocols/VKontakte/src/vk_dialogs.h index 81d7f8d857..139a33c5e5 100644 --- a/protocols/VKontakte/src/vk_dialogs.h +++ b/protocols/VKontakte/src/vk_dialogs.h @@ -51,6 +51,31 @@ public: };
+////////////////////////////////// IDD_TOKENFORM ////////////////////////////////////////
+
+class CVkTokenForm : public CVkDlgBase
+{
+ CCtrlData m_instruction;
+ CCtrlEdit m_edtValue;
+ CCtrlButton m_btnTokenReq;
+ CCtrlButton m_btnOk;
+ CMStringA m_TokenReq;
+ CMStringA m_szAccName;
+
+public:
+ CVkTokenForm(CVkProto* proto, CMStringA& _szTokenReq);
+
+ bool OnInitDialog() override;
+ bool OnApply() override;
+ void OnDestroy() override;
+
+ void On_btnTokenReq_Click(CCtrlButton*);
+ void On_edtValue_Change(CCtrlEdit*);
+
+ char Result[4096];
+
+};
+
////////////////////////////////// IDD_WALLPOST ///////////////////////////////////////////
struct WALLPOST_FORM_PARAMS
diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h index ba47fe21e8..c9eeed0bf1 100644 --- a/protocols/VKontakte/src/vk_proto.h +++ b/protocols/VKontakte/src/vk_proto.h @@ -425,6 +425,7 @@ private: void CloseAPIConnection(bool bShutdown = false);
void OnLoggedOut();
void ShutdownSession();
+ bool LoadToken(LPCSTR pszUrlSring);
void SetAvatarUrl(MCONTACT hContact, CMStringW &wszUrl);
void GetAvatarFileName(MCONTACT hContact, wchar_t *pwszDest, size_t cbLen);
void ReloadAvatarInfo(MCONTACT hContact);
diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp index 951d64bd8a..c527e5d472 100644 --- a/protocols/VKontakte/src/vk_thread.cpp +++ b/protocols/VKontakte/src/vk_thread.cpp @@ -21,10 +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 szVKUserAgent[] = "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko";
+char szVKTokenBeg[] = "access_token=";
-static char szVKTokenBeg[] = "access_token=";
static char szVKLoginDomain[] = "https://m.vk.com";
static char szVKCookieDomain[] = ".vk.com";
static char szFieldsName[] = "id, first_name, last_name, photo_100, bdate, sex, timezone, "
@@ -203,6 +204,27 @@ void CVkProto::OnLoggedOut() /////////////////////////////////////////////////////////////////////////////////////////
+bool CVkProto::LoadToken(LPCSTR pszUrlSring)
+{
+ m_szAccessToken = nullptr;
+ LPCSTR p = strstr(pszUrlSring, szVKTokenBeg);
+ if (!p)
+ return false;
+
+ p += sizeof(szVKTokenBeg) - 1;
+ for (LPCSTR q = p + 1; *q; q++) {
+ if (*q == '&' || *q == '=' || *q == '\"') {
+ m_szAccessToken = mir_strndup(p, q - p);
+ break;
+ }
+ }
+ if (m_szAccessToken == nullptr)
+ m_szAccessToken = mir_strdup(p);
+ setString("AccessToken", m_szAccessToken);
+
+ return true;
+}
+
void CVkProto::OnOAuthAuthorize(MHttpResponse *reply, AsyncHttpRequest*)
{
debugLogA("CVkProto::OnOAuthAuthorize %d", reply->resultCode);
@@ -233,21 +255,29 @@ void CVkProto::OnOAuthAuthorize(MHttpResponse *reply, AsyncHttpRequest*) if (!_strnicmp(pszLocation, szBlankUrl, sizeof(szBlankUrl) - 1)) {
m_szAccessToken = nullptr;
LPCSTR p = strstr(pszLocation, szVKTokenBeg);
- if (p) {
- p += sizeof(szVKTokenBeg) - 1;
- for (LPCSTR q = p + 1; *q; q++) {
- if (*q == '&' || *q == '=' || *q == '\"') {
- m_szAccessToken = mir_strndup(p, q - p);
- break;
- }
- }
- if (m_szAccessToken == nullptr)
- m_szAccessToken = mir_strdup(p);
- setString("AccessToken", m_szAccessToken);
+ 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);
+ if (dlg.DoModal() && LoadToken(dlg.Result))
RetrieveMyInfo();
- }
else
ConnectionFailed(LOGINERR_NOSERVER);
+
+ return;
}
else {
AsyncHttpRequest *pRedirectReq = new AsyncHttpRequest();
@@ -292,19 +322,8 @@ void CVkProto::OnOAuthAuthorize(MHttpResponse *reply, AsyncHttpRequest*) LPCSTR pBlankUrl = strstr(reply->body, szBlankUrl);
if (pBlankUrl) {
debugLogA("CVkProto::OnOAuthAuthorize blank ulr found");
- m_szAccessToken = nullptr;
- LPCSTR p = strstr(pBlankUrl, szVKTokenBeg);
- if (p) {
- p += sizeof(szVKTokenBeg) - 1;
- for (LPCSTR q = p + 1; *q; q++) {
- if (*q == '&' || *q == '=' || *q == '\"') {
- m_szAccessToken = mir_strndup(p, q - p);
- break;
- }
- }
- setString("AccessToken", m_szAccessToken);
- RetrieveMyInfo();
- }
+ if (LoadToken(pBlankUrl))
+ RetrieveMyInfo();
else {
debugLogA("CVkProto::OnOAuthAuthorize blank ulr found, access_token not found");
ConnectionFailed(LOGINERR_NOSERVER);
|