summaryrefslogtreecommitdiff
path: root/protocols
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-03-05 15:42:01 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-03-05 15:42:01 +0300
commita9dcf740f4290fa9e6b0c957adb09f954500016e (patch)
treec04edd4ee16f5cae6a5e7f0c075691c8ed81f3f5 /protocols
parent300935cc22700e2ff3607fb3d0e06ac496ad6fcd (diff)
fixes #1878 (if a user wipes all sessions from a browser, Miranda can't read incoming messages for about 30 minutes)
Diffstat (limited to 'protocols')
-rw-r--r--protocols/ICQ-WIM/src/http.cpp27
-rw-r--r--protocols/ICQ-WIM/src/http.h2
-rw-r--r--protocols/ICQ-WIM/src/poll.cpp11
-rw-r--r--protocols/ICQ-WIM/src/proto.h1
4 files changed, 19 insertions, 22 deletions
diff --git a/protocols/ICQ-WIM/src/http.cpp b/protocols/ICQ-WIM/src/http.cpp
index 47929fbc69..abcedca18a 100644
--- a/protocols/ICQ-WIM/src/http.cpp
+++ b/protocols/ICQ-WIM/src/http.cpp
@@ -106,22 +106,11 @@ AsyncHttpRequest::AsyncHttpRequest(IcqConnection conn, int iType, const char *sz
}
}
-void AsyncHttpRequest::ReplaceJsonParam(const char *paramName, const char *newValue)
+void AsyncHttpRequest::ReplaceJsonParam(const JSONNode &n)
{
- CMStringA szOldValue(FORMAT, "\"%s\":\"", paramName);
- int idx = m_szParam.Find(szOldValue);
- if (idx == -1)
- return;
-
- idx += szOldValue.GetLength();
- int iEnd = m_szParam.Find("\"", idx);
- if (iEnd == -1)
- return;
-
- szOldValue += m_szParam.Mid(idx, iEnd + 1 - idx);
-
- CMStringA szNewValue(FORMAT, "\"%s\":\"%s\"", paramName, newValue);
- m_szParam.Replace(szOldValue, szNewValue);
+ JSONNode root = JSONNode::parse(m_szParam);
+ root[n.name()] = n;
+ m_szParam = root.write().c_str();
replaceStr(pData, nullptr);
dataLength = 0;
@@ -153,10 +142,8 @@ void CIcqProto::ExecuteRequest(AsyncHttpRequest *pReq)
return;
}
- char buf[40];
- _itoa_s(m_iRClientId, buf, 10);
- pReq->ReplaceJsonParam("clientId", buf);
- pReq->ReplaceJsonParam("authToken", m_szRToken);
+ pReq->ReplaceJsonParam(JSONNode("clientId", m_iRClientId));
+ pReq->ReplaceJsonParam(JSONNode("authToken", m_szRToken));
pReq->dataLength = pReq->m_szParam.GetLength();
pReq->pData = mir_strdup(pReq->m_szParam);
}
@@ -193,7 +180,7 @@ void CIcqProto::ExecuteRequest(AsyncHttpRequest *pReq)
// if token refresh succeeded, replace it in the query and push request back
if (RefreshRobustToken()) {
- pReq->ReplaceJsonParam("authToken", m_szRToken);
+ pReq->ReplaceJsonParam(JSONNode("authToken", m_szRToken));
Push(pReq);
}
else delete pReq;
diff --git a/protocols/ICQ-WIM/src/http.h b/protocols/ICQ-WIM/src/http.h
index 0152e41ff4..296abb2045 100644
--- a/protocols/ICQ-WIM/src/http.h
+++ b/protocols/ICQ-WIM/src/http.h
@@ -14,7 +14,7 @@ struct AsyncHttpRequest : public MTHttpRequest<CIcqProto>
AsyncHttpRequest(IcqConnection, int type, const char *szUrl, MTHttpRequestHandler pFunc = nullptr);
- void ReplaceJsonParam(const char *paramName, const char *newValue);
+ void ReplaceJsonParam(const JSONNode&);
};
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/ICQ-WIM/src/poll.cpp b/protocols/ICQ-WIM/src/poll.cpp
index d04d7184bb..5ff5cdbb16 100644
--- a/protocols/ICQ-WIM/src/poll.cpp
+++ b/protocols/ICQ-WIM/src/poll.cpp
@@ -115,7 +115,7 @@ void CIcqProto::ProcessEvent(const JSONNode &ev)
else if (szType == L"presence")
ProcessPresence(pData);
else if (szType == L"sessionEnded")
- ShutdownSession();
+ ProcessSessionEnd(pData);
else if (szType == L"typing")
ProcessTyping(pData);
}
@@ -262,6 +262,15 @@ void CIcqProto::ProcessPresence(const JSONNode &ev)
}
}
+void CIcqProto::ProcessSessionEnd(const JSONNode&)
+{
+ m_szRToken.Empty();
+ m_iRClientId = 0;
+ delSetting(DB_KEY_RCLIENTID);
+
+ ShutdownSession();
+}
+
void CIcqProto::ProcessTyping(const JSONNode &ev)
{
CMStringW aimId = ev["aimId"].as_mstring();
diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h
index 4dd0801e7b..cfaf780fd0 100644
--- a/protocols/ICQ-WIM/src/proto.h
+++ b/protocols/ICQ-WIM/src/proto.h
@@ -221,6 +221,7 @@ class CIcqProto : public PROTO<CIcqProto>
void ProcessNotification(const JSONNode&);
void ProcessPermissions(const JSONNode&);
void ProcessPresence(const JSONNode&);
+ void ProcessSessionEnd(const JSONNode&);
void ProcessTyping(const JSONNode&);
IcqConn m_ConnPool[CONN_LAST];