mod_http_upload_external/mod_http_upload_external.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 4513 16995e7624f0
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- mod_http_upload_external
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
--
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
-- Copyright (C) 2015-2016 Kim Alvefur
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
--
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
-- This file is MIT/X11 licensed.
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
--
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
-- imports
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local st = require"util.stanza";
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local uuid = require"util.uuid".generate;
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local http = require "util.http";
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
local dataform = require "util.dataforms".new;
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
local HMAC = require "util.hashes".hmac_sha256;
4513
16995e7624f0 mod_http_upload_external: add access control option
Nicolas Cedilnik <nicoco@nicoco.fr>
parents: 3171
diff changeset
    14
local jid = require "util.jid";
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
-- config
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
local file_size_limit = module:get_option_number(module.name .. "_file_size_limit", 100 * 1024 * 1024); -- 100 MB
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    18
local base_url = assert(module:get_option_string(module.name .. "_base_url"),
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    19
	module.name .. "_base_url is a required option");
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    20
local secret = assert(module:get_option_string(module.name .. "_secret"),
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    21
	module.name .. "_secret is a required option");
4513
16995e7624f0 mod_http_upload_external: add access control option
Nicolas Cedilnik <nicoco@nicoco.fr>
parents: 3171
diff changeset
    22
local access = module:get_option_set(module.name .. "_access", {});
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    23
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    24
local token_protocol = module:get_option_string(module.name .. "_protocol", "v1");
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
-- depends
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
module:depends("disco");
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
-- namespace
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    30
local legacy_namespace = "urn:xmpp:http:upload";
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    31
local namespace = "urn:xmpp:http:upload:0";
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
-- identity and feature advertising
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
module:add_identity("store", "file", module:get_option_string("name", "HTTP File Upload"))
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    35
module:add_feature(namespace);
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    36
module:add_feature(legacy_namespace);
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
module:add_extension(dataform {
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    39
	{ name = "FORM_TYPE", type = "hidden", value = namespace },
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    40
	{ name = "max-file-size", type = "text-single" },
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    41
}:form({ ["max-file-size"] = tostring(file_size_limit) }, "result"));
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    42
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    43
module:add_extension(dataform {
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    44
	{ name = "FORM_TYPE", type = "hidden", value = legacy_namespace },
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
	{ name = "max-file-size", type = "text-single" },
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
}:form({ ["max-file-size"] = tostring(file_size_limit) }, "result"));
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    48
local function magic_crypto_dust(random, filename, filesize, filetype)
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    49
	local param, message;
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    50
	if token_protocol == "v1" then
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    51
		param, message = "v", string.format("%s/%s %d", random, filename, filesize);
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    52
	else
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    53
		param, message = "v2", string.format("%s/%s\0%d\0%s", random, filename, filesize, filetype);
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    54
	end
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
	local digest = HMAC(secret, message, true);
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
	random, filename = http.urlencode(random), http.urlencode(filename);
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    57
	return base_url .. random .. "/" .. filename, "?"..param.."=" .. digest;
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
end
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    60
local function handle_request(origin, stanza, xmlns, filename, filesize, filetype)
4513
16995e7624f0 mod_http_upload_external: add access control option
Nicolas Cedilnik <nicoco@nicoco.fr>
parents: 3171
diff changeset
    61
	local user_bare = jid.bare(stanza.attr.from);
16995e7624f0 mod_http_upload_external: add access control option
Nicolas Cedilnik <nicoco@nicoco.fr>
parents: 3171
diff changeset
    62
	local user_host = jid.host(user_bare);
16995e7624f0 mod_http_upload_external: add access control option
Nicolas Cedilnik <nicoco@nicoco.fr>
parents: 3171
diff changeset
    63
16995e7624f0 mod_http_upload_external: add access control option
Nicolas Cedilnik <nicoco@nicoco.fr>
parents: 3171
diff changeset
    64
	-- local clients or whitelisted jids/hosts only
