author | Kim Alvefur <zash@zash.se> |
Wed, 05 Mar 2014 17:40:44 +0100 | |
changeset 1328 | 446fcda4ec45 |
parent 1018 | 7e060edbb548 |
child 1343 | 7dbde05b48a9 |
permissions | -rw-r--r-- |
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); |
486
b84493ef1d1d
mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents:
461
diff
changeset
|
81 |
|
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 |
318
84caab2bc02c
mod_data_access: New plugin providing a HTTP interface to Prosodys datamanager
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 |
-- To only give admins acces 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"; |
486
b84493ef1d1d
mod_data_access: Implement PUT and POST.
Kim Alvefur <zash@zash.se>
parents:
461
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 |
}); |