mod_data_access/mod_data_access.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 2876 8f17da746479
permissions -rw-r--r--
mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- HTTP Access to datamanager
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
-- By Kim Alvefur <zash@zash.se>
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
     4
local t_concat = table.concat;
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
     5
local t_insert = table.insert;
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local jid_prep = require "util.jid".prep;
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
local jid_split = require "util.jid".split;
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
     8
local test_password = require "core.usermanager".test_password;
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local is_admin = require "core.usermanager".is_admin
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local dm_load = require "util.datamanager".load;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    11
local dm_store = require "util.datamanager".store;
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
local dm_list_load = require "util.datamanager".list_load;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    13
local dm_list_store = require "util.datamanager".list_store;
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    14
local dm_list_append = require "util.datamanager".list_append;
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
local b64_decode = require "util.encodings".base64.decode;
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    16
local saslprep = require "util.encodings".stringprep.saslprep;
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    17
local realm = module:get_host() .. "/" .. module:get_name();
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    18
module:depends"http";
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
local encoders = {
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
	lua = require "util.serialization".serialize,
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
	json = require "util.json".encode
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
};
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    24
local decoders = {
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    25
	lua = require "util.serialization".deserialize,
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    26
	json = require "util.json".decode,
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    27
};
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    28
local content_type_map = {
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    29
	["text/x-lua"] = "lua"; lua = "text/x-lua";
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    30
	["application/json"] = "json"; json = "application/json";
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    31
}
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    33
local function require_valid_user(f)
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    34
	return function(event, path)
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    35
		local request = event.request;
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    36
		local response = event.response;
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    37
		local headers = request.headers;
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    38
		if not headers.authorization then
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    39
			response.headers.www_authenticate = ("Basic realm=%q"):format(realm);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    40
			return 401
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    41
		end
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    42
		local from_jid, password = b64_decode(headers.authorization:match"[^ ]*$"):match"([^:]*):(.*)";
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    43
		from_jid = jid_prep(from_jid);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    44
		password = saslprep(password);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    45
		if from_jid and password then
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    46
			local user, host = jid_split(from_jid);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    47
			local ok, err = test_password(user, host, password);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    48
			if ok and user and host then
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    49
				return f(event, path, from_jid);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    50
			elseif err then
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    51
				module:log("debug", "User failed authentication: %s", err);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    52
			end
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    53
		end
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    54
		return 401
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
	end
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    56
end
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    58
local function handle_request(event, path, authed_user)
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    59
	local request, response = event.request, event.response;
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    61
	--module:log("debug", "spliting path");
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    62
	local path_items = {};
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    63
	for i in string.gmatch(path, "[^/]+") do
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    64
		t_insert(path_items, i);
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
	end
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    66
	--module:log("debug", "split path, got %d parts: %s", #path_items, table.concat(path_items, ", "));
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    68
	local user_node, user_host = jid_split(authed_user);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    69
	if #path_items < 3 then
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    70
		--module:log("debug", "since we need at least 3 parts, adding %s/%s", user_host, user_node);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    71
		t_insert(path_items, 1, user_node);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    72
		t_insert(path_items, 1, user_host);
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
		--return http_response(400, "Bad Request");
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
	end
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    76
	if #path_items < 3 then
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    77
		return 404;
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
	end
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    80
	local p_host, p_user, p_store, p_type = unpack(path_items);
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1018
diff changeset
    81
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    82
	if not p_store or not p_store:match("^[%a_]+$") then
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    83
		return 404;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    84
	end
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    85
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    86
	if user_host ~= path_items[1] or user_node ~= path_items[2] then
2876
8f17da746479 mod_data_access: Fix typo in comment [codespell]
Kim Alvefur <zash@zash.se>
parents: 1343
diff changeset
    87
		-- To only give admins access to anything, move the inside of this block after authz
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    88
		--module:log("debug", "%s wants access to %s@%s[%s], is admin?", authed_user, p_user, p_host, p_store)
1018
7e060edbb548 mod_data_access: is_admin() takes a JID, not a username (fixes admin access to data stores)
Matthew Wild <mwild1@gmail.com>
parents: 669
diff changeset
    89
		if not is_admin(authed_user, p_host) then
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    90
			return 403;
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
		end
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
	end
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    94
	local method = request.method;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    95
	if method == "GET" then
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    96
		local data = dm_load(p_user, p_host, p_store);
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
    97
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
    98
		data = data or dm_list_load(p_user, p_host, p_store);
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    99
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   100
		--TODO Use the Accept header
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   101
		local content_type = p_type or "json";
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1018
diff changeset
   102
		if data and encoders[content_type] then
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   103
			response.headers.content_type = content_type_map[content_type].."; charset=utf-8";
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   104
			return encoders[content_type](data);
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   105
		else
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   106
			return 404;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   107
		end
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   108
	elseif method == "POST" or method == "PUT" then
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   109
		local body = request.body;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   110
		if not body then
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   111
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   112
			return 400;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   113
		end
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   114
		local content_type, content = request.headers.content_type, body;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   115
		content_type = content_type and content_type_map[content_type]
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   116
		--module:log("debug", "%s: %s", content_type, tostring(content));
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   117
		content = content_type and decoders[content_type] and decoders[content_type](content);
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   118
		--module:log("debug", "%s: %s", type(content), tostring(content));
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   119
		if not content then
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   120
			return 400;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   121
		end
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   122
		local ok, err
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   123
		if method == "PUT" then
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   124
			ok, err = dm_store(p_user, p_host, p_store, content);
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   125
		elseif method == "POST" then
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   126
			ok, err = dm_list_append(p_user, p_host, p_store, content);
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   127
		end
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   128
		if ok then
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   129
			response.headers.location = t_concat({module:http_url(nil,"/data"),p_host,p_user,p_store}, "/");
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   130
			return 201;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   131
		else
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   132
			response.headers.debug = err;
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   133
			return 500;
486
b84493ef1d1d mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents: 461
diff changeset
   134
		end
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   135
	elseif method == "DELETE" then
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   136
		dm_store(p_user, p_host, p_store, nil);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   137
		dm_list_store(p_user, p_host, p_store, nil);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   138
		return 204;
318
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   139
	end
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   140
end
84caab2bc02c mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   141
669
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   142
local handle_request_with_auth = require_valid_user(handle_request);
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   143
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   144
module:provides("http", {
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   145
	default_path = "/data";
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   146
	route = {
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   147
		["GET /*"] = handle_request_with_auth,
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   148
		["PUT /*"] = handle_request_with_auth,
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   149
		["POST /*"] = handle_request_with_auth,
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   150
		["DELETE /*"] = handle_request_with_auth,
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   151
	};
dd7d30c175d4 mod_data_access: Cleanup and update to new HTTP API
Kim Alvefur <zash@zash.se>
parents: 486
diff changeset
   152
});