16995e7624f0 mod_http_upload_external: add access control option
Nicolas Cedilnik <nicoco@nicoco.fr>
parents: 3171
diff changeset
    65
	if not (origin.type == "c2s" or access:contains(user_bare) or access:contains(user_host)) then
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
		module:log("debug", "Request for upload slot from a %s", origin.type);
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
		origin.send(st.error_reply(stanza, "cancel", "not-authorized"));
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    68
		return nil, nil;
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
	end
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
	-- validate
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
	if not filename or filename:find("/") then
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
		module:log("debug", "Filename %q not allowed", filename or "");
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
		origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid filename"));
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    74
		return nil, nil;
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
	end
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
	if not filesize then
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
		module:log("debug", "Missing file size");
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
		origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing or invalid file size"));
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    79
		return nil, nil;
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
	elseif filesize > file_size_limit then
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
		module:log("debug", "File too large (%d > %d)", filesize, file_size_limit);
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
		origin.send(st.error_reply(stanza, "modify", "not-acceptable", "File too large",
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    83
			st.stanza("file-too-large", {xmlns=xmlns})
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
				:tag("max-size"):text(tostring(file_size_limit))));
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    85
		return nil, nil;
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    86
	end
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    87
	local random = uuid();
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
    88
	local get_url, verify = magic_crypto_dust(random, filename, filesize, filetype);
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    89
	local put_url = get_url .. verify;
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    90
3171
bedd3f4a8f90 mod_http_upload_external: Reduce slot request log level from info to debug for privacy improvement
Matthew Wild <mwild1@gmail.com>
parents: 3170
diff changeset
    91
	module:log("debug", "Handing out upload slot %s to %s@%s [%d %s]", get_url, origin.username, origin.host, filesize, filetype);
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    92
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    93
	return get_url, put_url;
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    94
end
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    95
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    96
-- hooks
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    97
module:hook("iq/host/"..legacy_namespace..":request", function (event)
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    98
	local stanza, origin = event.stanza, event.origin;
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
    99
	local request = stanza.tags[1];
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   100
	local filename = request:get_child_text("filename");
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   101
	local filesize = tonumber(request:get_child_text("size"));
3170
44a187c82b53 mod_http_upload_external: Fix to read content-type from correct place in stanza
Matthew Wild <mwild1@gmail.com>
parents: 3169
diff changeset
   102
	local filetype = request:get_child_text("content-type") or "application/octet-stream";
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   103
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   104
	local get_url, put_url = handle_request(
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
   105
		origin, stanza, legacy_namespace, filename, filesize, filetype);
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   106
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   107
	if not get_url then
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   108
		-- error was already sent
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   109
		return true;
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   110
	end
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   111
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   112
	local reply = st.reply(stanza)
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   113
		:tag("slot", { xmlns = legacy_namespace })
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   114
			:tag("get"):text(get_url):up()
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   115
			:tag("put"):text(put_url):up()
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   116
		:up();
2336
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   117
	origin.send(reply);
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   118
	return true;
c2cf5b40b66d mod_http_upload_external: Variant of mod_http_upload that delegates HTTP handling to other server using signed URLs
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   119
end);
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   120
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   121
module:hook("iq/host/"..namespace..":request", function (event)
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   122
	local stanza, origin = event.stanza, event.origin;
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   123
	local request = stanza.tags[1];
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   124
	local filename = request.attr.filename;
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   125
	local filesize = tonumber(request.attr.size);
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
   126
	local filetype = request.attr["content-type"] or "application/octet-stream";
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
   127
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   128
	local get_url, put_url = handle_request(
2982
ac99a04231b1 mod_http_upload_external: Add newer 'v2' protocol (and share_v2.php) which supports content-type preservation
Matthew Wild <mwild1@gmail.com>
parents: 2943
diff changeset
   129
		origin, stanza, namespace, filename, filesize, filetype);
2881
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   130
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   131
	if not get_url then
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   132
		-- error was already sent
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   133
		return true;
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   134
	end
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   135
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   136
	local reply = st.reply(stanza)
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   137
		:tag("slot", { xmlns = namespace})
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   138
			:tag("get", { url = get_url }):up()
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   139
			:tag("put", { url = put_url }):up()
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   140
		:up();
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   141
	origin.send(reply);
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   142
	return true;
d6badf56ab5f mod_http_upload_external: add support for XEP-0363 version 0.3
Jonas Wielicki <jonas@wielicki.name>
parents: 2336
diff changeset
   143
end);