diff options
author | George Hazan <ghazan@miranda.im> | 2018-12-30 20:25:07 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2018-12-30 20:25:07 +0300 |
commit | 69a81a736bfbb2a215a6c56ad83977d5753b2c6d (patch) | |
tree | 4be65a73a127037c1c2f02371d7e752fff5d3871 | |
parent | f6e89cd758c1df231b478c4f530af6216f991858 (diff) |
ICQ10:
- fixes #1699 (after password change Miranda cannot login to ICQ until restart);
- code cleaning
-rw-r--r-- | protocols/Icq10/src/http.cpp | 2 | ||||
-rw-r--r-- | protocols/Icq10/src/main.cpp | 2 | ||||
-rw-r--r-- | protocols/Icq10/src/options.cpp | 12 | ||||
-rw-r--r-- | protocols/Icq10/src/proto.cpp | 10 | ||||
-rw-r--r-- | protocols/Icq10/src/server.cpp | 24 | ||||
-rw-r--r-- | protocols/Icq10/src/stdafx.h | 6 | ||||
-rw-r--r-- | protocols/Icq10/src/utils.cpp | 4 |
7 files changed, 39 insertions, 21 deletions
diff --git a/protocols/Icq10/src/http.cpp b/protocols/Icq10/src/http.cpp index 0d66a3ae71..5590ddc596 100644 --- a/protocols/Icq10/src/http.cpp +++ b/protocols/Icq10/src/http.cpp @@ -141,7 +141,7 @@ void CIcqProto::ExecuteRequest(AsyncHttpRequest *pReq) if (r.error() == 40201) { // robust token expired CMStringA oldToken = m_szRToken; m_szRToken.Empty(); - delSetting("RToken"); + delSetting(DB_KEY_RTOKEN); // if token refresh succeeded, replace it in the query and push request back if (RefreshRobustToken()) { diff --git a/protocols/Icq10/src/main.cpp b/protocols/Icq10/src/main.cpp index ae2c297a62..6259a91a72 100644 --- a/protocols/Icq10/src/main.cpp +++ b/protocols/Icq10/src/main.cpp @@ -39,7 +39,7 @@ static PLUGININFOEX pluginInfoEx = { CMPlugin::CMPlugin() : ACCPROTOPLUGIN<CIcqProto>(MODULENAME, pluginInfoEx) { - SetUniqueId("UIN"); + SetUniqueId(DB_KEY_UIN); } ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/protocols/Icq10/src/options.cpp b/protocols/Icq10/src/options.cpp index e4d09dcc12..2d0445f1a8 100644 --- a/protocols/Icq10/src/options.cpp +++ b/protocols/Icq10/src/options.cpp @@ -24,6 +24,7 @@ class CIcqOptionsDlg : public CProtoDlgBase<CIcqProto> { CCtrlEdit edtUin, edtPassword; CCtrlCheck chkSlowSend; + CMStringW wszOldPass; public: CIcqOptionsDlg(CIcqProto *ppro, int iDlgID, bool bFullDlg) : @@ -37,6 +38,17 @@ public: if (bFullDlg) CreateLink(chkSlowSend, ppro->m_bSlowSend); + + wszOldPass = ppro->m_szPassword; + } + + bool OnApply() override + { + if (wszOldPass != ptrW(edtPassword.GetText())) { + m_proto->delSetting(DB_KEY_ATOKEN); + m_proto->delSetting(DB_KEY_SESSIONKEY); + } + return true; } }; diff --git a/protocols/Icq10/src/proto.cpp b/protocols/Icq10/src/proto.cpp index 6509759872..6d26bfdd40 100644 --- a/protocols/Icq10/src/proto.cpp +++ b/protocols/Icq10/src/proto.cpp @@ -39,7 +39,7 @@ CIcqProto::CIcqProto(const char* aProtoName, const wchar_t* aUserName) : m_arOwnIds(1), m_arCache(20, NumericKeySortT), m_evRequestsQueue(CreateEvent(nullptr, FALSE, FALSE, nullptr)), - m_dwUin(this, "UIN", 0), + m_dwUin(this, DB_KEY_UIN, 0), m_szPassword(this, "Password"), m_bSlowSend(this, "SlowSend", false) { @@ -83,7 +83,7 @@ void CIcqProto::OnShutdown() void CIcqProto::OnContactDeleted(MCONTACT hContact) { - DWORD dwUin = getDword(hContact, "UIN"); + DWORD dwUin = getDword(hContact, DB_KEY_UIN); m_arCache.remove(FindContactByUIN(dwUin)); auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, ICQ_API_SERVER "/buddylist/removeBuddy"); @@ -150,7 +150,7 @@ int CIcqProto::AuthRequest(MCONTACT hContact, const wchar_t* szMessage) { auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_POST, ICQ_API_SERVER "/buddylist/addBuddy", &CIcqProto::OnAddBuddy); pReq << CHAR_PARAM("f", "json") << CHAR_PARAM("aimsid", m_aimsid) << CHAR_PARAM("r", pReq->m_reqId) << WCHAR_PARAM("authorizationMsg", szMessage) - << INT_PARAM("buddy", getDword(hContact, "UIN")) << CHAR_PARAM("group", "General") << INT_PARAM("preAuthorized", 1); + << INT_PARAM("buddy", getDword(hContact, DB_KEY_UIN)) << CHAR_PARAM("group", "General") << INT_PARAM("preAuthorized", 1); pReq->flags |= NLHRF_NODUMPSEND; pReq->pUserInfo = (void*)hContact; Push(pReq); @@ -279,7 +279,7 @@ void __cdecl CIcqProto::SendAckThread(void *p) int CIcqProto::SendMsg(MCONTACT hContact, int, const char *pszSrc) { - DWORD dwUin = getDword(hContact, "UIN"); + DWORD dwUin = getDword(hContact, DB_KEY_UIN); if (dwUin == 0) return 0; @@ -379,7 +379,7 @@ int CIcqProto::UserIsTyping(MCONTACT hContact, int type) auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, ICQ_API_SERVER "/im/setTyping"); pReq->flags |= NLHRF_NODUMPSEND; pReq << CHAR_PARAM("f", "json") << CHAR_PARAM("aimsid", m_aimsid) << CHAR_PARAM("f", "json") - << INT_PARAM("t", getDword(hContact, "UIN")) << CHAR_PARAM("r", pReq->m_reqId) + << INT_PARAM("t", getDword(hContact, DB_KEY_UIN)) << CHAR_PARAM("r", pReq->m_reqId) << CHAR_PARAM("typingStatus", (type == PROTOTYPE_SELFTYPING_ON) ? "typing" : "typed"); Push(pReq); return 0; diff --git a/protocols/Icq10/src/server.cpp b/protocols/Icq10/src/server.cpp index 4b2fea9689..05b6b6cf31 100644 --- a/protocols/Icq10/src/server.cpp +++ b/protocols/Icq10/src/server.cpp @@ -52,10 +52,10 @@ void CIcqProto::CheckPassword() char mirVer[100]; Miranda_GetVersionText(mirVer, _countof(mirVer)); - m_szAToken = getMStringA("AToken"); - m_szRToken = getMStringA("RToken"); - m_iRClientId = getDword("RClientID"); - m_szSessionKey = getMStringA("SessionKey"); + m_szAToken = getMStringA(DB_KEY_ATOKEN); + m_szRToken = getMStringA(DB_KEY_RTOKEN); + m_iRClientId = getDword(DB_KEY_RCLIENTID); + m_szSessionKey = getMStringA(DB_KEY_SESSIONKEY); if (m_szAToken.IsEmpty() || m_szSessionKey.IsEmpty()) { auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_POST, "https://api.login.icq.net/auth/clientLogin", &CIcqProto::OnCheckPassword); pReq << CHAR_PARAM("clientName", "Miranda NG") << CHAR_PARAM("clientVersion", mirVer) << CHAR_PARAM("devId", ICQ_APP_ID) @@ -162,7 +162,7 @@ bool CIcqProto::RefreshRobustToken() if (result.error() == 20000) { const JSONNode &results = result.results(); m_szRToken = results["authToken"].as_mstring(); - setString("RToken", m_szRToken); + setString(DB_KEY_RTOKEN, m_szRToken); // now add this token auto *add = new AsyncHttpRequest(CONN_RAPI, REQUEST_POST, ICQ_ROBUST_SERVER, &CIcqProto::OnAddClient); @@ -186,7 +186,7 @@ void CIcqProto::RetrieveUserInfo(MCONTACT hContact) auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, ICQ_API_SERVER "/presence/get", &CIcqProto::OnGetUserInfo); pReq->flags |= NLHRF_NODUMPSEND; pReq->pUserInfo = (void*)hContact; - pReq << CHAR_PARAM("f", "json") << CHAR_PARAM("aimsid", m_aimsid) << INT_PARAM("mdir", 1) << INT_PARAM("t", getDword(hContact, "UIN")); + pReq << CHAR_PARAM("f", "json") << CHAR_PARAM("aimsid", m_aimsid) << INT_PARAM("mdir", 1) << INT_PARAM("t", getDword(hContact, DB_KEY_UIN)); Push(pReq); } @@ -276,7 +276,7 @@ void CIcqProto::OnAddBuddy(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq) JsonReply root(pReply); if (root.error() == 200) { - RetrieveUserInfo(getDword(hContact, "UIN")); + RetrieveUserInfo(getDword(hContact, DB_KEY_UIN)); db_unset(hContact, "CList", "NotOnList"); } } @@ -293,7 +293,7 @@ void CIcqProto::OnAddClient(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq) const JSONNode &results = reply.results(); m_iRClientId = results["clientId"].as_int(); - setDword("RClientID", m_iRClientId); + setDword(DB_KEY_RCLIENTID, m_iRClientId); *pRet = true; } @@ -317,7 +317,7 @@ void CIcqProto::OnCheckPassword(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*) JSONNode &data = root.data(); m_szAToken = data["token"]["a"].as_mstring(); m_szAToken = ptrA(mir_urlDecode(m_szAToken)); - setString("AToken", m_szAToken); + setString(DB_KEY_ATOKEN, m_szAToken); CMStringA szSessionSecret = data["sessionSecret"].as_mstring(); CMStringA szPassTemp = m_szPassword; @@ -326,7 +326,7 @@ void CIcqProto::OnCheckPassword(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*) BYTE hashOut[MIR_SHA256_HASH_SIZE]; HMAC(EVP_sha256(), szPassTemp, szPassTemp.GetLength(), (BYTE*)szSessionSecret.c_str(), szSessionSecret.GetLength(), hashOut, &len); m_szSessionKey = ptrA(mir_base64_encode(hashOut, sizeof(hashOut))); - setString("SessionKey", m_szSessionKey); + setString(DB_KEY_SESSIONKEY, m_szSessionKey); CMStringA szUin = data["loginId"].as_mstring(); if (szUin) @@ -361,8 +361,8 @@ void CIcqProto::OnStartSession(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*) case 401: if (root.detail() == 1002) { // session expired - delSetting("AToken"); - delSetting("SessionKey"); + delSetting(DB_KEY_ATOKEN); + delSetting(DB_KEY_SESSIONKEY); CheckPassword(); } else ConnectionFailed(LOGINERR_WRONGPASSWORD); diff --git a/protocols/Icq10/src/stdafx.h b/protocols/Icq10/src/stdafx.h index 44f75d1099..7eda1521d8 100644 --- a/protocols/Icq10/src/stdafx.h +++ b/protocols/Icq10/src/stdafx.h @@ -78,6 +78,12 @@ #define MODULENAME "ICQ" +#define DB_KEY_UIN "UIN" +#define DB_KEY_ATOKEN "AToken" +#define DB_KEY_RTOKEN "RToken" +#define DB_KEY_RCLIENTID "RClientID" +#define DB_KEY_SESSIONKEY "SessionKey" + #include "http.h" #include "proto.h" diff --git a/protocols/Icq10/src/utils.cpp b/protocols/Icq10/src/utils.cpp index 49c9ad0d03..f745387742 100644 --- a/protocols/Icq10/src/utils.cpp +++ b/protocols/Icq10/src/utils.cpp @@ -24,7 +24,7 @@ void CIcqProto::InitContactCache() { mir_cslock l(m_csCache); for (auto &it : AccContacts()) - m_arCache.insert(new IcqCacheItem(getDword(it, "UIN"), it)); + m_arCache.insert(new IcqCacheItem(getDword(it, DB_KEY_UIN), it)); } IcqCacheItem* CIcqProto::FindContactByUIN(DWORD dwUin) @@ -41,7 +41,7 @@ MCONTACT CIcqProto::CreateContact(DWORD dwUin, bool bTemporary) MCONTACT hContact = db_add_contact(); Proto_AddToContact(hContact, m_szModuleName); - setDword(hContact, "UIN", dwUin); + setDword(hContact, DB_KEY_UIN, dwUin); pCache = new IcqCacheItem(dwUin, hContact); { mir_cslock l(m_csCache); |