aboutsummaryrefslogtreecommitdiffstats
path: root/prosody-module
diff options
context:
space:
mode:
authorsteckbrief <steckbrief@chefmail.de>2016-08-20 21:42:50 +0200
committersteckbrief <steckbrief@chefmail.de>2016-08-20 21:42:50 +0200
commitccf99fc8d0eeee5eb08a5e4eab514ed8813abc6b (patch)
tree8fdb0b798f98e46ba06081e1c1d706b6cc95929d /prosody-module
parentdd33a02422fde98ef575355e8fabe6a86c7fac8c (diff)
Feature added: prosody module extended to request delete token
Diffstat (limited to 'prosody-module')
-rw-r--r--prosody-module/mod_http_upload_external/mod_http_upload_external.lua238
1 files changed, 153 insertions, 85 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 768a956..757a59c 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
@@ -22,7 +22,7 @@ local json = require"util.json";
module:depends("disco");
-- namespace
-local xmlns_http_upload = "urn:xmpp:http:upload";
+local xmlns_http_upload = "urn:xmpp:filetransfer:http";
module:add_feature(xmlns_http_upload);
@@ -42,95 +42,163 @@ module:hook("iq/host/"..xmlns_http_upload..":request", function (event)
origin.send(st.error_reply(stanza, "cancel", "internal-server-error"));
return true;
end
- -- validate
- local filename = request:get_child_text("filename");
- if not filename then
- origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid filename"));
- return true;
- end
- local filesize = tonumber(request:get_child_text("size"));
- if not filesize then
- origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing or invalid file size"));
- return true;
- end
+ local slot_type = request.attr.type;
+ if not slot_type or slot_type ~= "upload" then
+ -- validate
+ local filename = request:get_child_text("filename");
+ if not filename then
+ origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid filename"));
+ return true;
+ end
+ local filesize = tonumber(request:get_child_text("size"));
+ if not filesize then
+ origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing or invalid file size"));
+ return true;
+ end
- local content_type = request:get_child_text("content-type");
-
- -- build the body
- local reqbody = "xmpp_server_key=" .. xmpp_server_key .. "&size=" .. filesize .. "&filename=" .. filename .. "&user_jid=" .. orig_from;
- if content_type then
- reqbody = reqbody .. "&content_type=" .. content_type;
- end
+ local content_type = request:get_child_text("content-type");
+
+ -- build the body
+ local reqbody = "xmpp_server_key=" .. xmpp_server_key .. "&size=" .. filesize .. "&filename=" .. filename .. "&user_jid=" .. orig_from;
+ if content_type then
+ reqbody = reqbody .. "&content_type=" .. content_type;
+ end
- -- the request
- local respbody, statuscode = http.request(external_url, reqbody);
- respbody = string.gsub(respbody, "\\/", "/")
+ -- the request
+ local respbody, statuscode = http.request(external_url, reqbody);
+ respbody = string.gsub(respbody, "\\/", "/")
- local get_url = nil;
- local put_url = nil;
+ local get_url = nil;
+ local put_url = nil;
- -- check the response
- if statuscode == 500 then
- origin.send(st.error_reply(stanza, "cancel", "service-unavailable", respbody));
- 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;
- else
- if errobj["err_code"] ~= nil and errobj["msg"] ~= nil then
- if errobj.err_code == 1 then
- origin.send(st.error_reply(stanza, "modify", "not-acceptable", errobj.msg));
- return true;
- elseif errobj.err_code == 2 then
- origin.send(st.error_reply(stanza, "modify", "not-acceptable", errobj.msg,
- st.stanza("file-too-large", {xmlns=xmlns_http_upload})
- :tag("max-size"):text(errobj.parameters.max_file_size)));
- return true;
- elseif errobj.err_code == 3 then
- origin.send(st.error_reply(stanza, "modify", "not-acceptable", errobj.msg,
- st.stanza("invalid-character", {xmlns=xmlns_http_upload})
- :text(errobj.parameters.invalid_character)));
- return true;
- elseif errobj.err_code == 4 then
- origin.send(st.error_reply(stanza, "cancel", "internal-server-error", errobj.msg,
- st.stanza("missing-parameter", {xmlns=xmlns_http_upload})
- :text(errobj.parameters.missing_parameter)));
- return true;
- else
- origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "unknown err_code"));
- return true;
- end
- elseif statuscode == 403 and errobj["msg"] ~= nil then
- origin.send(st.error_reply(stanza, "cancel", "internal-server-error", errobj.msg));
- 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
- if respobj["get"] ~= nil and respobj["put"] ~= nil then
- get_url = respobj.get;
- put_url = respobj.put;
- else
- origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "get or put not found"));
- return true;
- end
- end
+ -- check the response
+ if statuscode == 500 then
+ origin.send(st.error_reply(stanza, "cancel", "service-unavailable", respbody));
+ 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;
+ else
+ if errobj["err_code"] ~= nil and errobj["msg"] ~= nil then
+ if errobj.err_code == 1 then
+ origin.send(st.error_reply(stanza, "modify", "not-acceptable", errobj.msg));
+ return true;
+ elseif errobj.err_code == 2 then
+ origin.send(st.error_reply(stanza, "modify", "not-acceptable", errobj.msg,
+ st.stanza("file-too-large", {xmlns=xmlns_http_upload})
+ :tag("max-size"):text(errobj.parameters.max_file_size)));
+ return true;
+ elseif errobj.err_code == 3 then
+ origin.send(st.error_reply(stanza, "modify", "not-acceptable", errobj.msg,
+ st.stanza("invalid-character", {xmlns=xmlns_http_upload})
+ :text(errobj.parameters.invalid_character)));
+ return true;
+ elseif errobj.err_code == 4 then
+ origin.send(st.error_reply(stanza, "cancel", "internal-server-error", errobj.msg,
+ st.stanza("missing-parameter", {xmlns=xmlns_http_upload})
+ :text(errobj.parameters.missing_parameter)));
+ return true;
+ else
+ origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "unknown err_code"));
+ return true;
+ end
+ elseif statuscode == 403 and errobj["msg"] ~= nil then
+ origin.send(st.error_reply(stanza, "cancel", "internal-server-error", errobj.msg));
+ 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
+ if respobj["get"] ~= nil and respobj["put"] ~= nil then
+ get_url = respobj.get;
+ put_url = respobj.put;
+ else
+ origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "get or put not found"));
+ return true;
+ end
+ end
+ else
+ origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "status code: " .. statuscode .. " response: " ..respbody));
+ return true;
+ end
+
+ local reply = st.reply(stanza);
+ reply:tag("slot", { xmlns = xmlns_http_upload });
+ reply:tag("get"):text(get_url):up();
+ reply:tag("put"):text(put_url):up();
+ origin.send(reply);
+ elseif slot_type ~= "delete" then
+ -- validate
+ local fileurl = request:get_child_text("fileurl");
+ if not fileurl then
+ origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid fileurl"));
+ return true;
+ end
+ -- build the body
+ local reqbody = "xmpp_server_key=" .. xmpp_server_key .. "&size=" .. filesize .. "&filename=" .. filename .. "&user_jid=" .. orig_from;
+ -- the request
+ local respbody, statuscode = http.request(external_url, reqbody);
+ respbody = string.gsub(respbody, "\\/", "/")
+
+ local delete_token = nil;
+ -- check the response
+ if statuscode == 500 then
+ origin.send(st.error_reply(stanza, "cancel", "service-unavailable", respbody));
+ 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;
+ else
+ if errobj["err_code"] ~= nil and errobj["msg"] ~= nil then
+ if errobj.err_code == 4 then
+ origin.send(st.error_reply(stanza, "cancel", "internal-server-error", errobj.msg,
+ st.stanza("missing-parameter", {xmlns=xmlns_http_upload})
+ :text(errobj.parameters.missing_parameter)));
+ return true;
+ else
+ origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "unknown err_code"));
+ return true;
+ end
+ elseif statuscode == 403 and errobj["msg"] ~= nil then
+ origin.send(st.error_reply(stanza, "cancel", "internal-server-error", errobj.msg));
+ 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
+ if respobj["deletetoken"] ~= nil then
+ delete_token = respobj.deletetoken;
+ else
+ origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "deletetoken not found"));
+ return true;
+ end
+ end
+ else
+ origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "status code: " .. statuscode .. " response: " ..respbody));
+ return true;
+ end
+
+ local reply = st.reply(stanza);
+ reply:tag("slot", { xmlns = xmlns_http_upload });
+ reply:tag("deletetoken"):text(deletetoken):up();
+ origin.send(reply);
else
- origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "status code: " .. statuscode .. " response: " ..respbody));
- return true;
+ origin.send(st.error_reply(stanza, "cancel", "undefined-condition", "status code: " .. statuscode .. " response: " ..respbody));
+ return true;
end
-
- local reply = st.reply(stanza);
- reply:tag("slot", { xmlns = xmlns_http_upload });
- reply:tag("get"):text(get_url):up();
- reply:tag("put"):text(put_url):up();
- origin.send(reply);
return true;
end);