Mercurial > prosody-modules
annotate mod_data_access/mod_data_access.lua @ 6082:1a6cd0bbb7ab
mod_compliance_2023: Add 2023 Version of the compliance module, basis is the 2021 Version.
diff --git a/mod_compliance_2023/README.md b/mod_compliance_2023/README.md
new file mode 100644
--- /dev/null
+++ b/mod_compliance_2023/README.md
@@ -0,0 +1,22 @@
+---
+summary: XMPP Compliance Suites 2023 self-test
+labels:
+- Stage-Beta
+rockspec:
+ dependencies:
+ - mod_cloud_notify
+
+...
+
+Compare the list of enabled modules with
+[XEP-0479: XMPP Compliance Suites 2023] and produce basic report to the
+Prosody log file.
+
+If installed with the Prosody plugin installer then all modules needed for a green checkmark should be included. (With prosody 0.12 only [mod_cloud_notify] is not included with prosody and we need the community module)
+
+# Compatibility
+
+ Prosody-Version Status
+ --------------- ----------------------
+ trunk Works as of 2024-12-21
+ 0.12 Works
diff --git a/mod_compliance_2023/mod_compliance_2023.lua b/mod_compliance_2023/mod_compliance_2023.lua
new file mode 100644
--- /dev/null
+++ b/mod_compliance_2023/mod_compliance_2023.lua
@@ -0,0 +1,79 @@
+-- Copyright (c) 2021 Kim Alvefur
+--
+-- This module is MIT licensed.
+
+local hostmanager = require "core.hostmanager";
+
+local array = require "util.array";
+local set = require "util.set";
+
+local modules_enabled = module:get_option_inherited_set("modules_enabled");
+
+for host in pairs(hostmanager.get_children(module.host)) do
+ local component = module:context(host):get_option_string("component_module");
+ if component then
+ modules_enabled:add(component);
+ modules_enabled:include(module:context(host):get_option_set("modules_enabled", {}));
+ end
+end
+
+local function check(suggested, alternate, ...)
+ if set.intersection(modules_enabled, set.new({suggested; alternate; ...})):empty() then return suggested; end
+ return false;
+end
+
+local compliance = {
+ array {"Server"; check("tls"); check("disco")};
+
+ array {"Advanced Server"; check("pep", "pep_simple")};
+
+ array {"Web"; check("bosh"); check("websocket")};
+
+ -- No Server requirements for Advanced Web
+
+ array {"IM"; check("vcard_legacy", "vcard"); check("carbons"); check("http_file_share", "http_upload")};
+
+ array {
+ "Advanced IM";
+ check("vcard_legacy", "vcard");
+ check("blocklist");
+ check("muc");
+ check("private");
+ check("smacks");
+ check("mam");
+ check("bookmarks");
+ };
+
+ array {"Mobile"; check("smacks"); check("csi_simple", "csi_battery_saver")};
+
+ array {"Advanced Mobile"; check("cloud_notify")};
+
+ array {"A/V Calling"; check("turn_external", "external_services", "turncredentials", "extdisco")};
+
+};
+
+function check_compliance()
+ local compliant = true;
+ for _, suite in ipairs(compliance) do
+ local section = suite:pop(1);
+ if module:get_option_boolean("compliance_" .. section:lower():gsub("%A", "_"), true) then
+ local missing = set.new(suite:filter(function(m) return type(m) == "string" end):map(function(m) return "mod_" .. m end));
+ if suite[1] then
+ if compliant then
+ compliant = false;
+ module:log("warn", "Missing some modules for XMPP Compliance 2023");
+ end
+ module:log("info", "%s Compliance: %s", section, missing);
+ end
+ end
+ end
+
+ if compliant then module:log("info", "XMPP Compliance 2023: Compliant ✔️"); end
+end
+
+if prosody.start_time then
+ check_compliance()
+else
+ module:hook_global("server-started", check_compliance);
+end
+
| author | Menel <menel@snikket.de> |
|---|---|
| date | Sun, 22 Dec 2024 16:06:28 +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 }); |
