/* Jabber Protocol Plugin for Miranda IM Copyright (C) 2002-04 Santithorn Bunchua Copyright (C) 2005-12 George Hazan Copyright (C) 2012-13 Miranda NG Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "jabber.h" int JabberHttpGatewayInit(HANDLE /*hConn*/, NETLIBOPENCONNECTION* /*nloc*/, NETLIBHTTPREQUEST* /*nlhr*/) { #ifdef NNNN WORD wLen, wVersion, wType; WORD wIpLen; DWORD dwSid1, dwSid2, dwSid3, dwSid4; BYTE response[300], *buf; int responseBytes, recvResult; char szSid[33], szHttpServer[256], szHttpGetUrl[300], szHttpPostUrl[300]; NETLIBHTTPPROXYINFO nlhpi = {0}; for (responseBytes = 0; ;) { recvResult = Netlib_Recv(hConn, response + responseBytes, sizeof(response) - responseBytes, MSG_DUMPPROXY); if (recvResult<=0) break; responseBytes += recvResult; if (responseBytes == sizeof(response)) break; } if (responseBytes < 31) { SetLastError(ERROR_INVALID_DATA); return 0; } buf = response; unpackWord(&buf, &wLen); unpackWord(&buf, &wVersion); /* always 0x0443 */ unpackWord(&buf, &wType); buf += 6; /* dunno */ unpackDWord(&buf, &dwSid1); unpackDWord(&buf, &dwSid2); unpackDWord(&buf, &dwSid3); unpackDWord(&buf, &dwSid4); mir_snprintf(szSid, SIZEOF(szSid), "%08x%08x%08x%08x", dwSid1, dwSid2, dwSid3, dwSid4); unpackWord(&buf, &wIpLen); if (responseBytes < 30 + wIpLen || wIpLen == 0 || wIpLen > sizeof(szHttpServer) - 1) { SetLastError(ERROR_INVALID_DATA); return 0; } memcpy(szHttpServer, buf, wIpLen); szHttpServer[wIpLen] = '\0'; nlhpi.cbSize = sizeof(nlhpi); nlhpi.flags = NLHPIF_USEPOSTSEQUENCE; nlhpi.szHttpGetUrl = szHttpGetUrl; nlhpi.szHttpPostUrl = szHttpPostUrl; nlhpi.firstPostSequence = 1; mir_snprintf(szHttpGetUrl, SIZEOF(szHttpGetUrl), "http://%s/monitor?sid=%s", szHttpServer, szSid); mir_snprintf(szHttpPostUrl, SIZEOF(szHttpPostUrl), "http://%s/data?sid=%s&seq=", szHttpServer, szSid); return CallService(MS_NETLIB_SETHTTPPROXYINFO, (WPARAM)hConn, (LPARAM)&nlhpi); #endif return 1; } int JabberHttpGatewayBegin(HANDLE /*hConn*/, NETLIBOPENCONNECTION* /*nloc*/) { /* icq_packet packet; int serverNameLen; serverNameLen = strlen(nloc->szHost); packet.wLen = (WORD)(serverNameLen + 4); write_httphdr(&packet, HTTP_PACKETTYPE_LOGIN); packWord(&packet, (WORD)serverNameLen); packString(&packet, nloc->szHost, (WORD)serverNameLen); packWord(&packet, nloc->wPort); Netlib_Send(hConn, packet.pData, packet.wLen, MSG_DUMPPROXY|MSG_NOHTTPGATEWAYWRAP); mir_free(packet.pData); return 1; */ return 1; } int JabberHttpGatewayWrapSend(HANDLE hConn, PBYTE buf, int len, int flags, MIRANDASERVICE pfnNetlibSend) { TCHAR *strb = mir_utf8decodeW((char*)buf); TCHAR sid[25] = _T(""); unsigned __int64 rid = 0; XmlNode hPayLoad(strb); XmlNode body(_T("body")); HXML hBody = body << XATTRI64(_T("rid"), rid++) << XATTR(_T("sid"), sid) << XATTR(_T("xmlns"), _T("http://jabber.org/protocol/httpbind")); xmlAddChild(hBody, hPayLoad); TCHAR *str = xi.toString(hBody, NULL); mir_free(strb); char* utfStr = mir_utf8encodeT(str); NETLIBBUFFER nlb = { utfStr, (int)strlen(utfStr), flags }; int result = pfnNetlibSend((WPARAM)hConn, (LPARAM)&nlb); mir_free(utfStr); xi.freeMem(str); return result; } #if 0 PBYTE JabberHttpGatewayUnwrapRecv(NETLIBHTTPREQUEST *nlhr, PBYTE buf, int len, int *outBufLen, void *(*NetlibRealloc)(void *, size_t)) { WORD wLen, wType; PBYTE tbuf; int i, copyBytes; tbuf = buf; for (i=0;;) { if (tbuf - buf + 2 > len) break; unpackWord(&tbuf, &wLen); if (wLen < 12) break; if (tbuf - buf + wLen > len) break; tbuf += 2; /* version */ unpackWord(&tbuf, &wType); tbuf += 8; /* flags & subtype */ if (wType == HTTP_PACKETTYPE_FLAP) { copyBytes = wLen - 12; if (copyBytes > len - i) { /* invalid data - do our best to get something out of it */ copyBytes = len - i; } memcpy(buf + i, tbuf, copyBytes); i += copyBytes; } tbuf += wLen - 12; } *outBufLen = i; return buf; } #endif