annotate mod_http_upload/mod_http_upload.lua @ 4260:c539334dd01a

mod_http_oauth2: Rescope oauth client config into users' storage This produces client_id of the form owner@host/random and prevents clients from being deleted by registering an account with the same name and then deleting the account, as well as having the client automatically be deleted when the owner account is removed. On one hand, this leaks the bare JID of the creator to users. On the other hand, it makes it obvious who made the oauth application. This module is experimental and only for developers, so this can be changed if a better method comes up.
author Kim Alvefur <zash@zash.se>
date Sat, 21 Nov 2020 23:55:10 +0100
parents f1f796e551f1
children 0a56dc6c61af
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;
3713
53fc4b612fb2 mod_http_upload: Skip custom HEAD handling on recent Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3661
diff changeset
20 local httpserver = require "net.http.server";
2665
cfb7936ff61f mod_http_upload: Use the new util.id if available (in 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2651
diff changeset
21 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
22 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
23 if have_id then
2666
99c0b1bacdcd mod_http_upload: Where did those parenthesis come from?
Kim Alvefur <zash@zash.se>
parents: 2665
diff changeset
24 uuid = id.medium;
2646
45ef16ebe565 mod_http_upload: Generate shorter directory names (closes #822)
Kim Alvefur <zash@zash.se>
parents: 2641
diff changeset
25 end
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26
2646
45ef16ebe565 mod_http_upload: Generate shorter directory names (closes #822)
Kim Alvefur <zash@zash.se>
parents: 2641
diff changeset
27 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
28 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
29 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
30
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
31 -- config
2053
40056a27f394 mod_http_upload: Lower default size limit to 1MB
Kim Alvefur <zash@zash.se>
parents: 1967
diff changeset
32 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
33 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
34 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
35
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
36 --- 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
37 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
38 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
39 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
40 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
41 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
42 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
43
4076
f1f796e551f1 mod_http_upload: Log warning when loaded on user host
Matthew Wild <mwild1@gmail.com>
parents: 3962
diff changeset
44 if prosody.hosts[module.host].type == "local" then
f1f796e551f1 mod_http_upload: Log warning when loaded on user host
Matthew Wild <mwild1@gmail.com>
parents: 3962
diff changeset
45 module:log("warn", "mod_%s loaded on a user host, this may be incompatible with some client software, see docs for correct usage", module.name);
f1f796e551f1 mod_http_upload: Log warning when loaded on user host
Matthew Wild <mwild1@gmail.com>
parents: 3962
diff changeset
46 end
f1f796e551f1 mod_http_upload: Log warning when loaded on user host
Matthew Wild <mwild1@gmail.com>
parents: 3962
diff changeset
47
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 -- depends
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 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
50 module:depends("disco");
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51
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
52 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
53
b059a3fb2a58 Update modules using mod_http_files to serve files for change in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
54 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
55 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
56 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
57 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
58 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
59
3625
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
60 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
61 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
62 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
63 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
64 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
65 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
66 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
67 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
68 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
69 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
70 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
71 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
72 };
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
73 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
74
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
75 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
76 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
77 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
78 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
79 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
80 __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
81 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
82 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
83 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
84 end
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
85 });
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
86 end
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
87 end
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
88
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
89 -- namespaces
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
90 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
91 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
92
2287
e1a8c2324937 mod_http_upload: Add a comment
Kim Alvefur <zash@zash.se>
parents: 2286
diff changeset
93 -- identity and feature advertising
2444
3e9f9cef9c0e mod_http_upload: Add missing semicolon
Kim Alvefur <zash@zash.se>
parents: 2443
diff changeset
94 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
95 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
96 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
97
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
98 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
99 { 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
100 { name = "max-file-size", type = "text-single" },
3648
aa12b95a6d36 mod_http_upload: Ensure integer formatting of size limit
Kim Alvefur <zash@zash.se>
parents: 3625
diff changeset
101 }:form({ ["max-file-size"] = ("%d"):format(file_size_limit) }, "result"));
2641
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
102
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
103 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
104 { 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
105 { name = "max-file-size", type = "text-single" },
3648
aa12b95a6d36 mod_http_upload: Ensure integer formatting of size limit
Kim Alvefur <zash@zash.se>
parents: 3625
diff changeset
106 }:form({ ["max-file-size"] = ("%d"):format(file_size_limit) }, "result"));
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
107
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 -- state
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 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
110
1967
2ce2b194d501 mod_http_upload: Make file system path configurable
Kim Alvefur <zash@zash.se>
parents: 1966
diff changeset
111 local storage_path = module:get_option_string(module.name .. "_path", join_path(prosody.paths.data, module.name));
3661
88d414c916ee mod_http_upload: Back out 3fb0add97cdb - depends on yet uncommon lfs version
Kim Alvefur <zash@zash.se>
parents: 3659
diff changeset
112 lfs.mkdir(storage_path);
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113
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
114 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
115 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
116 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
117 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
118 if not uploads then return true; end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
119 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
120 local expiry = os.time() - max_age;
2688
ef80c9d0ebff mod_http_upload: Remove unused upload slots
Kim Alvefur <zash@zash.se>
parents: 2687
diff changeset
121 local upload_window = os.time() - 900;
3659
bb8a6df5ecba mod_http_upload: Skip write if nothing expired when checking
Kim Alvefur <zash@zash.se>
parents: 3658
diff changeset
122 local before = #uploads;
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
123 uploads:filter(function (item)
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
124 local filename = item.filename;
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
125 if item.dir then
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
126 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
127 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
128 if item.time < expiry then
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
129 local deleted, whynot = os.remove(filename);
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
130 if not deleted then
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
131 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
132 end
2732
b1c5b0c369c2 mod_http_upload: Remove directory when deleting a file (fixes #950)
Kim Alvefur <zash@zash.se>
parents: 2731
diff changeset
133 os.remove(filename:match("^(.*)[/\\]"));
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
134 return false;
2691
92ddfc548ce8 mod_http_upload: Store filename and directory separately
Kim Alvefur <zash@zash.se>
parents: 2690
diff changeset
135 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
136 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
137 end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
138 return true;
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
139 end);
3659
bb8a6df5ecba mod_http_upload: Skip write if nothing expired when checking
Kim Alvefur <zash@zash.se>
parents: 3658
diff changeset
140 local after = #uploads;
bb8a6df5ecba mod_http_upload: Skip write if nothing expired when checking
Kim Alvefur <zash@zash.se>
parents: 3658
diff changeset
141 if before == after then return true end -- nothing changed, skip write
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
142 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
143 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
144
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
145 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
146 if not quota then return true; end
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
147 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
148 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
149 return false;
85057c4e7b66 mod_http_upload: Consider quota reached if it can't be checked
Kim Alvefur <zash@zash.se>
parents: 3549
diff changeset
150 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
151 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
152 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
153 end
3588
85057c4e7b66 mod_http_upload: Consider quota reached if it can't be checked
Kim Alvefur <zash@zash.se>
parents: 3549
diff changeset
154 return true;
85057c4e7b66 mod_http_upload: Consider quota reached if it can't be checked
Kim Alvefur <zash@zash.se>
parents: 3549
diff changeset
155 end
2678
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
156 local sum = does_it_fit or 0;
2687
5f0b755b42a3 Backed out changeset e491a15d7621 (closes #888)
Kim Alvefur <zash@zash.se>
parents: 2684
diff changeset
157 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
158 sum = sum + item.size;
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
159 end
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
160 return sum < quota;
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
161 end
2dec7cad9218 mod_http_upload: Implement quota support (closes #823)
Kim Alvefur <zash@zash.se>
parents: 2677
diff changeset
162
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
163 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
164 if module.measure then
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
165 -- COMPAT 0.9
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
166 -- 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
167 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
168 end
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
169
2731
d48faff92490 mod_http_upload: Remove MIME type restrictions and checking (fixes #958)
Kim Alvefur <zash@zash.se>
parents: 2692
diff changeset
170 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
171 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
172 -- local clients only
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
173 if origin.type ~= "c2s" then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
174 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
175 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
176 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
177 -- validate
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
178 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
179 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
180 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
181 end
2689
0fc706855af9 mod_http_upload: Keep user- and hostname in locals
Kim Alvefur <zash@zash.se>
parents: 2688
diff changeset
182 expire(username, host);
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
183 if not filesize then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
184 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
185 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
186 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
187 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
188 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
189 :tag("file-too-large", {xmlns=xmlns})
3649
d252c8573f33 mod_http_upload: Also format max file size as integer in error (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 3648
diff changeset
190 :tag("max-file-size"):text(("%d"):format(file_size_limit));
2689
0fc706855af9 mod_http_upload: Keep user- and hostname in locals
Kim Alvefur <zash@zash.se>
parents: 2688
diff changeset
191 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
192 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
193 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
194 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
195
2800
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
196 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
197 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
198
8d9aed6d1f87 mod_http_upload: Only try to create a randomly named directory once.
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
199 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
200 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
201 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
202 end
2468
3bff2848af12 mod_http_upload: Create random directory name when assigning slot
Kim Alvefur <zash@zash.se>
parents: 2467
diff changeset
203
2690
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
204 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
205 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
206
2690
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
207 if not ok then
3176
d34f5d969940 mod_http_upload: use correct error condition
Jonas Wielicki <jonas@wielicki.name>
parents: 3011
diff changeset
208 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
209 end
43ad92c5b91a mod_http_upload: Return an error if unable to store slot info
Kim Alvefur <zash@zash.se>
parents: 2689
diff changeset
210
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
211 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
212 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
213
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
214 module:add_timer(900, function()
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
215 pending_slots[slot] = nil;
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
216 end);
3fd50495c89d mod_http_upload: Clear unused slots after 15 minutes
Kim Alvefur <zash@zash.se>
parents: 2681
diff changeset
217
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
218 measure_slot(filesize);
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
219
2767
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
220 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
221
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
222 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
223 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
224 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
225 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
226 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
227 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
228 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
229 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
230 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
231 end
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
232
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
233 -- hooks
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
234 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
235 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
236 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
237 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
238 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
239
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
240 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
241 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
242 origin.send(err);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
243 return true;
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
244 end
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
245
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
246 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
247 :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
248 :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
249 :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
250 :up();
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
251 origin.send(reply);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
252 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
253 end);
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
254
2d83e6c8160b mod_http_upload: add support for XEP-0363 version 0.3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2607
diff changeset
255 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
256 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
257 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
258 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
259 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
260
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
261 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
262 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
263 origin.send(err);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
264 return true;
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
265 end
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
266
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
267 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
268 :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
269 :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
270 :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
271 :up();
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
272 origin.send(reply);
e1edf643fbb1 mod_http_upload: Send a correct response on namespace :0.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2738
diff changeset
273 return true;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
274 end);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
276 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
277 if module.measure then
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
278 -- COMPAT 0.9
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
279 -- 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
280 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
281 end
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
282
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
283 -- http service
3378
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
284 local function set_cross_domain_headers(response)
3446
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
285 local headers = response.headers;
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
286 headers.access_control_allow_methods = "GET, PUT, OPTIONS";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
287 headers.access_control_allow_headers = "Content-Type";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
288 headers.access_control_max_age = "7200";
a5a50cd34386 mod_http_upload: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 3380
diff changeset
289 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
290 return response;
3378
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
291 end
aefd64629e29 mod_http_upload: Relocate function definition to avoid traceback
Matthew Wild <mwild1@gmail.com>
parents: 3377
diff changeset
292
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
293 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
294 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
295
2467
290fef768a81 mod_http_upload: Forget upload slot under some error conditions
Kim Alvefur <zash@zash.se>
parents: 2445
diff changeset
296 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
297 if not uploader then
2191
e47046abf568 mod_http_upload: Add more logging
Kim Alvefur <zash@zash.se>
parents: 2066
diff changeset
298 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
299 return; -- 404
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
300 end
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
301 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
302 if not random_dir then
2207
c45ad4b7aaa3 mod_http_upload: Add additional debug logging
Kim Alvefur <zash@zash.se>
parents: 2193
diff changeset
303 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
304 return 400;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
305 end
1851
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
306 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
307 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
308 return 400;
03c5639882a7 mod_http_upload: Add support for a file size limit
Kim Alvefur <zash@zash.se>
parents: 1850
diff changeset
309 end
2467
290fef768a81 mod_http_upload: Forget upload slot under some error conditions
Kim Alvefur <zash@zash.se>
parents: 2445
diff changeset
310 pending_slots[path] = nil;
2649
abea818eed7b mod_http_upload: Rename variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2648
diff changeset
311 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
312 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
313 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
314 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
315 end
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
316 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
317 if not fh then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
318 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
319 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
320 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
321 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
322 if not ok then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
323 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
324 os.remove(full_filename);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
325 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
326 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
327 ok, err = fh:close();
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
328 if not ok then
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
329 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
330 os.remove(full_filename);
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
331 return 500;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
332 end
3366
6d1c5ecf72c1 mod_http_upload: Report statistics on upload sizes (0.10+)
Kim Alvefur <zash@zash.se>
parents: 3341
diff changeset
333 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
334 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
335 return 201;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
337
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 -- 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
339
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
340 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
341 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
342 __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
343 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
344 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
345 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
346 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
347 });
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
348
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
349 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
350 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
351 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
352 response.conn._http_open_response = nil;
2065
624e3fed6f92 mod_http_upload: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 2053
diff changeset
353
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 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
355 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
356 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
357 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
358 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
359 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
360 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
361 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
362
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 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
364 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
365 t_insert(output, headerfix[k]..v);
1905
43fac0c2c772 mod_http_upload: Fix HEAD requests
Kim Alvefur <zash@zash.se>
parents: 1874
diff changeset
366 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
367 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
368 -- 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
369
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: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
371 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
372 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
373 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
374 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
375 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
376 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
377 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
378 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
379 end
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
380 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
381
3625
a578b4977bb0 mod_http_upload: Duplicate mime types handling from mod_http_files (fixes #1374)
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
382 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
383
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
384 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
385 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
386 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
387 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
388 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
389 end
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
390
3713
53fc4b612fb2 mod_http_upload: Skip custom HEAD handling on recent Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3661
diff changeset
391 if httpserver.send_head_response then
53fc4b612fb2 mod_http_upload: Skip custom HEAD handling on recent Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3661
diff changeset
392 -- Prosody will take care of HEAD requests since hg:3f4c25425589
53fc4b612fb2 mod_http_upload: Skip custom HEAD handling on recent Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3661
diff changeset
393 serve_head = nil
53fc4b612fb2 mod_http_upload: Skip custom HEAD handling on recent Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3661
diff changeset
394 end
53fc4b612fb2 mod_http_upload: Skip custom HEAD handling on recent Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3661
diff changeset
395
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
396 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
397 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
398 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
399 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
400
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
401 module:provides("http", {
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
402 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
403 ["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
404 ["GET /"] = serve_hello;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
405 ["GET /*"] = serve_uploaded_files;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
406 ["HEAD /*"] = serve_head;
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
407 ["PUT /*"] = upload_data;
3376
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
408
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
409 ["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
410 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
411 return "";
972832108c78 mod_http_upload: Add CORS headers for web clients (untested)
Matthew Wild <mwild1@gmail.com>
parents: 3369
diff changeset
412 end;
1772
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
413 };
45f7e3c2557f mod_http_upload: Implementation of Conversations HTTP upload file transfer mode
Kim Alvefur <zash@zash.se>
parents:
diff changeset
414 });
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
415
3658
02a1615d0392 mod_http_upload: Add hint about checking that the base URL is reachable
Kim Alvefur <zash@zash.se>
parents: 3657
diff changeset
416 module:log("info", "URL: <%s> - Ensure this can be reached by users", module:http_url());
02a1615d0392 mod_http_upload: Add hint about checking that the base URL is reachable
Kim Alvefur <zash@zash.se>
parents: 3657
diff changeset
417 module:log("info", "Storage path: '%s'", storage_path);
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
418
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
419 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
420 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
421 -- luacheck: ignore 421/user
3962
190e74e097ee mod_http_upload: Show help message if not at least one host/user is given
Kim Alvefur <zash@zash.se>
parents: 3961
diff changeset
422 if args[1] == "expire" and args[2] then
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
423 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
424 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
425 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
426 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
427 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
428 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
429 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
430 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
431 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
432 end
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
433 end
3961
6fd9c9708422 mod_http_upload: Add some kind of help message to prosodyctl command
Kim Alvefur <zash@zash.se>
parents: 3713
diff changeset
434 else
6fd9c9708422 mod_http_upload: Add some kind of help message to prosodyctl command
Kim Alvefur <zash@zash.se>
parents: 3713
diff changeset
435 print("prosodyctl mod_http_upload expire [host or user@host]+")
6fd9c9708422 mod_http_upload: Add some kind of help message to prosodyctl command
Kim Alvefur <zash@zash.se>
parents: 3713
diff changeset
436 print("\tProcess upload expiry for the given list of hosts and/or users");
6fd9c9708422 mod_http_upload: Add some kind of help message to prosodyctl command
Kim Alvefur <zash@zash.se>
parents: 3713
diff changeset
437 return 1;
3011
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
438 end
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
439 end
995836ee4f26 mod_http_upload: Add an experimental prosodyctl command for expiring uploads
Kim Alvefur <zash@zash.se>
parents: 2947
diff changeset
440