summaryrefslogtreecommitdiff
path: root/protocols/JabberG/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2020-01-28 21:57:48 +0300
committerGeorge Hazan <ghazan@miranda.im>2020-01-28 21:57:48 +0300
commitf5f0309106b5af3894e5db4b75d7a85b154d891b (patch)
treeaa40ef6a6af84486e316af8ee0c5184d75419050 /protocols/JabberG/src
parent49e08f17d39cf4c067ef742dfd3d903e18115fef (diff)
Jabber: fix for perversive http upload protocol, both "urn:xmpp:http:upload" & "urn:xmpp:http:upload:0" are supported
Diffstat (limited to 'protocols/JabberG/src')
-rwxr-xr-xprotocols/JabberG/src/jabber_caps.h1
-rw-r--r--protocols/JabberG/src/jabber_disco.cpp11
-rw-r--r--protocols/JabberG/src/jabber_ft.cpp32
3 files changed, 38 insertions, 6 deletions
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;
}