aboutsummaryrefslogtreecommitdiffstats
path: root/prosody-module
diff options
context:
space:
mode:
authorsteckbrief <steckbrief@chefmail.de>2017-05-04 13:15:42 +0200
committersteckbrief <steckbrief@chefmail.de>2017-05-04 13:15:42 +0200
commit1f318bcd00ba5cb26657050810c3f43cbdce5581 (patch)
treeeae38665ca7366e93ab67757389b36306ec9077b /prosody-module
parentbcfe8b2d97520e699377b41a1e024185fc7813dc (diff)
Added functionality to list files transferred using urn:xmpp:filetransfer:http
Diffstat (limited to 'prosody-module')
-rw-r--r--prosody-module/mod_http_upload_external/mod_http_upload_external.lua92
1 files changed, 91 insertions, 1 deletions
diff --git a/prosody-module/mod_http_upload_external/mod_http_upload_external.lua b/prosody-module/mod_http_upload_external/mod_http_upload_external.lua
index a9b4551..8ed7da1 100644
--- a/prosody-module/mod_http_upload_external/mod_http_upload_external.lua
+++ b/prosody-module/mod_http_upload_external/mod_http_upload_external.lua
@@ -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;