summaryrefslogtreecommitdiff
path: root/protocols/WhatsAppWeb/src/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/WhatsAppWeb/src/server.cpp')
-rw-r--r--protocols/WhatsAppWeb/src/server.cpp45
1 files changed, 35 insertions, 10 deletions
diff --git a/protocols/WhatsAppWeb/src/server.cpp b/protocols/WhatsAppWeb/src/server.cpp
index e46a3b62a6..1a66504532 100644
--- a/protocols/WhatsAppWeb/src/server.cpp
+++ b/protocols/WhatsAppWeb/src/server.cpp
@@ -335,20 +335,38 @@ bool WhatsAppProto::ServerThreadWorker()
while (true) {
switch (hdr.opCode) {
case 1: // json packet
+ case 2: // binary packet
if (hdr.bIsFinal) {
// process a packet here
- CMStringA szJson(netbuf.data() + hdr.headerSize, (int)hdr.payloadSize);
- debugLogA("JSON received:\n%s", szJson.c_str());
+ const char *start = netbuf.data() + hdr.headerSize;
+ const char *pos = strchr(start, ',');
+ if (pos == nullptr) {
+ debugLogA("invalid packet received, no comma");
+ break;
+ }
+ pos++;
+ size_t dataSize = hdr.payloadSize - size_t(pos - start);
+
+ // try to decode
+ if (hdr.opCode == 2 && hdr.payloadSize > 32) {
+ MBinBuffer dest;
+ if (!decryptBinaryMessage(dataSize, pos, dest)) {
+ Netlib_Dump(m_hServerConn, netbuf.data(), hdr.headerSize + hdr.payloadSize, false, 0);
+ debugLogA("cannot decrypt incoming message");
+ break;
+ }
- int pos = szJson.Find(',');
- if (pos != -1) {
- CMStringA szPrefix = szJson.Left(pos);
- szJson.Delete(0, pos+1);
+ Netlib_Dump(m_hServerConn, dest.data(), dest.length(), false, 0);
+ ProcessBinaryPacket(dest);
+ }
+ else {
+ CMStringA szJson(pos, (int)dataSize);
+ debugLogA("JSON received:\n%s", szJson.c_str());
JSONNode root = JSONNode::parse(szJson);
if (root) {
int sessId, pktId;
- if (sscanf(szPrefix, "%d.--%d,", &sessId, &pktId) == 2) {
+ if (sscanf(start, "%d.--%d,", &sessId, &pktId) == 2) {
auto *pReq = m_arPacketQueue.find((WARequest *)&pktId);
if (pReq != nullptr) {
(this->*pReq->pHandler)(root);
@@ -360,9 +378,6 @@ bool WhatsAppProto::ServerThreadWorker()
}
break;
- case 2: // binary packet
- break;
-
case 8: // close
debugLogA("server required to exit");
bExit = true; // simply reconnect, don't exit
@@ -404,6 +419,16 @@ bool WhatsAppProto::ServerThreadWorker()
return false;
}
+/////////////////////////////////////////////////////////////////////////////////////////
+// Binary data processing
+
+void WhatsAppProto::ProcessBinaryPacket(const MBinBuffer &buf)
+{
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Json data processing
+
void WhatsAppProto::ProcessPacket(const JSONNode &root)
{
CMStringA szType = root[(size_t)0].as_mstring();