Annotate

mod_http_upload/mod_http_upload.lua @ 3625:a578b4977bb0

mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374) When using net.http.files this isn't automatically provided via mod_http_files so we need to do it ourselves.
author Kim Alvefur <zash@zash.se>
date Sat, 29 Jun 2019 19:26:08 +0200
parent 3590:d8cc8b71a199
child 3648:aa12b95a6d36
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- mod_http_upload
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 --
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
3 -- Copyright (C) 2015-2018 Kim Alvefur
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 --
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 -- This file is MIT/X11 licensed.
2065
624e3fed6f92 mod_http_upload: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 2053
diff changeset
6 --
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 -- Implementation of HTTP Upload file transfer mechanism used by Conversations
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 --
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 -- imports
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 local st = require"util.stanza";
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 local lfs = require"lfs";
2286
0a3f526779a1 mod_http_upload: Construct the upload slot URL using the LuaSocket URL library (fixes #717)
Kim Alvefur <zash@zash.se>
parents: 2285
diff changeset
13 local url = require "socket.url";
2066
cb74e4ab13f0 mod_http_upload: Advertise maximum file size in disco#info (Per XEP-0363 v0.2)
Kim Alvefur <zash@zash.se>
parents: 2065
diff changeset
14 local dataform = require "util.dataforms".new;
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
15 local datamanager = require "util.datamanager";
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
16 local array = require "util.array";
1912
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
17 local t_concat = table.concat;
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
18 local t_insert = table.insert;
1914
b01d60dfa405 mod_http_upload: Add missing local of string.upper (Thanks Thilo)
Kim Alvefur <zash@zash.se>
parents: 1912
diff changeset
19 local s_upper = string.upper;
2665
cfb7936ff61f mod_http_upload: Use the new util.id if available (in 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2651
diff changeset
20 local have_id, id = pcall(require, "util.id"); -- Only available in 0.10+
2646
45ef16ebe565 mod_http_upload: Generate shorter directory names (closes #822)
Kim Alvefur <zash@zash.se>
parents: 2641
diff changeset
21 local uuid = require"util.uuid".generate;
2665
cfb7936ff61f mod_http_upload: Use the new util.id if available (in 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2651
diff changeset
22 if have_id then
2666
99c0b1bacdcd mod_http_upload: Where did those parenthesis come from?
Kim Alvefur <zash@zash.se>
parents: 2665
diff changeset
23 uuid = id.medium;
2646
45ef16ebe565 mod_http_upload: Generate shorter directory names (closes #822)
Kim Alvefur <zash@zash.se>
parents: 2641
diff changeset
24 end
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25
2646
45ef16ebe565 mod_http_upload: Generate shorter directory names (closes #822)
Kim Alvefur <zash@zash.se>
parents: 2641
diff changeset
26 local function join_path(...) -- COMPAT util.path was added in 0.10
2476
024a4143baef mod_http_upload: Add missing return statement
Kim Alvefur <zash@zash.se>
parents: 2475
diff changeset
27 return table.concat({ ... }, package.config:sub(1,1));
1815
abacf6698d97 mod_http_upload: Include join_path function, should make it work with 0.9.x
Kim Alvefur <zash@zash.se>
parents: 1805
diff changeset
28 end
abacf6698d97 mod_http_upload: Include join_path function, should make it work with 0.9.x
Kim Alvefur <zash@zash.se>
parents: 1805
diff changeset
29
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
30 -- config
2053
40056a27f394 mod_http_upload: Lower default size limit to 1MB
Kim Alvefur <zash@zash.se>
parents: 1967
diff changeset
31 local file_size_limit = module:get_option_number(module.name .. "_file_size_limit", 1024 * 1024); -- 1 MB
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
32 local quota = module:get_option_number(module.name .. "_quota");
2677
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
33 local max_age = module:get_option_number(module.name .. "_expire_after");
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
34
2285
f1923bf329a3 mod_http_upload: Warn if upload size limit set higher than body size limit in http parser (applies to 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2231
diff changeset
35 --- sanity
f1923bf329a3 mod_http_upload: Warn if upload size limit set higher than body size limit in http parser (applies to 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2231
diff changeset
36 local parser_body_limit = module:context("*"):get_option_number("http_max_content_size", 10*1024*1024);
f1923bf329a3 mod_http_upload: Warn if upload size limit set higher than body size limit in http parser (applies to 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2231
diff changeset
37 if file_size_limit > parser_body_limit then
2648
4c92e2e897c8 mod_http_upload: Split some long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 2647
diff changeset
38 module:log("warn", "%s_file_size_limit exceeds HTTP parser limit on body size, capping file size to %d B",
4c92e2e897c8 mod_http_upload: Split some long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 2647
diff changeset
39 module.name, parser_body_limit);
2285
f1923bf329a3 mod_http_upload: Warn if upload size limit set higher than body size limit in http parser (applies to 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2231
diff changeset
40 file_size_limit = parser_body_limit;
f1923bf329a3 mod_http_upload: Warn if upload size limit set higher than body size limit in http parser (applies to 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2231
diff changeset
41 end
f1923bf329a3 mod_http_upload: Warn if upload size limit set higher than body size limit in http parser (applies to 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2231
diff changeset
42
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 -- depends
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 module:depends("http");
1805
25c28644fae8 mod_http_upload: Depend on mod_disco, allows it to be discovered when set up as a component
Kim Alvefur <zash@zash.se>
parents: 1772
diff changeset
45 module:depends("disco");
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46
3549
b059a3fb2a58 Update modules using mod_http_files to serve files for change in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
47 local http_files;
b059a3fb2a58 Update modules using mod_http_files to serve files for change in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
48
b059a3fb2a58 Update modules using mod_http_files to serve files for change in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
49 if not pcall(function ()
b059a3fb2a58 Update modules using mod_http_files to serve files for change in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
50 http_files = require "net.http.files";
b059a3fb2a58 Update modules using mod_http_files to serve files for change in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
51 end) then
b059a3fb2a58 Update modules using mod_http_files to serve files for change in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
52 http_files = module:depends"http_files";
b059a3fb2a58 Update modules using mod_http_files to serve files for change in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
53 end
2680
96bf67f1f960 mod_http_upload: Validate that file extension (used by mod_http_files) matches mime type given by client
Kim Alvefur <zash@zash.se>
parents: 2678
diff changeset
54
3625
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
55 local mime_map = module:shared("/*/http_files/mime").types;
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
56 if not mime_map then
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
57 mime_map = {
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
58 html = "text/html", htm = "text/html",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
59 xml = "application/xml",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
60 txt = "text/plain",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
61 css = "text/css",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
62 js = "application/javascript",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
63 png = "image/png",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
64 gif = "image/gif",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
65 jpeg = "image/jpeg", jpg = "image/jpeg",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
66 svg = "image/svg+xml",
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
67 };
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
68 module:shared("/*/http_files/mime").types = mime_map;
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
69
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
70 local mime_types, err = io.open(module:get_option_path("mime_types_file", "/etc/mime.types", "config"), "r");
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
71 if mime_types then
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
72 local mime_data = mime_types:read("*a");
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
73 mime_types:close();
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
74 setmetatable(mime_map, {
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
75 __index = function(t, ext)
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
76 local typ = mime_data:match("\n(%S+)[^\n]*%s"..(ext:lower()).."%s") or "application/octet-stream";
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
77 t[ext] = typ;
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
78 return typ;
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
79 end
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
80 });
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
81 end
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
82 end
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
83
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
84 -- namespaces
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
85 local namespace = "urn:xmpp:http:upload:0";
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
86 local legacy_namespace = "urn:xmpp:http:upload";
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87
2287
e1a8c2324937 mod_http_upload: Add a comment
Kim Alvefur <zash@zash.se>
parents: 2286
diff changeset
88 -- identity and feature advertising
2444
3e9f9cef9c0e mod_http_upload: Add missing semicolon
Kim Alvefur <zash@zash.se>
parents: 2443
diff changeset
89 module:add_identity("store", "file", module:get_option_string("name", "HTTP File Upload"));
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
90 module:add_feature(namespace);
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
91 module:add_feature(legacy_namespace);
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92
2066
cb74e4ab13f0 mod_http_upload: Advertise maximum file size in disco#info (Per XEP-0363 v0.2)
Kim Alvefur <zash@zash.se>
parents: 2065
diff changeset
93 module:add_extension(dataform {
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
94 { name = "FORM_TYPE", type = "hidden", value = namespace },
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
95 { name = "max-file-size", type = "text-single" },
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
96 }:form({ ["max-file-size"] = tostring(file_size_limit) }, "result"));
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
97
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
98 module:add_extension(dataform {
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
99 { name = "FORM_TYPE", type = "hidden", value = legacy_namespace },
2066
cb74e4ab13f0 mod_http_upload: Advertise maximum file size in disco#info (Per XEP-0363 v0.2)
Kim Alvefur <zash@zash.se>
parents: 2065
diff changeset
100 { name = "max-file-size", type = "text-single" },
cb74e4ab13f0 mod_http_upload: Advertise maximum file size in disco#info (Per XEP-0363 v0.2)
Kim Alvefur <zash@zash.se>
parents: 2065
diff changeset
101 }:form({ ["max-file-size"] = tostring(file_size_limit) }, "result"));
cb74e4ab13f0 mod_http_upload: Advertise maximum file size in disco#info (Per XEP-0363 v0.2)
Kim Alvefur <zash@zash.se>
parents: 2065
diff changeset
102
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 -- state
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 local pending_slots = module:shared("upload_slots");
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105
1967
2ce2b194d501 mod_http_upload: Make file system path configurable
Kim Alvefur <zash@zash.se>
parents: 1966
diff changeset
106 local storage_path = module:get_option_string(module.name .. "_path", join_path(prosody.paths.data, module.name));
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 lfs.mkdir(storage_path);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108
2677
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
109 local function expire(username, host)
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
110 if not max_age then return true; end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
111 local uploads, err = datamanager.list_load(username, host, module.name);
3590
d8cc8b71a199 mod_http_upload: Propagate errors from expiry procedure
Kim Alvefur <zash@zash.se>
parents: 3589
diff changeset
112 if err then return false, err; end
2677
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
113 if not uploads then return true; end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
114 uploads = array(uploads);
2677
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
115 local expiry = os.time() - max_age;
2688
ef80c9d0ebff mod_http_upload: Remove unused upload slots
Kim Alvefur <zash@zash.se>
parents: 2687
diff changeset
116 local upload_window = os.time() - 900;
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
117 uploads:filter(function (item)
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
118 local filename = item.filename;
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
119 if item.dir then
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
120 filename = join_path(storage_path, item.dir, item.filename);
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
121 end
2677
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
122 if item.time < expiry then
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
123 local deleted, whynot = os.remove(filename);
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
124 if not deleted then
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
125 module:log("warn", "Could not delete expired upload %s: %s", filename, whynot or "delete failed");
2677
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
126 end
2732
b1c5b0c369c2 mod_http_upload: Remove directory when deleting a file (fixes #950)
Kim Alvefur <zash@zash.se>
parents: 2731
diff changeset
127 os.remove(filename:match("^(.*)[/\\]"));
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
128 return false;
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
129 elseif item.time < upload_window and not lfs.attributes(filename) then
2688
ef80c9d0ebff mod_http_upload: Remove unused upload slots
Kim Alvefur <zash@zash.se>
parents: 2687
diff changeset
130 return false; -- File was not uploaded or has been deleted since
2677
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
131 end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
132 return true;
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
133 end);
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
134 return datamanager.list_store(username, host, module.name, uploads);
2677
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
135 end
6daaa1ad2559 mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
Kim Alvefur <zash@zash.se>
parents: 2667
diff changeset
136
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
137 local function check_quota(username, host, does_it_fit)
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
138 if not quota then return true; end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
139 local uploads, err = datamanager.list_load(username, host, module.name);
3588
85057c4e7b66 mod_http_upload: Consider quota reached if it can't be checked
Kim Alvefur <zash@zash.se>
parents: 3549
diff changeset
140 if err then
85057c4e7b66 mod_http_upload: Consider quota reached if it can't be checked
Kim Alvefur <zash@zash.se>
parents: 3549
diff changeset
141 return false;
85057c4e7b66 mod_http_upload: Consider quota reached if it can't be checked
Kim Alvefur <zash@zash.se>
parents: 3549
diff changeset
142 elseif not uploads then
3589
dec5683f91a2 mod_http_upload: Check attempted upload against quota even with no previous uploads
Kim Alvefur <zash@zash.se>
parents: 3588
diff changeset
143 if does_it_fit then
dec5683f91a2 mod_http_upload: Check attempted upload against quota even with no previous uploads
Kim Alvefur <zash@zash.se>
parents: 3588
diff changeset
144 return does_it_fit < quota;
dec5683f91a2 mod_http_upload: Check attempted upload against quota even with no previous uploads
Kim Alvefur <zash@zash.se>
parents: 3588
diff changeset
145 end
3588
85057c4e7b66 mod_http_upload: Consider quota reached if it can't be checked
Kim Alvefur <zash@zash.se>
parents: 3549
diff changeset
146 return true;
85057c4e7b66 mod_http_upload: Consider quota reached if it can't be checked
Kim Alvefur <zash@zash.se>
parents: 3549
diff changeset
147 end
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
148 local sum = does_it_fit or 0;
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
149 for _, item in ipairs(uploads) do
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
150 sum = sum + item.size;
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
151 end
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
152 return sum < quota;
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
153 end
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
154
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
155 local measure_slot = function () end
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
156 if module.measure then
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
157 -- COMPAT 0.9
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
158 -- module:measure was added in 0.10
3369
fca95f1b8870 mod_http_upload: Fix order of arguments to :measure
Kim Alvefur <zash@zash.se>
parents: 3366
diff changeset
159 measure_slot = module:measure("slot", "sizes");
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
160 end
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
161
2731
d48faff92490 mod_http_upload: Remove MIME type restrictions and checking (fixes #958)
Kim Alvefur <zash@zash.se>
parents: 2692
diff changeset
162 local function handle_request(origin, stanza, xmlns, filename, filesize)
2689
0fc706855af9 mod_http_upload: Keep user- and hostname in locals
Kim Alvefur <zash@zash.se>
parents: 2688
diff changeset
163 local username, host = origin.username, origin.host;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
164 -- local clients only
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
165 if origin.type ~= "c2s" then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
166 module:log("debug", "Request for upload slot from a %s", origin.type);
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
167 return nil, st.error_reply(stanza, "cancel", "not-authorized");
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
168 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
169 -- validate
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170 if not filename or filename:find("/") then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
171 module:log("debug", "Filename %q not allowed", filename or "");
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
172 return nil, st.error_reply(stanza, "modify", "bad-request", "Invalid filename");
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
173 end
2689
0fc706855af9 mod_http_upload: Keep user- and hostname in locals
Kim Alvefur <zash@zash.se>
parents: 2688
diff changeset
174 expire(username, host);
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
175 if not filesize then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
176 module:log("debug", "Missing file size");
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
177 return nil, st.error_reply(stanza, "modify", "bad-request", "Missing or invalid file size");
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
178 elseif filesize > file_size_limit then
2208
e654d6e1fb50 mod_http_upload: Log if file size exceeds limit
Kim Alvefur <zash@zash.se>
parents: 2207
diff changeset
179 module:log("debug", "File too large (%d > %d)", filesize, file_size_limit);
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
180 return nil, st.error_reply(stanza, "modify", "not-acceptable", "File too large")
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
181 :tag("file-too-large", {xmlns=xmlns})
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
182 :tag("max-file-size"):text(tostring(file_size_limit));
2689
0fc706855af9 mod_http_upload: Keep user- and hostname in locals
Kim Alvefur <zash@zash.se>
parents: 2688
diff changeset
183 elseif not check_quota(username, host, filesize) then
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
184 module:log("debug", "Upload of %dB by %s would exceed quota", filesize, origin.full_jid);
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
185 return nil, st.error_reply(stanza, "wait", "resource-constraint", "Quota reached");
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
186 end
2680
96bf67f1f960 mod_http_upload: Validate that file extension (used by mod_http_files) matches mime type given by client
Kim Alvefur <zash@zash.se>
parents: 2678
diff changeset
187
2800
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
188 local random_dir = uuid();
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
189 local created, err = lfs.mkdir(join_path(storage_path, random_dir));
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
190
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
191 if not created then
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
192 module:log("error", "Could not create directory for slot: %s", err);
3176
d34f5d969940 mod_http_upload: use correct error condition
Jonas Wielicki <jonas@wielicki.name>
parents: 3011
diff changeset
193 return nil, st.error_reply(stanza, "wait", "internal-server-error");
2800
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
194 end
2468
3bff2848af12 mod_http_upload: Create random directory name when assigning slot
Kim Alvefur <zash@zash.se>
parents: 2467
diff changeset
195
2690
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
196 local ok = datamanager.list_append(username, host, module.name, {
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
197 filename = filename, dir = random_dir, size = filesize, time = os.time() });
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
198
2690
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
199 if not ok then
3176
d34f5d969940 mod_http_upload: use correct error condition
Jonas Wielicki <jonas@wielicki.name>
parents: 3011
diff changeset
200 return nil, st.error_reply(stanza, "wait", "internal-server-error");
2690
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
201 end
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
202
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
203 local slot = random_dir.."/"..filename;
2489
9d154c929319 mod_http_upload: Log the directory and filename joined
Kim Alvefur <zash@zash.se>
parents: 2479
diff changeset
204 pending_slots[slot] = origin.full_jid;
2682
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
205
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
206 module:add_timer(900, function()
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
207 pending_slots[slot] = nil;
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
208 end);
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
209
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
210 measure_slot(filesize);
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
211
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
212 origin.log("debug", "Given upload slot %q", slot);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
213
2286
0a3f526779a1 mod_http_upload: Construct the upload slot URL using the LuaSocket URL library (fixes #717)
Kim Alvefur <zash@zash.se>
parents: 2285
diff changeset
214 local base_url = module:http_url();
0a3f526779a1 mod_http_upload: Construct the upload slot URL using the LuaSocket URL library (fixes #717)
Kim Alvefur <zash@zash.se>
parents: 2285
diff changeset
215 local slot_url = url.parse(base_url);
2288
827f01cbf6ba mod_http_upload: Handle case of non-existant path
Kim Alvefur <zash@zash.se>
parents: 2287
diff changeset
216 slot_url.path = url.parse_path(slot_url.path or "/");
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
217 t_insert(slot_url.path, random_dir);
2286
0a3f526779a1 mod_http_upload: Construct the upload slot URL using the LuaSocket URL library (fixes #717)
Kim Alvefur <zash@zash.se>
parents: 2285
diff changeset
218 t_insert(slot_url.path, filename);
0a3f526779a1 mod_http_upload: Construct the upload slot URL using the LuaSocket URL library (fixes #717)
Kim Alvefur <zash@zash.se>
parents: 2285
diff changeset
219 slot_url.path.is_directory = false;
0a3f526779a1 mod_http_upload: Construct the upload slot URL using the LuaSocket URL library (fixes #717)
Kim Alvefur <zash@zash.se>
parents: 2285
diff changeset
220 slot_url.path = url.build_path(slot_url.path);
0a3f526779a1 mod_http_upload: Construct the upload slot URL using the LuaSocket URL library (fixes #717)
Kim Alvefur <zash@zash.se>
parents: 2285
diff changeset
221 slot_url = url.build(slot_url);
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
222 return slot_url;
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
223 end
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
224
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
225 -- hooks
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
226 module:hook("iq/host/"..namespace..":request", function (event)
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
227 local stanza, origin = event.stanza, event.origin;
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
228 local request = stanza.tags[1];
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
229 local filename = request.attr.filename;
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
230 local filesize = tonumber(request.attr.size);
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
231
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
232 local slot_url, err = handle_request(origin, stanza, namespace, filename, filesize);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
233 if not slot_url then
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
234 origin.send(err);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
235 return true;
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
236 end
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
237
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
238 local reply = st.reply(stanza)
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
239 :tag("slot", { xmlns = namespace })
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
240 :tag("get", { url = slot_url }):up()
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
241 :tag("put", { url = slot_url }):up()
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
242 :up();
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
243 origin.send(reply);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
244 return true;
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
245 end);
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
246
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
247 module:hook("iq/host/"..legacy_namespace..":request", function (event)
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
248 local stanza, origin = event.stanza, event.origin;
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
249 local request = stanza.tags[1];
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
250 local filename = request:get_child_text("filename");
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
251 local filesize = tonumber(request:get_child_text("size"));
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
252
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
253 local slot_url, err = handle_request(origin, stanza, legacy_namespace, filename, filesize);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
254 if not slot_url then
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
255 origin.send(err);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
256 return true;
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
257 end
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
258
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
259 local reply = st.reply(stanza)
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
260 :tag("slot", { xmlns = legacy_namespace })
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
261 :tag("get"):text(slot_url):up()
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
262 :tag("put"):text(slot_url):up()
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
263 :up();
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
264 origin.send(reply);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
265 return true;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
266 end);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
267
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
268 local measure_upload = function () end
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
269 if module.measure then
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
270 -- COMPAT 0.9
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
271 -- module:measure was added in 0.10
3369
fca95f1b8870 mod_http_upload: Fix order of arguments to :measure
Kim Alvefur <zash@zash.se>
parents: 3366
diff changeset
272 measure_upload = module:measure("upload", "sizes");
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
273 end
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
274
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275 -- http service
3378
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
276 local function set_cross_domain_headers(response)
3446
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
277 local headers = response.headers;
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
278 headers.access_control_allow_methods = "GET, PUT, OPTIONS";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
279 headers.access_control_allow_headers = "Content-Type";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
280 headers.access_control_max_age = "7200";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
281 headers.access_control_allow_origin = response.request.headers.origin or "*";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
282 return response;
3378
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
283 end
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
284
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
285 local function upload_data(event, path)
3377
683365d370d8 mod_http_upload: Also add CORS headers in response to PUT
Matthew Wild <mwild1@gmail.com>
parents: 3376
diff changeset
286 set_cross_domain_headers(event.response);
683365d370d8 mod_http_upload: Also add CORS headers in response to PUT
Matthew Wild <mwild1@gmail.com>
parents: 3376
diff changeset
287
2467
290fef768a81 mod_http_upload: Forget upload slot under some error conditions
Kim Alvefur <zash@zash.se>
parents: 2445
diff changeset
288 local uploader = pending_slots[path];
290fef768a81 mod_http_upload: Forget upload slot under some error conditions
Kim Alvefur <zash@zash.se>
parents: 2445
diff changeset
289 if not uploader then
2191
e47046abf568 mod_http_upload: Add more logging
Kim Alvefur <zash@zash.se>
parents: 2066
diff changeset
290 module:log("warn", "Attempt to upload to unknown slot %q", path);
2193
40824a38d505 mod_http_upload: Return nil if no upload slot is found (should prevent conflicts between multiple instances on the same path)
Kim Alvefur <zash@zash.se>
parents: 2192
diff changeset
291 return; -- 404
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
292 end
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
293 local random_dir, filename = path:match("^([^/]+)/([^/]+)$");
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
294 if not random_dir then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
295 module:log("warn", "Invalid file path %q", path);
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
296 return 400;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
297 end
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
298 if #event.request.body > file_size_limit then
2192
bb8f7785aed7 mod_http_upload: Demote some errors to warnings
Kim Alvefur <zash@zash.se>
parents: 2191
diff changeset
299 module:log("warn", "Uploaded file too large %d bytes", #event.request.body);
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
300 return 400;
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
301 end
2467
290fef768a81 mod_http_upload: Forget upload slot under some error conditions
Kim Alvefur <zash@zash.se>
parents: 2445
diff changeset
302 pending_slots[path] = nil;
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
303 local full_filename = join_path(storage_path, random_dir, filename);
2469
43f7637f0143 mod_http_upload: Make sure that target file does not exist prior to upload
Kim Alvefur <zash@zash.se>
parents: 2468
diff changeset
304 if lfs.attributes(full_filename) then
43f7637f0143 mod_http_upload: Make sure that target file does not exist prior to upload
Kim Alvefur <zash@zash.se>
parents: 2468
diff changeset
305 module:log("warn", "File %s exists already, not replacing it", full_filename);
43f7637f0143 mod_http_upload: Make sure that target file does not exist prior to upload
Kim Alvefur <zash@zash.se>
parents: 2468
diff changeset
306 return 409;
43f7637f0143 mod_http_upload: Make sure that target file does not exist prior to upload
Kim Alvefur <zash@zash.se>
parents: 2468
diff changeset
307 end
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
308 local fh, ferr = io.open(full_filename, "w");
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
309 if not fh then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
310 module:log("error", "Could not open file %s for upload: %s", full_filename, ferr);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
311 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
312 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
313 local ok, err = fh:write(event.request.body);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
314 if not ok then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
315 module:log("error", "Could not write to file %s for upload: %s", full_filename, err);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
316 os.remove(full_filename);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
317 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
318 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
319 ok, err = fh:close();
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
320 if not ok then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
321 module:log("error", "Could not write to file %s for upload: %s", full_filename, err);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
322 os.remove(full_filename);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
323 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
324 end
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
325 measure_upload(#event.request.body);
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
326 module:log("info", "File uploaded by %s to slot %s", uploader, random_dir);
2607
a7ef9b765891 mod_http_upload: Return 201 on successful PUT (as per XEP-0363 and RFC 2616) (Thanks Flow)
Matthew Wild <mwild1@gmail.com>
parents: 2489
diff changeset
327 return 201;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
328 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
329
1912
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
330 -- FIXME Duplicated from net.http.server
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
331
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
332 local codes = require "net.http.codes";
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
333 local headerfix = setmetatable({}, {
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
334 __index = function(t, k)
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
335 local v = "\r\n"..k:gsub("_", "-"):gsub("%f[%w].", s_upper)..": ";
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
336 t[k] = v;
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
337 return v;
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
338 end
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
339 });
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
340
1912
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
341 local function send_response_sans_body(response, body)
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
342 if response.finished then return; end
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
343 response.finished = true;
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
344 response.conn._http_open_response = nil;
2065
624e3fed6f92 mod_http_upload: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 2053
diff changeset
345
1912
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
346 local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]);
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
347 local headers = response.headers;
2738
46b29a377bdf mod_http_upload: Handle HEAD requests in 0.10 when reading body from a file handle
Kim Alvefur <zash@zash.se>
parents: 2732
diff changeset
348 if type(body) == "string" then
46b29a377bdf mod_http_upload: Handle HEAD requests in 0.10 when reading body from a file handle
Kim Alvefur <zash@zash.se>
parents: 2732
diff changeset
349 headers.content_length = #body;
46b29a377bdf mod_http_upload: Handle HEAD requests in 0.10 when reading body from a file handle
Kim Alvefur <zash@zash.se>
parents: 2732
diff changeset
350 elseif io.type(body) == "file" then
46b29a377bdf mod_http_upload: Handle HEAD requests in 0.10 when reading body from a file handle
Kim Alvefur <zash@zash.se>
parents: 2732
diff changeset
351 headers.content_length = body:seek("end");
46b29a377bdf mod_http_upload: Handle HEAD requests in 0.10 when reading body from a file handle
Kim Alvefur <zash@zash.se>
parents: 2732
diff changeset
352 body:close();
46b29a377bdf mod_http_upload: Handle HEAD requests in 0.10 when reading body from a file handle
Kim Alvefur <zash@zash.se>
parents: 2732
diff changeset
353 end
1912
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
354
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
355 local output = { status_line };
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
356 for k,v in pairs(headers) do
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
357 t_insert(output, headerfix[k]..v);
1905
43fac0c2c772 mod_http_upload: Fix HEAD requests
Kim Alvefur <zash@zash.se>
parents: 1874
diff changeset
358 end
1912
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
359 t_insert(output, "\r\n\r\n");
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
360 -- Here we *don't* add the body to the output
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
361
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
362 response.conn:write(t_concat(output));
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
363 if response.on_destroy then
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
364 response:on_destroy();
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
365 response.on_destroy = nil;
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
366 end
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
367 if response.persistent then
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
368 response:finish_cb();
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
369 else
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
370 response.conn:close();
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
371 end
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
372 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373
3625
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
374 local serve_uploaded_files = http_files.serve({ path = storage_path, mime_map = mime_map });
1912
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
375
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
376 local function serve_head(event, path)
3376
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
377 set_cross_domain_headers(event.response);
1912
24c22cbb86e4 mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
Kim Alvefur <zash@zash.se>
parents: 1906
diff changeset
378 event.response.send = send_response_sans_body;
2738
46b29a377bdf mod_http_upload: Handle HEAD requests in 0.10 when reading body from a file handle
Kim Alvefur <zash@zash.se>
parents: 2732
diff changeset
379 event.response.send_file = send_response_sans_body;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
380 return serve_uploaded_files(event, path);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
381 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
382
1942
ff95d983940c mod_http_upload: Say Hello to anyone opening the "bare" HTTP URL (helpful to show that module is loaded correctly)
Kim Alvefur <zash@zash.se>
parents: 1914
diff changeset
383 local function serve_hello(event)
ff95d983940c mod_http_upload: Say Hello to anyone opening the "bare" HTTP URL (helpful to show that module is loaded correctly)
Kim Alvefur <zash@zash.se>
parents: 1914
diff changeset
384 event.response.headers.content_type = "text/html;charset=utf-8"
2947
faec53f4b31e mod_http_upload: Include the current VirtualHost name in greeting to help with debugging
Kim Alvefur <zash@zash.se>
parents: 2800
diff changeset
385 return "<!DOCTYPE html>\n<h1>Hello from mod_"..module.name.." on "..module.host.."!</h1>\n";
1942
ff95d983940c mod_http_upload: Say Hello to anyone opening the "bare" HTTP URL (helpful to show that module is loaded correctly)
Kim Alvefur <zash@zash.se>
parents: 1914
diff changeset
386 end
ff95d983940c mod_http_upload: Say Hello to anyone opening the "bare" HTTP URL (helpful to show that module is loaded correctly)
Kim Alvefur <zash@zash.se>
parents: 1914
diff changeset
387
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
388 module:provides("http", {
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
389 route = {
1942
ff95d983940c mod_http_upload: Say Hello to anyone opening the "bare" HTTP URL (helpful to show that module is loaded correctly)
Kim Alvefur <zash@zash.se>
parents: 1914
diff changeset
390 ["GET"] = serve_hello;
ff95d983940c mod_http_upload: Say Hello to anyone opening the "bare" HTTP URL (helpful to show that module is loaded correctly)
Kim Alvefur <zash@zash.se>
parents: 1914
diff changeset
391 ["GET /"] = serve_hello;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
392 ["GET /*"] = serve_uploaded_files;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
393 ["HEAD /*"] = serve_head;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
394 ["PUT /*"] = upload_data;
3376
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
395
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
396 ["OPTIONS /*"] = function (event)
3379
f1c1f6bc4892 mod_http_upload: Remove extra check for Origin HTTP header
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3378
diff changeset
397 set_cross_domain_headers(event.response);
3376
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
398 return "";
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
399 end;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
400 };
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
401 });
1849
5244c9b0b297 mod_http_upload: Log a message with the upload URL and storage path for easy discovery
Kim Alvefur <zash@zash.se>
parents: 1848
diff changeset
402
5244c9b0b297 mod_http_upload: Log a message with the upload URL and storage path for easy discovery
Kim Alvefur <zash@zash.se>
parents: 1848
diff changeset
403 module:log("info", "URL: <%s>; Storage path: %s", module:http_url(), storage_path);
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
404
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
405 function module.command(args)
3341
1e1dbd7e5b6c mod_http_upload: Use legacy datamanager directly (makes it work)
Kim Alvefur <zash@zash.se>
parents: 3340
diff changeset
406 datamanager = require "core.storagemanager".olddm;
3339
babb584e24a2 mod_http_upload: Run expiry for all users if command run with a hostname
Kim Alvefur <zash@zash.se>
parents: 3176
diff changeset
407 -- luacheck: ignore 421/user
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
408 if args[1] == "expire" then
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
409 local split = require "util.jid".prepped_split;
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
410 for i = 2, #args do
3339
babb584e24a2 mod_http_upload: Run expiry for all users if command run with a hostname
Kim Alvefur <zash@zash.se>
parents: 3176
diff changeset
411 local user, host = split(args[i]);
babb584e24a2 mod_http_upload: Run expiry for all users if command run with a hostname
Kim Alvefur <zash@zash.se>
parents: 3176
diff changeset
412 if user then
babb584e24a2 mod_http_upload: Run expiry for all users if command run with a hostname
Kim Alvefur <zash@zash.se>
parents: 3176
diff changeset
413 assert(expire(user, host));
babb584e24a2 mod_http_upload: Run expiry for all users if command run with a hostname
Kim Alvefur <zash@zash.se>
parents: 3176
diff changeset
414 else
3340
6081cbfd1220 mod_http_upload: Abort and throw error in case of failure to iterate over users
Kim Alvefur <zash@zash.se>
parents: 3339
diff changeset
415 for user in assert(datamanager.users(host, module.name, "list")) do
3339
babb584e24a2 mod_http_upload: Run expiry for all users if command run with a hostname
Kim Alvefur <zash@zash.se>
parents: 3176
diff changeset
416 expire(user, host);
babb584e24a2 mod_http_upload: Run expiry for all users if command run with a hostname
Kim Alvefur <zash@zash.se>
parents: 3176
diff changeset
417 end
babb584e24a2 mod_http_upload: Run expiry for all users if command run with a hostname
Kim Alvefur <zash@zash.se>
parents: 3176
diff changeset
418 end
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
419 end
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
420 end
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
421 end
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
422