Index: res/whatsapp.rc =================================================================== --- res/whatsapp.rc (revision 15410) +++ res/whatsapp.rc (working copy) @@ -84,11 +84,12 @@ CONTROL "Use remote message timestamps", IDC_REMOTE_TIME, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 4, 64, 180, 10 CONTROL "Automatically open group chats",IDC_AUTORUN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,76,180,10 GROUPBOX "Registration",IDC_STATIC,4,92,184,48 - LTEXT "SMS code",IDC_STATIC,8,105,47,10 - EDITTEXT IDC_PW,64,104,20,12,ES_AUTOHSCROLL | ES_NUMBER - CTEXT "-",IDC_STATIC,86,105,8,10 - EDITTEXT IDC_PW2,96,104,20,12,ES_AUTOHSCROLL | ES_NUMBER - PUSHBUTTON "Request code",IDC_BUTTON_REQUEST_CODE,12,120,80,14 + LTEXT "Enter code",IDC_STATIC,8,123,47,10 + EDITTEXT IDC_PW,45,121,20,12,ES_AUTOHSCROLL | ES_NUMBER + CTEXT "-",IDC_STATIC,64,123,8,10 + EDITTEXT IDC_PW2,72,121,20,12,ES_AUTOHSCROLL | ES_NUMBER + PUSHBUTTON "Request SMS code",IDC_BUTTON_REQUEST_SMS_CODE,12,104,80,14 + PUSHBUTTON "Request Voice code",IDC_BUTTON_REQUEST_VOICE_CODE,99,104,80,14 PUSHBUTTON "Register code",IDC_BUTTON_REGISTER,100,120,80,14 END @@ -109,11 +110,12 @@ CONTROL "Use remote message timestamps", IDC_REMOTE_TIME, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 4, 84, 180, 10 CONTROL "Automatically open group chats",IDC_AUTORUN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,96,180,10 GROUPBOX "Registration",IDC_STATIC,4,112,184,48 - LTEXT "SMS code",IDC_STATIC,8,125,47,10 - EDITTEXT IDC_PW,64,124,20,12,ES_AUTOHSCROLL | ES_NUMBER - CTEXT "-",IDC_STATIC,86,125,8,10 - EDITTEXT IDC_PW2,96,124,20,12,ES_AUTOHSCROLL | ES_NUMBER - PUSHBUTTON "Request code",IDC_BUTTON_REQUEST_CODE,12,140,80,14 + LTEXT "Enter code",IDC_STATIC,8,143,47,10 + EDITTEXT IDC_PW,45,141,20,12,ES_AUTOHSCROLL | ES_NUMBER + CTEXT "-",IDC_STATIC,64,143,8,10 + EDITTEXT IDC_PW2,72,141,20,12,ES_AUTOHSCROLL | ES_NUMBER + PUSHBUTTON "Request SMS code",IDC_BUTTON_REQUEST_SMS_CODE,12,124,80,14 + PUSHBUTTON "Request Voice code",IDC_BUTTON_REQUEST_VOICE_CODE,100,124,80,14 PUSHBUTTON "Register code",IDC_BUTTON_REGISTER,100,140,80,14 END Index: src/constants.h =================================================================== --- src/constants.h (revision 15410) +++ src/constants.h (working copy) @@ -25,11 +25,8 @@ // WhatsApp #define WHATSAPP_LOGIN_SERVER "c.whatsapp.net" #define ACCOUNT_USER_AGENT "WhatsApp/2.12.89 S40Version/14.26 Device/Nokia302" -#define ACCOUNT_URL_CODEREQUEST "https://r.whatsapp.net/v1/code.php" #define ACCOUNT_URL_CODEREQUESTV2 "https://v.whatsapp.net/v2/code" -#define ACCOUNT_URL_REGISTERREQUEST "https://r.whatsapp.net/v1/register.php" #define ACCOUNT_URL_REGISTERREQUESTV2 "https://v.whatsapp.net/v2/register" -#define ACCOUNT_URL_UPLOADREQUEST "https://mms.whatsapp.net/client/iphone/upload.php" #define ACCOUNT_URL_EXISTSV2 "https://v.whatsapp.net/v2/exist" // WhatsApp Nokia 302 S40 Index: src/db.h =================================================================== --- src/db.h (revision 15410) +++ src/db.h (working copy) @@ -4,7 +4,6 @@ #define WHATSAPP_KEY_CC "CountryCode" #define WHATSAPP_KEY_NICK "Nick" #define WHATSAPP_KEY_PASS "Password" -#define WHATSAPP_KEY_IDX "DeviceID" #define WHATSAPP_KEY_MAP_STATUSES "MapStatuses" #define WHATSAPP_KEY_LOGGING_ENABLE "LoggingEnable" #define WHATSAPP_KEY_NAME "RealName" Index: src/dialogs.cpp =================================================================== --- src/dialogs.cpp (revision 15410) +++ src/dialogs.cpp (working copy) @@ -1,6 +1,7 @@ #include "common.h" #define szAskSendSms LPGEN("An SMS with registration code will be sent to your mobile phone.\nNotice that you are not able to use the real WhatsApp and this plugin simultaneously!\nContinue?") +#define szAskCall LPGEN("A call with registration code will be made to your mobile phone.\nNotice that you are not able to use the real WhatsApp and this plugin simultaneously!\nContinue?") #define szPasswordSet LPGEN("Your password has been set automatically. You can proceed with login now") class COptionsDlg : public CProtoDlgBase @@ -7,7 +8,7 @@ { CCtrlEdit m_pw1, m_pw2, m_cc, m_login, m_nick, m_group; CCtrlCheck m_ssl, m_autorun, m_remoteTime; - CCtrlButton m_request, m_register; + CCtrlButton m_requestSMS, m_requestVoice, m_register; public: COptionsDlg(WhatsAppProto *pThis, int dlgId) : @@ -21,7 +22,8 @@ m_group(this, IDC_DEFGROUP), m_login(this, IDC_LOGIN), m_autorun(this, IDC_AUTORUN), - m_request(this, IDC_BUTTON_REQUEST_CODE), + m_requestSMS(this, IDC_BUTTON_REQUEST_SMS_CODE), + m_requestVoice(this, IDC_BUTTON_REQUEST_VOICE_CODE), m_register(this, IDC_BUTTON_REGISTER) { CreateLink(m_ssl, WHATSAPP_KEY_SSL, DBVT_BYTE, false); @@ -33,7 +35,8 @@ CreateLink(m_login, WHATSAPP_KEY_LOGIN, _T("")); CreateLink(m_group, WHATSAPP_KEY_DEF_GROUP, _T("")); - m_request.OnClick = Callback(this, &COptionsDlg::OnRequestClick); + m_requestSMS.OnClick = Callback(this, &COptionsDlg::OnRequestSMSClick); + m_requestVoice.OnClick = Callback(this, &COptionsDlg::OnRequestVoiceClick); m_register.OnClick = Callback(this, &COptionsDlg::OnRegisterClick); } @@ -46,14 +49,14 @@ m_pw2.Enable(bEnable); } - void OnRequestClick(CCtrlButton*) + void OnRequestVoiceClick(CCtrlButton*) { - if (IDYES != MessageBox(GetHwnd(), TranslateT(szAskSendSms), PRODUCT_NAME, MB_YESNO)) + if (IDYES != MessageBox(GetHwnd(), TranslateT(szAskCall), PRODUCT_NAME, MB_YESNO)) return; ptrA cc(m_cc.GetTextA()), number(m_login.GetTextA()); string password; - if (m_proto->Register(REG_STATE_REQ_CODE, string(cc), string(number), string(), password)) { + if (m_proto->Register(REG_STATE_REQ_CODE, string(cc), string(number), "voice", password)) { if (!password.empty()) { MessageBox(GetHwnd(), TranslateT(szPasswordSet), PRODUCT_NAME, MB_ICONWARNING); m_proto->setString(WHATSAPP_KEY_PASS, password.c_str()); @@ -67,10 +70,31 @@ } } + void OnRequestSMSClick(CCtrlButton*) + { + if (IDYES != MessageBox(GetHwnd(), TranslateT(szAskSendSms), PRODUCT_NAME, MB_YESNO)) + return; + + ptrA cc(m_cc.GetTextA()), number(m_login.GetTextA()); + string password; + if (m_proto->Register(REG_STATE_REQ_CODE, string(cc), string(number), "sms", password)) { + if (!password.empty()) { + MessageBox(GetHwnd(), TranslateT(szPasswordSet), PRODUCT_NAME, MB_ICONWARNING); + m_proto->setString(WHATSAPP_KEY_PASS, password.c_str()); + } + else { + // unblock sms code entry field + m_pw1.Enable(); + m_pw2.Enable(); + m_proto->setByte("CodeRequestDone", 1); + } + } + } + void OnRegisterClick(CCtrlButton*) { if (GetWindowTextLength(m_pw1.GetHwnd()) != 3 || GetWindowTextLength(m_pw2.GetHwnd()) != 3) - MessageBox(GetHwnd(), TranslateT("Please correctly specify your registration code received by SMS"), PRODUCT_NAME, MB_ICONEXCLAMATION); + MessageBox(GetHwnd(), TranslateT("Please correctly specify your registration code received by SMS/Voice"), PRODUCT_NAME, MB_ICONEXCLAMATION); else { char code[10]; GetWindowTextA(m_pw1.GetHwnd(), code, 4); Index: src/proto.cpp =================================================================== --- src/proto.cpp (revision 15410) +++ src/proto.cpp (working copy) @@ -222,28 +222,11 @@ bool WhatsAppProto::Register(int state, const string &cc, const string &number, const string &code, string &ret) { - string idx; - DBVARIANT dbv; - if (WASocketConnection::hNetlibUser == NULL) { NotifyEvent(m_tszUserName, TranslateT("Network connection error."), NULL, WHATSAPP_EVENT_CLIENT); return false; } - if (!getString(WHATSAPP_KEY_IDX, &dbv)) { - idx = dbv.pszVal; - db_free(&dbv); - } - - if (idx.empty()) { - std::stringstream tm; - tm << time(NULL); - BYTE idxBuf[16]; - utils::md5string(tm.str(), idxBuf); - idx = std::string((const char*)idxBuf, 16); - setString(WHATSAPP_KEY_IDX, idx.c_str()); - } - CMStringA url = WARegister::RequestCodeUrl(cc + number, code); if (url.IsEmpty()) return false; @@ -278,8 +261,10 @@ std::string reason = resp["reason"].as_string(); if (reason == "stale") NotifyEvent(ptszTitle, TranslateT("Registration failed due to stale code. Please request a new code"), NULL, WHATSAPP_EVENT_CLIENT); - else - NotifyEvent(ptszTitle, TranslateT("Registration failed."), NULL, WHATSAPP_EVENT_CLIENT); + else { + CMString tmp(FORMAT, TranslateT("Registration failed. Reason: %s"), reason.c_str()); + NotifyEvent(ptszTitle, tmp, NULL, WHATSAPP_EVENT_CLIENT); + } const JSONNode &tmpVal = resp["retry_after"]; if (tmpVal) { Index: src/resource.h =================================================================== --- src/resource.h (revision 15410) +++ src/resource.h (working copy) @@ -1,6 +1,6 @@ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. -// Used by d:\miranda-ng\protocols\WhatsApp\res\whatsapp.rc +// Used by D:\Desktop\miranda\protocols\WhatsApp\res\whatsapp.rc // #define IDD_INPUTBOX 102 #define IDR_REGISTERUTILITY 103 @@ -16,7 +16,7 @@ #define IDC_PW 1004 #define IDC_SSL 1005 #define IDC_NICK 1006 -#define IDC_BUTTON_REQUEST_CODE 1007 +#define IDC_BUTTON_REQUEST_SMS_CODE 1007 #define IDC_BUTTON_REGISTER 1008 #define IDC_CC 1009 #define IDC_VALUE 1010 @@ -29,14 +29,15 @@ #define IDC_AUTORUN 1016 #define IDC_DEFGROUP 1017 #define IDC_REMOTE_TIME 1018 +#define IDC_BUTTON_REQUEST_VOICE_CODE 1019 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 106 +#define _APS_NEXT_RESOURCE_VALUE 107 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1019 +#define _APS_NEXT_CONTROL_VALUE 1020 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif Index: src/WhatsAPI++/WARegister.cpp =================================================================== --- src/WhatsAPI++/WARegister.cpp (revision 15410) +++ src/WhatsAPI++/WARegister.cpp (working copy) @@ -27,7 +27,6 @@ ///////////////////////////////////////////////////////////////////////////////////////// // Account registration - CMStringA WARegister::RequestCodeUrl(const std::string &phoneNumber, const std::string &code) { try { @@ -38,11 +37,11 @@ const char *n = pn.Number.c_str(); - if (!code.empty()) + if (!code.empty() && code != "voice" && code != "sms") return CMStringA(FORMAT, "https://v.whatsapp.net/v2/register?cc=%d&in=%s&id=%s&code=%s", pn.countryCode, n, id.c_str(), code.c_str()); - return CMStringA(FORMAT, "https://v.whatsapp.net/v2/code?cc=%d&in=%s&to=%d%s&method=sms&mcc=%03d&mnc=%03d&token=%s&id=%s&lg=%s&lc=%s", - pn.countryCode, n, pn.countryCode, n, pn.mcc, pn.mnc, token.c_str(), id.c_str(), pn.ISO639, pn.ISO3166); + return CMStringA(FORMAT, "https://v.whatsapp.net/v2/code?cc=%d&in=%s&to=%d%s&method=%s&mcc=%03d&mnc=%03d&token=%s&id=%s&lg=%s&lc=%s", + pn.countryCode, n, pn.countryCode, n, code.c_str(), pn.mcc, pn.mnc, token.c_str(), id.c_str(), pn.ISO639, pn.ISO3166); } catch (...) {} @@ -50,6 +49,7 @@ return CMStringA(); } + std::string WARegister::GenerateIdentity(const std::string &phone) { std::string id = phone;