Mercurial > prosody-modules
annotate mod_data_access/mod_data_access.lua @ 3503:882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
This deprecates the default "superuser" actor model and makes the
default equivalent to the previous "request.id".
A single actor and secret per node is supported because HTTP and
WebHooks don't normally include any authorization identity.
Allowing authentication bypass when no secret is given should be
relatively safe when the actor is unprivileged, as will be unless
explicitly configured otherwise.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 30 Mar 2019 21:16:13 +0100 |
parents | 8f17da746479 |
children |
rev | line source |
---|---|
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 |
2872
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 }); |