From f5f0309106b5af3894e5db4b75d7a85b154d891b Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 28 Jan 2020 21:57:48 +0300 Subject: Jabber: fix for perversive http upload protocol, both "urn:xmpp:http:upload" & "urn:xmpp:http:upload:0" are supported --- protocols/JabberG/src/jabber_caps.h | 1 + protocols/JabberG/src/jabber_disco.cpp | 11 ++++++++++- protocols/JabberG/src/jabber_ft.cpp | 32 +++++++++++++++++++++++++++----- 3 files changed, 38 insertions(+), 6 deletions(-) (limited to 'protocols/JabberG/src') diff --git a/protocols/JabberG/src/jabber_caps.h b/protocols/JabberG/src/jabber_caps.h index 6bb1ac8446..511347028f 100755 --- a/protocols/JabberG/src/jabber_caps.h +++ b/protocols/JabberG/src/jabber_caps.h @@ -196,6 +196,7 @@ typedef unsigned __int64 JabberCapsBits; #define JABBER_FEAT_JUD "jabber:iq:search" #define JABBER_FEAT_SERVER_AVATAR "storage:client:avatar" #define JABBER_FEAT_UPLOAD "urn:xmpp:http:upload" +#define JABBER_FEAT_UPLOAD0 "urn:xmpp:http:upload:0" #define JABBER_FEAT_PUBSUB_EVENT "http://jabber.org/protocol/pubsub#event" #define JABBER_FEAT_PUBSUB_NODE_CONFIG "http://jabber.org/protocol/pubsub#node_config" diff --git a/protocols/JabberG/src/jabber_disco.cpp b/protocols/JabberG/src/jabber_disco.cpp index f4b82a748d..647309492a 100644 --- a/protocols/JabberG/src/jabber_disco.cpp +++ b/protocols/JabberG/src/jabber_disco.cpp @@ -1026,7 +1026,7 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM SD_ACT_LOGON = 100, SD_ACT_LOGOFF, SD_ACT_UNREGISTER, SD_ACT_REGISTER = 200, SD_ACT_ADHOC, SD_ACT_ADDDIRECTORY, - SD_ACT_JOIN, SD_ACT_BOOKMARK, SD_ACT_PROXY, SD_ACT_VCARD, SD_ACT_UPLOAD + SD_ACT_JOIN, SD_ACT_BOOKMARK, SD_ACT_PROXY, SD_ACT_VCARD, SD_ACT_UPLOAD, SD_ACT_UPLOAD0 }; enum @@ -1064,6 +1064,7 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM { JABBER_FEAT_JUD, LPGENW("Add search directory"), SD_ACT_ADDDIRECTORY}, { JABBER_FEAT_BYTESTREAMS, LPGENW("Use this proxy"), SD_ACT_PROXY}, { JABBER_FEAT_UPLOAD, LPGENW("Use for uploads"), SD_ACT_UPLOAD}, + { JABBER_FEAT_UPLOAD0, LPGENW("Use for uploads"), SD_ACT_UPLOAD0}, { nullptr }, { JABBER_FEAT_REGISTER, LPGENW("Register"), SD_ACT_REGISTER}, { "jabber:iq:gateway", LPGENW("Unregister"), SD_ACT_UNREGISTER, SD_FLG_ONROSTER | SD_FLG_SUBSCRIBED}, @@ -1138,6 +1139,7 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM break; case SD_ACT_UPLOAD: + case SD_ACT_UPLOAD0: if (m_bUseHttpUpload) dwFlags += MF_CHECKED; break; @@ -1252,6 +1254,13 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM case SD_ACT_UPLOAD: m_bUseHttpUpload = !m_bUseHttpUpload; setUString("HttpUpload", pNode->GetJid()); + setByte("HttpUploadVer", 1); + break; + + case SD_ACT_UPLOAD0: + m_bUseHttpUpload = !m_bUseHttpUpload; + setUString("HttpUpload", pNode->GetJid()); + setByte("HttpUploadVer", 0); break; case SD_ACT_JOIN: diff --git a/protocols/JabberG/src/jabber_ft.cpp b/protocols/JabberG/src/jabber_ft.cpp index a162d7504d..c7123fb2d5 100644 --- a/protocols/JabberG/src/jabber_ft.cpp +++ b/protocols/JabberG/src/jabber_ft.cpp @@ -103,9 +103,20 @@ void CJabberProto::FtInitiate(const char* jid, filetransfer *ft) if (pwszContentType == nullptr) pwszContentType = "application/octet-stream"; + char szSize[100]; + _i64toa(st.st_size, szSize, 10); + XmlNodeIq iq(AddIQ(&CJabberProto::OnHttpSlotAllocated, JABBER_IQ_TYPE_GET, szUploadService, ft)); - iq << XCHILDNS("request", "urn:xmpp:http:upload:0") - << XATTR("filename", T2Utf(filename)) << XATTRI64("size", st.st_size) << XATTR("content-type", pwszContentType); + if (getByte("HttpUploadVer")) { + auto *p = iq << XCHILDNS("request", JABBER_FEAT_UPLOAD); + p << XCHILD("filename", T2Utf(filename)); + p << XCHILD("size", szSize); + p << XCHILD("content-type", pwszContentType); + } + else { + iq << XCHILDNS("request", JABBER_FEAT_UPLOAD0) + << XATTR("filename", T2Utf(filename)) << XATTR("size", szSize) << XATTR("content-type", pwszContentType); + } m_ThreadInfo->send(iq); return; } @@ -566,7 +577,18 @@ LBL_Fail: if (auto *slotNode = XmlFirstChild(iqNode, "slot")) { if (auto *putNode = XmlFirstChild(slotNode, "put")) { - if (auto *szUrl = putNode->Attribute("url")) { + const char *szXmlns = slotNode->Attribute("xmlns"), *szUrl = nullptr; + if (!mir_strcmp(szXmlns, JABBER_FEAT_UPLOAD)) { + szUrl = putNode->GetText(); + debugLogA("%s: setting url to %s", szXmlns, szUrl); + } + else if (!mir_strcmp(szXmlns, JABBER_FEAT_UPLOAD0)) { + szUrl = putNode->Attribute("url"); + debugLogA("%s: setting url to %s", szXmlns, szUrl); + } + else debugLogA("missing url location"); + + if (szUrl) { NETLIBHTTPHEADER hdr[10]; NETLIBHTTPREQUEST nlhr = {}; @@ -636,8 +658,8 @@ LBL_Fail: return; } } + else debugLogA("missing put node"); } - - debugLogA("wrong or not recognizable http slot received"); + else debugLogA("wrong or not recognizable http slot received"); goto LBL_Fail; } -- cgit v1.2.3