Added functionality to list files transferred using urn:xmpp:filetransfer:http
This commit is contained in:
parent
bcfe8b2d97
commit
1f318bcd00
1 changed files with 91 additions and 1 deletions
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue