annotate mod_http_xep227/mod_http_xep227.lua @ 4876:0f5f2d4475b9

mod_http_xep227: Add support for import via APIs rather than direct store manipulation In particular this transitions PEP nodes and data to be imported via mod_pep's APIs, fixing issues with importing at runtime while PEP data may already be live in RAM. Next obvious candidate for this approach is rosters, so clients get immediate roster pushes and other special handling (such as emitting subscribes to reach the desired subscription state).
author Matthew Wild <mwild1@gmail.com>
date Tue, 18 Jan 2022 17:01:18 +0000
parents 541b2cf68e93
children 65cdbbf9703a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local it = require "util.iterators";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local http = require "util.http";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local sm = require "core.storagemanager";
4869
c3bf568e3977 mod_http_xep227: Initialize XEP-0227 XML
Matthew Wild <mwild1@gmail.com>
parents: 4868
diff changeset
4 local st = require "util.stanza";
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local xml = require "util.xml";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
7 local jid_join = require "util.jid".join;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
8
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
9 local mod_pep = module:depends("pep");
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local tokens = module:depends("tokenauth");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 module:depends("storage_xep0227");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local archive_store_name = module:get_option("archive_store", "archive");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local known_stores = {
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 accounts = "keyval";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 roster = "keyval";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 private = "keyval";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 pep = "keyval";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 vcard = "keyval";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 [archive_store_name] = "archive";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 pep_data = "archive";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 };
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
26 local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
27
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 local function new_user_xml(username, host)
4869
c3bf568e3977 mod_http_xep227: Initialize XEP-0227 XML
Matthew Wild <mwild1@gmail.com>
parents: 4868
diff changeset
29 local user_xml = st.stanza("server-data", {xmlns='urn:xmpp:pie:0'})
c3bf568e3977 mod_http_xep227: Initialize XEP-0227 XML
Matthew Wild <mwild1@gmail.com>
parents: 4868
diff changeset
30 :tag("host", { jid = host })
c3bf568e3977 mod_http_xep227: Initialize XEP-0227 XML
Matthew Wild <mwild1@gmail.com>
parents: 4868
diff changeset
31 :tag("user", { name = username }):reset();
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 return {
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 set_user_xml = function (_, store_username, store_host, new_xml)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 if username ~= store_username or store_host ~= host then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 return nil;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 user_xml = new_xml;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 return true;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 end;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 get_user_xml = function (_, store_username, store_host)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 if username ~= store_username or store_host ~= host then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 return nil;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 return user_xml;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 };
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 local function get_selected_stores(query_params)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 local selected_kv_stores, selected_archive_stores, export_pep_data = {}, {}, false;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 if query_params.stores then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 for store_name in query_params.stores:gmatch("[^,]+") do
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 local store_type = known_stores[store_name];
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 if store_type == "keyval" then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 table.insert(selected_kv_stores, store_name);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 elseif store_type == "archive" then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 if store_name == "pep_data" then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 export_pep_data = true;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 else
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 table.insert(selected_archive_stores, store_name);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 else
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 module:log("warn", "Unknown store: %s", store_name);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 return 400;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 return {
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 keyval = selected_kv_stores;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 archive = selected_archive_stores;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 export_pep_data = export_pep_data;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 };
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 local function get_config_driver(store_name, host)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 -- Fiddling to handle the 'pep_data' storage config override
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 if store_name:find("pep_", 1, true) == 1 then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 store_name = "pep_data";
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 -- Return driver
4867
9d29467f4d5b mod_http_xep227: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 4865
diff changeset
83 return sm.get_driver(host, store_name);
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 local function handle_export_227(event)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 local session = assert(event.session, "No session found");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 local xep227_driver = sm.load_driver(session.host, "xep0227");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 local username = session.username;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 local user_xml = new_user_xml(session.username, session.host);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 local query_params = http.formdecode(event.request.url.query or "");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 local selected_stores = get_selected_stores(query_params);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 for store_name in it.values(selected_stores.keyval) do
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 -- Open the source store that contains the data
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 local store = sm.open(session.host, store_name);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 -- Read the current data
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 local data, err = store:get(username);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 if data ~= nil or not err then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 -- Initialize the destination store (XEP-0227 backed)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 local target_store = xep227_driver:open_xep0227(store_name, nil, user_xml);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 -- Transform the data and update user_xml (via the _set_user_xml callback)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 if not target_store:set(username, data == nil and {} or data) then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 return 500;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 elseif err then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 return 500;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 if selected_stores.export_pep_data then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 local pep_node_list = sm.open(session.host, "pep"):get(session.username);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 if pep_node_list then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 for node_name in it.keys(pep_node_list) do
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 table.insert(selected_stores.archive, "pep_"..node_name);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 for store_name in it.values(selected_stores.archive) do
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 local source_driver = get_config_driver(store_name, session.host);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 local source_archive = source_driver:open(store_name, "archive");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 local dest_archive = xep227_driver:open_xep0227(store_name, "archive", user_xml);
4871
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
128 local results_iter, results_err = source_archive:find(username);
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
129 if results_iter then
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
130 local count, errs = 0, 0;
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
131 for id, item, when, with in results_iter do
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
132 local ok, err = dest_archive:append(username, id, item, when, with);
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
133 if ok then
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
134 count = count + 1;
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
135 else
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
136 module:log("warn", "Error: %s", err);
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
137 errs = errs + 1;
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
138 end
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
139 if ( count + errs ) % 100 == 0 then
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
140 module:log("info", "%d items migrated, %d errors", count, errs);
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
141 end
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 end
4871
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
143 elseif results_err then
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
144 module:log("warn", "Unable to read from '%s': %s", store_name, results_err);
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
145 return 500;
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148
4868
57311c545013 mod_http_xep227: Fix validation of resulting export XML
Matthew Wild <mwild1@gmail.com>
parents: 4867
diff changeset
149 local xml_data = user_xml:get_user_xml(username, session.host);
57311c545013 mod_http_xep227: Fix validation of resulting export XML
Matthew Wild <mwild1@gmail.com>
parents: 4867
diff changeset
150
57311c545013 mod_http_xep227: Fix validation of resulting export XML
Matthew Wild <mwild1@gmail.com>
parents: 4867
diff changeset
151 if not xml_data or not xml_data:find("host/user") then
57311c545013 mod_http_xep227: Fix validation of resulting export XML
Matthew Wild <mwild1@gmail.com>
parents: 4867
diff changeset
152 module:log("warn", "No data to export: %s", tostring(xml_data));
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 return 204;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 event.response.headers["Content-Type"] = "application/xml";
4868
57311c545013 mod_http_xep227: Fix validation of resulting export XML
Matthew Wild <mwild1@gmail.com>
parents: 4867
diff changeset
157 return [[<?xml version="1.0" encoding="utf-8" ?>]]..tostring(xml_data);
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
160 local function generic_keyval_importer(username, host, store_name, source_store)
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
161 -- Read the current data
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
162 local data, err = source_store:get(username);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
163 if data ~= nil or not err then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
164 local target_store = sm.open(host, store_name);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
165 -- Transform the data and update user_xml (via the _set_user_xml callback)
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
166 if not target_store:set(username, data == nil and {} or data) then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
167 return 500;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
168 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
169 module:log("debug", "Imported data for '%s' store", store_name);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
170 elseif err then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
171 return nil, err;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
172 else
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
173 module:log("debug", "No data for store '%s'", store_name);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
174 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
175 return true;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
176 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
177
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
178 local function generic_archive_importer(username, host, store_name, source_archive)
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
179 local dest_driver = get_config_driver(store_name, host);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
180 local dest_archive = dest_driver:open(store_name, "archive");
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
181 local results_iter, results_err = source_archive:find(username);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
182 if results_iter then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
183 local count, errs = 0, 0;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
184 for id, item, when, with in source_archive:find(username) do
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
185 local ok, err = dest_archive:append(username, id, item, when, with);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
186 if ok then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
187 count = count + 1;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
188 else
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
189 module:log("warn", "Error: %s", err);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
190 errs = errs + 1;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
191 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
192 if ( count + errs ) % 100 == 0 then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
193 module:log("info", "%d items migrated, %d errors", count, errs);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
194 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
195 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
196 elseif results_err then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
197 module:log("warn", "Unable to read from '%s': %s", store_name, results_err);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
198 return nil, "error reading from source archive";
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
199 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
200 return true;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
201 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
202
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
203 local special_keyval_importers = {};
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
204
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
205 function special_keyval_importers.pep(username, host, store_name, store) --luacheck: ignore 212/store_name
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
206 local user_jid = jid_join(username, host);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
207 local pep_service = mod_pep.get_pep_service(username);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
208 local pep_nodes, store_err = store:get(username);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
209 if not pep_nodes and store_err then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
210 return nil, store_err;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
211 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
212
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
213 local all_ok = true;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
214 for node_name, node_config in pairs(pep_nodes) do
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
215 local ok, ret = pep_service:get_node_config(node_name, user_jid);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
216 if not ok and ret == "item-not-found" then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
217 -- Create node according to imported data
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
218 if node_config == true then node_config = {}; end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
219 local create_ok, create_err = pep_service:create(node_name, user_jid, node_config.config);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
220 if not create_ok then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
221 module:log("warn", "Failed to create PEP node: %s", create_err);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
222 all_ok = false;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
223 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
224 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
225 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
226
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
227 return all_ok;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
228 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
229
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
230 local special_archive_importers = setmetatable({}, {
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
231 __index = function (t, k)
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
232 if k:match("^pep_") then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
233 return t.pep_data;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
234 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
235 end;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
236 });
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
237
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
238 function special_archive_importers.pep_data(username, host, store_name, source_archive)
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
239 local user_jid = jid_join(username, host);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
240 local pep_service = mod_pep.get_pep_service(username);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
241
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
242 local node_name = store_name:match("^pep_(.+)$");
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
243 if not node_name then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
244 return nil, "invalid store name";
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
245 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
246
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
247 local results_iter, results_err = source_archive:find(username);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
248 if results_iter then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
249 local count, errs = 0, 0;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
250 for id, item in source_archive:find(username) do
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
251 local wrapped_item = st.stanza("item", { xmlns = xmlns_pubsub, id = id })
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
252 :add_child(item);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
253 local ok, err = pep_service:publish(node_name, user_jid, id, wrapped_item);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
254 if not ok then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
255 module:log("warn", "Failed to publish PEP item to '%s': %s", node_name, err, tostring(wrapped_item));
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
256 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
257 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
258 module:log("debug", "Imported %d PEP items (%d errors)", count, errs);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
259 elseif results_err then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
260 return nil, "store access error";
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
261 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
262 return true;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
263 end
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
264
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 local function is_looking_like_xep227(xml_data)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 if not xml_data or xml_data.name ~= "server-data"
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 or xml_data.attr.xmlns ~= "urn:xmpp:pie:0" then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268 return false;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 -- Looks like 227, but check it has at least one host + user element
4867
9d29467f4d5b mod_http_xep227: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 4865
diff changeset
271 return not not xml_data:find("host/user");
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 local function handle_import_227(event)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 local session = assert(event.session, "No session found");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 local username = session.username;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 local input_xml_raw = event.request.body;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 local input_xml_parsed = xml.parse(input_xml_raw);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 -- Some sanity checks
4867
9d29467f4d5b mod_http_xep227: Fix luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 4865
diff changeset
282 if not input_xml_parsed or not is_looking_like_xep227(input_xml_parsed) then
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 module:log("warn", "No data to import");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 return 422;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 -- Set the host and username of the import to the new account's user/host
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 input_xml_parsed:find("host").attr.jid = session.host;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289 input_xml_parsed:find("host/user").attr.name = username;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291 local user_xml = new_user_xml(session.username, session.host);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 user_xml:set_user_xml(username, session.host, input_xml_parsed);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 local xep227_driver = sm.load_driver(session.host, "xep0227");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296
4872
bc54f651b5a4 mod_http_xep227: Correctly read selected stores from URL query part
Matthew Wild <mwild1@gmail.com>
parents: 4871
diff changeset
297 local query_params = http.formdecode(event.request.url.query or "");
bc54f651b5a4 mod_http_xep227: Correctly read selected stores from URL query part
Matthew Wild <mwild1@gmail.com>
parents: 4871
diff changeset
298 local selected_stores = get_selected_stores(query_params);
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
300 module:log("debug", "Importing %d keyval stores (%s)...", #selected_stores.keyval, table.concat(selected_stores.keyval, ", "));
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 for _, store_name in ipairs(selected_stores.keyval) do
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
302 module:log("debug", "Importing keyval store %s...", store_name);
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 -- Initialize the destination store (XEP-0227 backed)
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
304 local source_store = xep227_driver:open_xep0227(store_name, nil, user_xml);
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
306 local importer = special_keyval_importers[store_name] or generic_keyval_importer;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
307 local ok, err = importer(username, session.host, store_name, source_store);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
308 if not ok then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
309 module:log("warn", "Importer for keyval store '%s' encountered error: %s", store_name, err or "<no error returned>");
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 return 500;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 if selected_stores.export_pep_data then
4873
541b2cf68e93 mod_http_xep227: Fix typo in method name
Matthew Wild <mwild1@gmail.com>
parents: 4872
diff changeset
315 local pep_store = xep227_driver:open_xep0227("pep", nil, user_xml);
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 local pep_node_list = pep_store:get(session.username);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 if pep_node_list then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 for node_name in it.keys(pep_node_list) do
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 table.insert(selected_stores.archive, "pep_"..node_name);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
324 module:log("debug", "Importing %d archive stores (%s)...", #selected_stores.archive, table.concat(selected_stores.archive, ", "));
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 for store_name in it.values(selected_stores.archive) do
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
326 module:log("debug", "Importing archive store %s...", store_name);
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 local source_archive = xep227_driver:open_xep0227(store_name, "archive", user_xml);
4876
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
328
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
329 local importer = special_archive_importers[store_name] or generic_archive_importer;
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
330 local ok, err = importer(username, session.host, store_name, source_archive);
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
331 if not ok then
0f5f2d4475b9 mod_http_xep227: Add support for import via APIs rather than direct store manipulation
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
332 module:log("warn", "Importer for archive store '%s' encountered error: %s", err or "<no error returned>");
4871
029ae3c29683 mod_http_xep227: Handle nil/errors opening archive stores
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
333 return 500;
4865
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 return 200;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 ---
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 local function check_credentials(request)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 local auth_type, auth_data = string.match(request.headers.authorization or "", "^(%S+)%s(.+)$");
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 if not (auth_type and auth_data) then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 return false;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 if auth_type == "Bearer" then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 local token_info = tokens.get_token_info(auth_data);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 if not token_info or not token_info.session then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 return false;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
352 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 return token_info.session;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355 return nil;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 local function check_auth(routes)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 local function check_request_auth(event)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 local session = check_credentials(event.request);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 if not session then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 event.response.headers.authorization = ("Bearer realm=%q"):format(module.host.."/"..module.name);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 return false, 401;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 event.session = session;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 return true;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369 for route, handler in pairs(routes) do
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 routes[route] = function (event, ...)
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 local permit, code = check_request_auth(event);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 if not permit then
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 return code;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 return handler(event, ...);
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376 end;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 return routes;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 end
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381 module:provides("http", {
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 route = check_auth {
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 ["GET /export"] = handle_export_227;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 ["PUT /import"] = handle_import_227;
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 };
bd0a1f917d98 mod_http_xep227: New module providing HTTP API for account data import/export
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 });