annotate mod_http_upload/mod_http_upload.lua @ 3568:6b3181fe5617

mod_auth_token: Timezone fix for TOTP checking luatz.time() returns milliseconds since epoch which is in UTC time, so we don't need to convert to UTC with gmtime. By calling gmtime, TOTP validation was failing when this module wasn't running on machine set to UTC time.
author JC Brand <jc@opkode.com>
date Thu, 02 May 2019 11:07:27 +0200
parents b059a3fb2a58
children 85057c4e7b66
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
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
55 -- namespaces
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
56 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
57 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
58
2287
e1a8c2324937 mod_http_upload: Add a comment
Kim Alvefur <zash@zash.se>
parents: 2286
diff changeset
59 -- identity and feature advertising
2444
3e9f9cef9c0e mod_http_upload: Add missing semicolon
Kim Alvefur <zash@zash.se>
parents: 2443
diff changeset
60 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
61 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
62 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
63
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
64 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
65 { 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
66 { 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
67 }: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
68
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
69 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
70 { 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
71 { 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
72 }: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
73
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 -- state
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 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
76
1967
2ce2b194d501 mod_http_upload: Make file system path configurable
Kim Alvefur <zash@zash.se>
parents: 1966
diff changeset
77 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
78 lfs.mkdir(storage_path);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79
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
80 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
81 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
82 local uploads, err = datamanager.list_load(username, host, module.name);
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
83 if not uploads then return true; end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
84 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
85 local expiry = os.time() - max_age;
2688
ef80c9d0ebff mod_http_upload: Remove unused upload slots
Kim Alvefur <zash@zash.se>
parents: 2687
diff changeset
86 local upload_window = os.time() - 900;
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
87 uploads:filter(function (item)
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
88 local filename = item.filename;
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
89 if item.dir then
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
90 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
91 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
92 if item.time < expiry then
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
93 local deleted, whynot = os.remove(filename);
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
94 if not deleted then
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
95 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
96 end
2732
b1c5b0c369c2 mod_http_upload: Remove directory when deleting a file (fixes #950)
Kim Alvefur <zash@zash.se>
parents: 2731
diff changeset
97 os.remove(filename:match("^(.*)[/\\]"));
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
98 return false;
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
99 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
100 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
101 end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
102 return true;
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
103 end);
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
104 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
105 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
106
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
107 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
108 if not quota then return true; end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
109 local uploads, err = datamanager.list_load(username, host, module.name);
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
110 if not uploads then return true; end
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
111 local sum = does_it_fit or 0;
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
112 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
113 sum = sum + item.size;
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
114 end
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
115 return sum < quota;
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
116 end
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
117
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
118 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
119 if module.measure then
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
120 -- COMPAT 0.9
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
121 -- 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
122 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
123 end
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
124
2731
d48faff92490 mod_http_upload: Remove MIME type restrictions and checking (fixes #958)
Kim Alvefur <zash@zash.se>
parents: 2692
diff changeset
125 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
126 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
127 -- local clients only
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 if origin.type ~= "c2s" then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
129 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
130 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
131 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 -- validate
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 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
134 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
135 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
136 end
2689
0fc706855af9 mod_http_upload: Keep user- and hostname in locals
Kim Alvefur <zash@zash.se>
parents: 2688
diff changeset
137 expire(username, host);
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
138 if not filesize then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
139 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
140 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
141 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
142 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
143 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
144 :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
145 :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
146 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
147 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
148 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
149 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
150
2800
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
151 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
152 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
153
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
154 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
155 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
156 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
157 end
2468
3bff2848af12 mod_http_upload: Create random directory name when assigning slot
Kim Alvefur <zash@zash.se>
parents: 2467
diff changeset
158
2690
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
159 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
160 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
161
2690
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
162 if not ok then
3176
d34f5d969940 mod_http_upload: use correct error condition
Jonas Wielicki <jonas@wielicki.name>
parents: 3011
diff changeset
163 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
164 end
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
165
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
166 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
167 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
168
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
169 module:add_timer(900, function()
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
170 pending_slots[slot] = nil;
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
171 end);
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
172
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
173 measure_slot(filesize);
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
174
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
175 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
176
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
177 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
178 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
179 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
180 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
181 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
182 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
183 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
184 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
185 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
186 end
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
187
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
188 -- hooks
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
189 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
190 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
191 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
192 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
193 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
194
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
195 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
196 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
197 origin.send(err);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
198 return true;
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
199 end
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
200
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
201 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
202 :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
203 :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
204 :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
205 :up();
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
206 origin.send(reply);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
207 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
208 end);
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
209
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
210 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
211 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
212 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
213 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
214 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
215
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
216 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
217 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
218 origin.send(err);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
219 return true;
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
220 end
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
221
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
222 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
223 :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
224 :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
225 :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
226 :up();
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
227 origin.send(reply);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
228 return true;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229 end);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
231 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
232 if module.measure then
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
233 -- COMPAT 0.9
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
234 -- 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
235 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
236 end
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
237
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
238 -- http service
3378
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
239 local function set_cross_domain_headers(response)
3446
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
240 local headers = response.headers;
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
241 headers.access_control_allow_methods = "GET, PUT, OPTIONS";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
242 headers.access_control_allow_headers = "Content-Type";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
243 headers.access_control_max_age = "7200";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
244 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
245 return response;
3378
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
246 end
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
247
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
248 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
249 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
250
2467
290fef768a81 mod_http_upload: Forget upload slot under some error conditions
Kim Alvefur <zash@zash.se>
parents: 2445
diff changeset
251 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
252 if not uploader then
2191
e47046abf568 mod_http_upload: Add more logging
Kim Alvefur <zash@zash.se>
parents: 2066
diff changeset
253 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
254 return; -- 404
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
255 end
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
256 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
257 if not random_dir then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
258 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
259 return 400;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
260 end
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
261 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
262 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
263 return 400;
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
264 end
2467
290fef768a81 mod_http_upload: Forget upload slot under some error conditions
Kim Alvefur <zash@zash.se>
parents: 2445
diff changeset
265 pending_slots[path] = nil;
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
266 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
267 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
268 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
269 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
270 end
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
271 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
272 if not fh then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
273 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
274 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
276 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
277 if not ok then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
278 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
279 os.remove(full_filename);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
280 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
281 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
282 ok, err = fh:close();
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
283 if not ok then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
284 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
285 os.remove(full_filename);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
286 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
287 end
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
288 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
289 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
290 return 201;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
291 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
292
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
293 -- 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
294
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
295 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
296 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
297 __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
298 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
299 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
300 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
301 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
302 });
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
303
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
304 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
305 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
306 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
307 response.conn._http_open_response = nil;
2065
624e3fed6f92 mod_http_upload: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 2053
diff changeset
308
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
309 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
310 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
311 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
312 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
313 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
314 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
315 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
316 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
317
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
318 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
319 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
320 t_insert(output, headerfix[k]..v);
1905
43fac0c2c772 mod_http_upload: Fix HEAD requests
Kim Alvefur <zash@zash.se>
parents: 1874
diff changeset
321 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
322 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
323 -- 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
324
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
325 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
326 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
327 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
328 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
329 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
330 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
331 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
332 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
333 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
334 end
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
335 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336
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
337 local serve_uploaded_files = http_files.serve(storage_path);
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
338
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
339 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
340 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
341 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
342 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
343 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
344 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
345
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
346 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
347 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
348 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
349 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
350
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
351 module:provides("http", {
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
352 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
353 ["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
354 ["GET /"] = serve_hello;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
355 ["GET /*"] = serve_uploaded_files;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
356 ["HEAD /*"] = serve_head;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
357 ["PUT /*"] = upload_data;
3376
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
358
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
359 ["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
360 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
361 return "";
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
362 end;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
363 };
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
364 });
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
365
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
366 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
367
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
368 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
369 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
370 -- 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
371 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
372 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
373 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
374 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
375 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
376 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
377 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
378 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
379 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
380 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
381 end
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
382 end
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
383 end
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
384 end
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
385