comparison mod_http_upload/mod_http_upload.lua @ 1851:03c5639882a7

mod_http_upload: Add support for a file size limit
author Kim Alvefur <zash@zash.se>
date Mon, 14 Sep 2015 12:49:54 +0200
parents e3a0ebe671cc
children 8ef500508c59
comparison
equal deleted inserted replaced
1850:e3a0ebe671cc 1851:03c5639882a7
13 local uuid = require"util.uuid".generate; 13 local uuid = require"util.uuid".generate;
14 14
15 local function join_path(a, b) 15 local function join_path(a, b)
16 return a .. package.config:sub(1,1) .. b; 16 return a .. package.config:sub(1,1) .. b;
17 end 17 end
18
19 -- config
20 local file_size_limit = module:get_option_number(module.name .. "_file_size_limit", 10 * 1024 * 1024); -- 10 MB
18 21
19 -- depends 22 -- depends
20 module:depends("http"); 23 module:depends("http");
21 module:depends("disco"); 24 module:depends("disco");
22 25
44 local filename = request:get_child_text("filename"); 47 local filename = request:get_child_text("filename");
45 if not filename or filename:find("/") then 48 if not filename or filename:find("/") then
46 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid filename")); 49 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid filename"));
47 return true; 50 return true;
48 end 51 end
52 local filesize = tonumber(request:get_child_text("size"));
53 if not filesize then
54 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing or invalid file size"));
55 return true;
56 elseif filesize > file_size_limit then
57 origin.send(st.error_reply(stanza, "modify", "not-acceptable", "File too large",
58 st.stanza("file-too-large", {xmlns=xmlns_http_upload})
59 :tag("max-size"):text(tostring(file_size_limit))));
60 return true;
61 end
49 local reply = st.reply(stanza); 62 local reply = st.reply(stanza);
50 reply:tag("slot", { xmlns = xmlns_http_upload }); 63 reply:tag("slot", { xmlns = xmlns_http_upload });
51 local random = uuid(); 64 local random = uuid();
52 pending_slots[random.."/"..filename] = origin.full_jid; 65 pending_slots[random.."/"..filename] = origin.full_jid;
53 local url = module:http_url() .. "/" .. random .. "/" .. filename; 66 local url = module:http_url() .. "/" .. random .. "/" .. filename;
62 if not pending_slots[path] then 75 if not pending_slots[path] then
63 return 401; 76 return 401;
64 end 77 end
65 local random, filename = path:match("^([^/]+)/([^/]+)$"); 78 local random, filename = path:match("^([^/]+)/([^/]+)$");
66 if not random then 79 if not random then
80 return 400;
81 end
82 if #event.request.body > file_size_limit then
83 module:log("error", "Uploaded file too large %d bytes", #event.request.body);
67 return 400; 84 return 400;
68 end 85 end
69 local dirname = join_path(storage_path, random); 86 local dirname = join_path(storage_path, random);
70 if not lfs.mkdir(dirname) then 87 if not lfs.mkdir(dirname) then
71 module:log("error", "Could not create directory %s for upload", dirname); 88 module:log("error", "Could not create directory %s for upload", dirname);