Software /
code /
prosody-modules
Annotate
mod_http_upload/mod_http_upload.lua @ 4300:3f3b672b7616
mod_vcard_muc: Pass room object around instead of JID, hopefully fixing traceback
More efficient to pass the object around instead of using the JID
and looking up the object when needed.
It seems in some (undetermined) cases get_room_from_jid(room.jid) is nil.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 15 Dec 2020 10:49:11 +0000 |
parent | 4076:f1f796e551f1 |
child | 4443:0a56dc6c61af |
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 | 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 |