diff options
Diffstat (limited to 'protocols/WhatsAppWeb/src/server.cpp')
-rw-r--r-- | protocols/WhatsAppWeb/src/server.cpp | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/protocols/WhatsAppWeb/src/server.cpp b/protocols/WhatsAppWeb/src/server.cpp index 1bd6c70b49..1ffa435579 100644 --- a/protocols/WhatsAppWeb/src/server.cpp +++ b/protocols/WhatsAppWeb/src/server.cpp @@ -68,15 +68,8 @@ void WhatsAppProto::ShutdownSession() ///////////////////////////////////////////////////////////////////////////////////////// -void WhatsAppProto::OnStartSession(const void *pData, int cbLen) +void WhatsAppProto::OnStartSession(const WANode &node) { - proto::HandshakeMessage msg; - if (!msg.ParseFromArray(pData, cbLen)) { - debugLogA("Error parsing data, exiting"); - ShutdownSession(); - return; - } - } ///////////////////////////////////////////////////////////////////////////////////////// @@ -269,8 +262,7 @@ bool WhatsAppProto::ServerThreadWorker() auto &pubKey = m_noise->ephemeral.pub; auto *client = new proto::HandshakeMessage::ClientHello(); client->set_ephemeral(pubKey.data(), pubKey.length()); proto::HandshakeMessage msg; msg.set_allocated_clienthello(client); - WSSend(msg, &WhatsAppProto::OnProcessHandshake); - // OnProcessHandshake(0, 0); + WSSend(msg); bool bExit = false; MBinBuffer netbuf; @@ -324,7 +316,7 @@ bool WhatsAppProto::ServerThreadWorker() // try to decode if (hdr.opCode == 2 && hdr.payloadSize > 32) - ProcessBinaryPacket((const uint8_t*)pos, dataSize); + ProcessBinaryPacket(pos, dataSize); else { CMStringA szJson(pos, (int)dataSize); @@ -383,37 +375,41 @@ bool WhatsAppProto::ServerThreadWorker() ///////////////////////////////////////////////////////////////////////////////////////// // Binary data processing -void WhatsAppProto::ProcessBinaryPacket(const uint8_t *pData, size_t cbDataLen) +void WhatsAppProto::ProcessBinaryPacket(const void *pData, size_t cbDataLen) { - Netlib_Dump(m_hServerConn, pData, cbDataLen, false, 0); - - while (cbDataLen > 3) { - size_t payloadLen = 0; - for (int i = 0; i < 3; i++) { - payloadLen <<= 8; - payloadLen += pData[i]; - } - - pData += 3; - cbDataLen -= 3; - debugLogA("got payload of size %d", payloadLen); - - if (payloadLen > cbDataLen) { - debugLogA("payload length exceeds capacity %d", cbDataLen); - return; - } + while (size_t payloadLen = m_noise->decodeFrame(pData, cbDataLen)) { + if (m_noise->bInitFinished) { + MBinBuffer buf = m_noise->decrypt(pData, payloadLen); + + WAReader rdr(buf.data(), buf.length()); + auto b = rdr.readInt8(); + if (b & 2) { + debugLogA("zipped nodes are not supported"); + return; + } - MBinBuffer pkt = m_noise->decodeFrame(pData, payloadLen); + if (WANode *pNode = rdr.readNode()) { + CMStringA szText; + pNode->print(szText); + debugLogA("Got binary node:\n%s", szText.c_str()); - if (m_arPacketQueue.getCount()) { - WARequest req = m_arPacketQueue[0]; - m_arPacketQueue.remove(0); + if (m_arPacketQueue.getCount()) { + WARequest req = m_arPacketQueue[0]; + m_arPacketQueue.remove(0); - (this->*req.pHandler)(pkt.data(), (int)pkt.length()); + (this->*req.pHandler)(*pNode); + delete pNode; + } + else debugLogA("cannot handle incoming message"); + } + else { + debugLogA("wrong or broken payload"); + Netlib_Dump(m_hServerConn, pData, cbDataLen, false, 0); + } } - else debugLogA("cannot handle incoming message"); + else OnProcessHandshake(pData, (int)payloadLen); - pData += payloadLen; + pData = (BYTE*)pData + payloadLen; cbDataLen -= payloadLen; } } |