Added functionality to list files transferred using urn:xmpp:filetransfer:http

This commit is contained in:
steckbrief 2017-05-04 13:15:42 +02:00
parent bcfe8b2d97
commit 1f318bcd00

View file

@ -34,6 +34,87 @@ module:add_extension(dataform {
{ name = "filetransfer-manager-ui-url", type = "text-single" },
}:form({ ["filetransfer-manager-ui-url"] = filetransfer_manager_ui_url }, "result"));
local function listfiles(origin, orig_from, stanza, request)
-- build the body
local reqbody = "xmpp_server_key=" .. xmpp_server_key .. "&slot_type=list&user_jid=" .. orig_from;
-- the request
local respbody, statuscode = http.request(external_url, reqbody);
-- respbody is nil in case the server is not reachable
if respbody ~= nil then
respbody = string.gsub(respbody, "\\/", "/");
end
local filelistempty = true;
local list;
-- check the response
if statuscode == 500 then
origin.send(st.error_reply(stanza, "cancel", "service-unavailable", respbody));
return true;
elseif statuscode == 406 or statuscode == 400 or statuscode == 403 then
local errobj, pos, err = json.decode(respbody);
if err then
origin.send(st.error_reply(stanza, "wait", "internal-server-error", err));
return true;
elseif errobj["err_code"] ~= nil and errobj["msg"] ~= nil then
if statuscode == 403 then
origin.send(st.error_reply(stanza, "cancel", "internal-server-error", errobj.msg));
return true;
else
origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "msg or err_code not found"));
return true;
end
end
elseif statuscode == 200 then
local respobj, pos, err = json.decode(respbody);
if err then
origin.send(st.error_reply(stanza, "wait", "internal-server-error", err));
return true;
else
-- process json response
list = respobj.list;
filelistempty = list == nil or next(list) == nil;
end
else
origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "status code: " .. statuscode .. " response: " ..respbody));
return true;
end
local addedfiles = 0;
local reply = st.reply(stanza);
reply:tag("list", {xmlns=xmlns_http_upload});
if filelistempty == false then
for i, file in ipairs(list) do
local url = file.url;
if url == "" then
url = nil;
end
local fileinfo = file.fileinfo;
local sender = file.sender_jid;
if sender == nil then
sender = "";
end
local recipient = file.recipient_jid;
local sent_time = file.sent_time;
-- only add file if fileinfo is present
if fileinfo ~= nil then
addedfiles = addedfiles + 1;
reply:tag("file", {timestamp = tostring(sent_time), from = tostring(sender), to = recipient});
reply:tag("url"):text(url):up();
reply:tag("file-info");
reply:tag("filename"):text(fileinfo.filename):up();
reply:tag("size"):text(fileinfo.filesize):up();
reply:tag("content-type"):text(fileinfo.content_type):up():up():up();
end
end
end
if filelistempty or addedfiles == 0 then
reply:tag("empty"):up();
end
origin.send(reply);
return true;
end
-- hooks
module:hook("iq/host/"..xmlns_http_upload..":request", function (event)
local stanza, origin = event.stanza, event.origin;
@ -70,10 +151,16 @@ module:hook("iq/host/"..xmlns_http_upload..":request", function (event)
return true;
end
local recipient = request.attr.recipient;
if not recipient then
origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing or invalid recipient"));
return true;
end
local content_type = request:get_child_text("content-type");
-- build the body
local reqbody = "xmpp_server_key=" .. xmpp_server_key .. "&slot_type=upload&size=" .. filesize .. "&filename=" .. filename .. "&user_jid=" .. orig_from;
local reqbody = "xmpp_server_key=" .. xmpp_server_key .. "&slot_type=upload&size=" .. filesize .. "&filename=" .. filename .. "&user_jid=" .. orig_from .. "&recipient_jid=" .. recipient;
if content_type then
reqbody = reqbody .. "&content_type=" .. content_type;
end
@ -149,6 +236,7 @@ module:hook("iq/host/"..xmlns_http_upload..":request", function (event)
else
-- http file service not reachable
origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "status code: " .. statuscode));
return true;
end
local reply = st.reply(stanza);
@ -226,6 +314,8 @@ module:hook("iq/host/"..xmlns_http_upload..":request", function (event)
reply:tag("slot", { xmlns = xmlns_http_upload });
reply:tag("deletetoken"):text(delete_token):up();
origin.send(reply);
elseif slot_type == "list" then
return listfiles(origin, orig_from, stanza, request);
else
origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "status code: " .. statuscode .. " response: " ..respbody));
return true;