annotate mod_rest/jsonmap.lib.lua @ 5296:0f5657db1cfc

mod_isolate_host: handle server-generated stanzas The hook for setting the no_host_isolation is only called for c2s sessions. This does not work for stanzas generated by the server, such as PEP notifications or presence probe answers. To handle that, we do per-stanza checks for the case that the origin is local.
author Jonas Schäfer <jonas@wielicki.name>
date Sat, 01 Apr 2023 12:03:08 +0200
parents 048e339706ba
children e5b5a74feb91
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local array = require "util.array";
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local jid = require "util.jid";
3823
31b1797a78e1 mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents: 3822
diff changeset
3 local json = require "util.json";
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local st = require "util.stanza";
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local xml = require "util.xml";
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
6 local map = require "util.datamapper";
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
8 local schema do
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
9 local f = assert(module:load_resource("res/schema-xmpp.json"));
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
10 schema = json.decode(f:read("*a"))
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
11 f:close();
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
12 -- Copy common properties to all stanza kinds
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
13 if schema._common then
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
14 for key, prop in pairs(schema._common) do
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
15 for _, copyto in pairs(schema.properties) do
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
16 copyto.properties[key] = prop;
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
17 end
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
18 end
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
19 end
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
20 end
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
21
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
22 -- Some mappings that are still hard to do in a nice way with util.datamapper
3922
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
23 local field_mappings; -- in scope for "func" mappings
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
24 field_mappings = {
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 -- XEP-0071
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 html = {
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
27 type = "func", xmlns = "http://jabber.org/protocol/xhtml-im", tagname = "html",
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
28 st2json = function (s) --> json string
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
29 return (tostring(s:get_child("body", "http://www.w3.org/1999/xhtml")):gsub(" xmlns='[^']*'", "", 1));
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 end;
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
31 json2st = function (s) --> xml
3817
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
32 if type(s) == "string" then
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
33 return assert(xml.parse("<x:html xmlns:x='http://jabber.org/protocol/xhtml-im' xmlns='http://www.w3.org/1999/xhtml'>" .. s .. "</x:html>"));
3817
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
34 end
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 end;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 };
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 -- XEP-0030
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 disco = {
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
40 type = "func", xmlns = "http://jabber.org/protocol/disco#info", tagname = "query",
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
41 st2json = function (s) --> array of features
4473
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
42 if s.tags[1] == nil then
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
43 return s.attr.node or true;
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
44 end
3953
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
45 local identities, features, extensions = array(), array(), {};
4928
77b7e1322281 mod_rest: Add some notes about custom disco#info mapping code
Kim Alvefur <zash@zash.se>
parents: 4917
diff changeset
46
77b7e1322281 mod_rest: Add some notes about custom disco#info mapping code
Kim Alvefur <zash@zash.se>
parents: 4917
diff changeset
47 -- features and identities could be done with util.datamapper
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 for tag in s:childtags() do
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 if tag.name == "identity" and tag.attr.category and tag.attr.type then
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 identities:push({ category = tag.attr.category, type = tag.attr.type, name = tag.attr.name });
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 elseif tag.name == "feature" and tag.attr.var then
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 features:push(tag.attr.var);
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 end
4928
77b7e1322281 mod_rest: Add some notes about custom disco#info mapping code
Kim Alvefur <zash@zash.se>
parents: 4917
diff changeset
55
77b7e1322281 mod_rest: Add some notes about custom disco#info mapping code
Kim Alvefur <zash@zash.se>
parents: 4917
diff changeset
56 -- Especially this would be hard to do with util.datamapper
3953
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
57 for form in s:childtags("x", "jabber:x:data") do
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
58 local jform = field_mappings.formdata.st2json(form);
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
59 local form_type = jform["FORM_TYPE"];
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
60 if jform then
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
61 jform["FORM_TYPE"] = nil;
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
62 extensions[form_type] = jform;
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
63 end
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
64 end
4928
77b7e1322281 mod_rest: Add some notes about custom disco#info mapping code
Kim Alvefur <zash@zash.se>
parents: 4917
diff changeset
65
3953
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
66 if next(extensions) == nil then extensions = nil; end
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
67 return { node = s.attr.node, identities = identities, features = features, extensions = extensions };
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 end;
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
69 json2st = function (s)
3860
9752a6f1b9f3 mod_rest: Avoid treating special json.null value as any other table
Kim Alvefur <zash@zash.se>
parents: 3859
diff changeset
70 if type(s) == "table" and s ~= json.null then
3859
da3a0f055526 mod_rest: Fix handling of 'node' attribute in disco#info
Kim Alvefur <zash@zash.se>
parents: 3856
diff changeset
71 local disco = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", node = s.node });
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 if s.identities then
3848
1b9834500123 mod_rest: Fix iteration over disco#info identities
Kim Alvefur <zash@zash.se>
parents: 3823
diff changeset
73 for _, identity in ipairs(s.identities) do
3850
8d13b9c9ba75 mod_rest: Fix disco#info identities data mapping
Kim Alvefur <zash@zash.se>
parents: 3849
diff changeset
74 disco:tag("identity", { category = identity.category, type = identity.type, name = identity.name }):up();
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 if s.features then
3849
11c34e97fe1a mod_rest: Fix iteration over disco#info features
Kim Alvefur <zash@zash.se>
parents: 3848
diff changeset
78 for _, feature in ipairs(s.features) do
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 disco:tag("feature", { var = feature }):up();
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 end
3953
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
82 if s.extensions then
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
83 for form_type, extension in pairs(s.extensions) do
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
84 extension["FORM_TYPE"] = form_type;
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
85 disco:add_child(field_mappings.formdata.json2st(extension));
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
86 end
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
87 end
3859
da3a0f055526 mod_rest: Fix handling of 'node' attribute in disco#info
Kim Alvefur <zash@zash.se>
parents: 3856
diff changeset
88 return disco;
4473
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
89 elseif type(s) == "string" then
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
90 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", node = s });
3859
da3a0f055526 mod_rest: Fix handling of 'node' attribute in disco#info
Kim Alvefur <zash@zash.se>
parents: 3856
diff changeset
91 else
3870
3261a82884bb mod_rest: Fix missing return
Kim Alvefur <zash@zash.se>
parents: 3860
diff changeset
92 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", });
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 end;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 };
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 items = {
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
98 type = "func", xmlns = "http://jabber.org/protocol/disco#items", tagname = "query",
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
99 st2json = function (s) --> array of features | map with node
4473
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
100 if s.tags[1] == nil then
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
101 return s.attr.node or true;
3875
93f71ab6cb00 mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents: 3871
diff changeset
102 end
93f71ab6cb00 mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents: 3871
diff changeset
103
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 local items = array();
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 for item in s:childtags("item") do
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 items:push({ jid = item.attr.jid, node = item.attr.node, name = item.attr.name });
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 return items;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 end;
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
110 json2st = function (s)
3860
9752a6f1b9f3 mod_rest: Avoid treating special json.null value as any other table
Kim Alvefur <zash@zash.se>
parents: 3859
diff changeset
111 if type(s) == "table" and s ~= json.null then
3875
93f71ab6cb00 mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents: 3871
diff changeset
112 local disco = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", node = s.node });
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 for _, item in ipairs(s) do
3852
66f96b98d219 mod_rest: Allow returning an array of JID strings as disco#items
Kim Alvefur <zash@zash.se>
parents: 3851
diff changeset
114 if type(item) == "string" then
66f96b98d219 mod_rest: Allow returning an array of JID strings as disco#items
Kim Alvefur <zash@zash.se>
parents: 3851
diff changeset
115 disco:tag("item", { jid = item });
66f96b98d219 mod_rest: Allow returning an array of JID strings as disco#items
Kim Alvefur <zash@zash.se>
parents: 3851
diff changeset
116 elseif type(item) == "table" then
66f96b98d219 mod_rest: Allow returning an array of JID strings as disco#items
Kim Alvefur <zash@zash.se>
parents: 3851
diff changeset
117 disco:tag("item", { jid = item.jid, node = item.node, name = item.name });
66f96b98d219 mod_rest: Allow returning an array of JID strings as disco#items
Kim Alvefur <zash@zash.se>
parents: 3851
diff changeset
118 end
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 end
3875
93f71ab6cb00 mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents: 3871
diff changeset
120 return disco;
4473
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
121 elseif type(s) == "string" then
3b50a9a75fb6 mod_rest: Roundtrip disco and items when string or boolean is used
Kim Alvefur <zash@zash.se>
parents: 4372
diff changeset
122 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", node = s });
3875
93f71ab6cb00 mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents: 3871
diff changeset
123 else
93f71ab6cb00 mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents: 3871
diff changeset
124 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", });
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 end;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 };
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128
3877
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
129 -- XEP-0050: Ad-Hoc Commands
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
130 command = { type = "func", xmlns = "http://jabber.org/protocol/commands", tagname = "command",
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
131 st2json = function (s)
3877
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
132 local cmd = {
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
133 action = s.attr.action,
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
134 node = s.attr.node,
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
135 sessionid = s.attr.sessionid,
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
136 status = s.attr.status,
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
137 };
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
138 local actions = s:get_child("actions");
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
139 local note = s:get_child("note");
3878
9a3dfe0bf9fd mod_rest: Add JSON mapping for dataform (XEP-0004)
Kim Alvefur <zash@zash.se>
parents: 3877
diff changeset
140 local form = s:get_child("x", "jabber:x:data");
3877
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
141 if actions then
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
142 cmd.actions = {
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
143 execute = actions.attr.execute,
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
144 };
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
145 for action in actions:childtags() do
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
146 cmd.actions[action.name] = true
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
147 end
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
148 elseif note then
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
149 cmd.note = {
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
150 type = note.attr.type;
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
151 text = note:get_text();
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
152 };
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
153 end
3878
9a3dfe0bf9fd mod_rest: Add JSON mapping for dataform (XEP-0004)
Kim Alvefur <zash@zash.se>
parents: 3877
diff changeset
154 if form then
3922
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
155 cmd.form = field_mappings.dataform.st2json(form);
3878
9a3dfe0bf9fd mod_rest: Add JSON mapping for dataform (XEP-0004)
Kim Alvefur <zash@zash.se>
parents: 3877
diff changeset
156 end
3877
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
157 return cmd;
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
158 end;
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
159 json2st = function (s)
3877
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
160 if type(s) == "table" and s ~= json.null then
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
161 local cmd = st.stanza("command", {
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
162 xmlns = "http://jabber.org/protocol/commands",
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
163 action = s.action,
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
164 node = s.node,
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
165 sessionid = s.sessionid,
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
166 status = s.status,
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
167 });
3881
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
168 if type(s.actions) == "table" then
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
169 cmd:tag("actions", { execute = s.actions.execute });
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
170 do
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
171 if s.actions.next == true then
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
172 cmd:tag("next"):up();
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
173 end
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
174 if s.actions.prev == true then
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
175 cmd:tag("prev"):up();
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
176 end
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
177 if s.actions.complete == true then
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
178 cmd:tag("complete"):up();
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
179 end
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
180 end
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
181 cmd:up();
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
182 elseif type(s.note) == "table" then
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
183 cmd:text_tag("note", s.note.text, { type = s.note.type });
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
184 end
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
185 if s.form then
3922
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
186 cmd:add_child(field_mappings.dataform.json2st(s.form));
3888
04ea96a0488d mod_rest: Allow passing form data in a more compact format
Kim Alvefur <zash@zash.se>
parents: 3886
diff changeset
187 elseif s.data then
3922
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
188 cmd:add_child(field_mappings.formdata.json2st(s.data));
3881
5d7df207dc2b mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents: 3880
diff changeset
189 end
3877
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
190 return cmd;
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
191 elseif type(s) == "string" then -- assume node
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
192 return st.stanza("command", { xmlns = "http://jabber.org/protocol/commands", node = s });
3877
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
193 end
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
194 -- else .. missing required attribute
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
195 end;
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
196 };
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
197
3855
0e1e900577c4 mod_rest: Improve some comments
Kim Alvefur <zash@zash.se>
parents: 3854
diff changeset
198 -- XEP-0066: Out of Band Data
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
199 -- TODO Replace by oob.url in datamapper schema
4501
42f43f1383db mod_rest: Fix tag name in parsing of OOB payloads
Kim Alvefur <zash@zash.se>
parents: 4500
diff changeset
200 oob_url = { type = "func", xmlns = "jabber:x:oob", tagname = "x",
4499
8e644bf36627 mod_rest: Change OOB namespace to the one used in messages
Kim Alvefur <zash@zash.se>
parents: 4473
diff changeset
201 -- XXX namespace depends on whether it's in an iq or message stanza
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
202 st2json = function (s)
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
203 return s:get_child_text("url");
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
204 end;
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
205 json2st = function (s)
3817
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
206 if type(s) == "string" then
4500
34c0f760f34a mod_rest: Fix the OOB tag name which also differs in messages
Kim Alvefur <zash@zash.se>
parents: 4499
diff changeset
207 return st.stanza("x", { xmlns = "jabber:x:oob" }):text_tag("url", s);
3817
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
208 end
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
209 end;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
210 };
3823
31b1797a78e1 mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents: 3822
diff changeset
211
3889
59765d1bb6dc mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents: 3888
diff changeset
212 -- XEP-0004: Data Forms
3922
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
213 dataform = {
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
214 -- Generic and complete dataforms mapping
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
215 type = "func", xmlns = "jabber:x:data", tagname = "x",
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
216 st2json = function (s)
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
217 local fields = array();
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
218 local form = {
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
219 type = s.attr.type;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
220 title = s:get_child_text("title");
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
221 instructions = s:get_child_text("instructions");
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
222 fields = fields;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
223 };
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
224 for field in s:childtags("field") do
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
225 local i = {
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
226 var = field.attr.var;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
227 type = field.attr.type;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
228 label = field.attr.label;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
229 desc = field:get_child_text("desc");
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
230 required = field:get_child("required") and true or nil;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
231 value = field:get_child_text("value");
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
232 };
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
233 if field.attr.type == "jid-multi" or field.attr.type == "list-multi" or field.attr.type == "text-multi" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
234 local value = array();
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
235 for v in field:childtags("value") do
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
236 value:push(v:get_text());
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
237 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
238 if field.attr.type == "text-multi" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
239 i.value = value:concat("\n");
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
240 else
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
241 i.value = value;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
242 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
243 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
244 if field.attr.type == "list-single" or field.attr.type == "list-multi" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
245 local options = array();
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
246 for o in field:childtags("option") do
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
247 options:push({ label = o.attr.label, value = o:get_child_text("value") });
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
248 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
249 i.options = options;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
250 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
251 fields:push(i);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
252 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
253 return form;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
254 end;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
255 json2st = function (x)
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
256 if type(x) == "table" and x ~= json.null then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
257 local form = st.stanza("x", { xmlns = "jabber:x:data", type = x.type });
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
258 if x.title then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
259 form:text_tag("title", x.title);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
260 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
261 if x.instructions then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
262 form:text_tag("instructions", x.instructions);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
263 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
264 if type(x.fields) == "table" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
265 for _, f in ipairs(x.fields) do
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
266 if type(f) == "table" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
267 form:tag("field", { var = f.var, type = f.type, label = f.label });
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
268 if f.desc then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
269 form:text_tag("desc", f.desc);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
270 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
271 if f.required == true then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
272 form:tag("required"):up();
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
273 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
274 if type(f.value) == "string" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
275 form:text_tag("value", f.value);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
276 elseif type(f.value) == "table" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
277 for _, v in ipairs(f.value) do
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
278 form:text_tag("value", v);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
279 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
280 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
281 if type(f.options) == "table" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
282 for _, o in ipairs(f.value) do
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
283 if type(o) == "table" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
284 form:tag("option", { label = o.label });
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
285 form:text_tag("value", o.value);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
286 form:up();
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
287 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
288 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
289 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
290 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
291 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
292 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
293 return form;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
294 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
295 end;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
296 };
3889
59765d1bb6dc mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents: 3888
diff changeset
297
3922
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
298 -- Simpler mapping of dataform from JSON map
3896
987b203bb091 mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents: 3895
diff changeset
299 formdata = { type = "func", xmlns = "jabber:x:data", tagname = "",
3953
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
300 st2json = function (s)
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
301 local r = {};
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
302 for field in s:childtags("field") do
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
303 if field.attr.var then
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
304 local values = array();
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
305 for value in field:childtags("value") do
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
306 values:push(value:get_text());
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
307 end
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
308 if field.attr.type == "list-single" or field.attr.type == "list-multi" then
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
309 r[field.attr.var] = values;
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
310 elseif field.attr.type == "text-multi" then
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
311 r[field.attr.var] = values:concat("\n");
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
312 elseif field.attr.type == "boolean" then
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
313 r[field.attr.var] = values[1] == "1" or values[1] == "true";
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
314 elseif field.attr.type then
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
315 r[field.attr.var] = values[1] or json.null;
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
316 else -- type is optional, no way to know if multiple or single value is expected
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
317 r[field.attr.var] = values;
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
318 end
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
319 end
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
320 end
2c6d5734ae04 mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3932
diff changeset
321 return r;
3889
59765d1bb6dc mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents: 3888
diff changeset
322 end,
3922
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
323 json2st = function (s, t)
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
324 local form = st.stanza("x", { xmlns = "jabber:x:data", type = t });
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
325 for k, v in pairs(s) do
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
326 form:tag("field", { var = k });
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
327 if type(v) == "string" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
328 form:text_tag("value", v);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
329 elseif type(v) == "table" then
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
330 for _, v_ in ipairs(v) do
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
331 form:text_tag("value", v_);
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
332 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
333 end
3932
8b34222216f4 mod_rest: Fix encoding of simple dataforms
Kim Alvefur <zash@zash.se>
parents: 3923
diff changeset
334 form:up();
3922
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
335 end
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
336 return form;
ea59c9455f93 mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents: 3912
diff changeset
337 end
3889
59765d1bb6dc mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents: 3888
diff changeset
338 };
3923
3c3d216c6f6d mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents: 3922
diff changeset
339
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
340 };
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
341
4309
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
342 local byxmlname = {};
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
343 for k, spec in pairs(field_mappings) do
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
344 for _, replace in pairs(schema.properties) do
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
345 replace.properties[k] = nil
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
346 end
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
347
4309
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
348 if type(spec) == "table" then
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
349 spec.key = k;
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
350 if spec.xmlns and spec.tagname then
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
351 byxmlname["{" .. spec.xmlns .. "}" .. spec.tagname] = spec;
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
352 elseif spec.type == "name" then
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
353 byxmlname["{" .. spec.xmlns .. "}"] = spec;
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
354 end
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
355 elseif type(spec) == "string" then
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
356 byxmlname["{jabber:client}" .. k] = {key = k; type = spec};
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
357 end
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
358 end
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
359
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
360 local implied_kinds = {
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
361 disco = "iq",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
362 items = "iq",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
363 ping = "iq",
3854
25c34c9f755c mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents: 3852
diff changeset
364 version = "iq",
3877
562b34050561 mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents: 3875
diff changeset
365 command = "iq",
4743
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
366 archive = "iq",
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
367
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
368 body = "message",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
369 html = "message",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
370 replace = "message",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
371 state = "message",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
372 subject = "message",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373 thread = "message",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
374
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
375 join = "presence",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
376 priority = "presence",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
377 show = "presence",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
378 status = "presence",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
379 }
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
380
4021
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
381 local implied_types = {
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
382 command = "set",
4746
88f5e12c8351 mod_rest: Imply type=set for archive queries
Kim Alvefur <zash@zash.se>
parents: 4744
diff changeset
383 archive = "set",
4021
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
384 }
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
385
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
386 local kind_by_type = {
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
387 get = "iq", set = "iq", result = "iq",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
388 normal = "message", chat = "message", headline = "message", groupchat = "message",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
389 available = "presence", unavailable = "presence",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
390 subscribe = "presence", unsubscribe = "presence",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
391 subscribed = "presence", unsubscribed = "presence",
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
392 }
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
393
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
394 local function st2json(s)
4731
d71beacaec3b mod_rest: Apply JSON mapping to items in <xmpp> container (e.g. MAM results etc)
Kim Alvefur <zash@zash.se>
parents: 4525
diff changeset
395 if s.name == "xmpp" then
d71beacaec3b mod_rest: Apply JSON mapping to items in <xmpp> container (e.g. MAM results etc)
Kim Alvefur <zash@zash.se>
parents: 4525
diff changeset
396 local result = array();
d71beacaec3b mod_rest: Apply JSON mapping to items in <xmpp> container (e.g. MAM results etc)
Kim Alvefur <zash@zash.se>
parents: 4525
diff changeset
397 for child in s:childtags() do
d71beacaec3b mod_rest: Apply JSON mapping to items in <xmpp> container (e.g. MAM results etc)
Kim Alvefur <zash@zash.se>
parents: 4525
diff changeset
398 result:push(st2json(child));
d71beacaec3b mod_rest: Apply JSON mapping to items in <xmpp> container (e.g. MAM results etc)
Kim Alvefur <zash@zash.se>
parents: 4525
diff changeset
399 end
d71beacaec3b mod_rest: Apply JSON mapping to items in <xmpp> container (e.g. MAM results etc)
Kim Alvefur <zash@zash.se>
parents: 4525
diff changeset
400 return { xmpp = result };
d71beacaec3b mod_rest: Apply JSON mapping to items in <xmpp> container (e.g. MAM results etc)
Kim Alvefur <zash@zash.se>
parents: 4525
diff changeset
401 end
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
402
5119
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
403 local t;
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
404 do
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
405 local wrap_s = st.stanza("xmpp", { xmlns = "jabber:client" }):add_child(s);
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
406 local wrap_t = map.parse(schema, wrap_s);
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
407 if not wrap_t then
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
408 return nil, "parse";
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
409 end
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
410 local kind;
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
411 kind, t = next(wrap_t);
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
412 if kind == nil then
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
413 return nil, "parse";
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
414 end
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
415 t.kind = kind;
048e339706ba mod_rest: Remove manual reference expansion in schema
Kim Alvefur <zash@zash.se>
parents: 4948
diff changeset
416 end
4525
b68b801ddc50 mod_rest: Restore 'kind' property in JSON-mapped objects
Kim Alvefur <zash@zash.se>
parents: 4519
diff changeset
417
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
418 if s.name == "presence" and not s.attr.type then
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
419 t.type = "available";
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
420 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
421
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
422 if t.to then
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
423 t.to = jid.prep(t.to);
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
424 if not t.to then return nil, "invalid-jid-to"; end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
425 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
426 if t.from then
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
427 t.from = jid.prep(t.from);
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
428 if not t.from then return nil, "invalid-jid-from"; end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
429 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
430
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
431 if t.type == "error" then
3871
e5d08bb58155 mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents: 3870
diff changeset
432 local error = s:get_child("error");
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
433 local err_typ, err_condition, err_text = s:get_error();
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
434 t.error = {
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
435 type = err_typ,
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
436 condition = err_condition,
3871
e5d08bb58155 mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents: 3870
diff changeset
437 text = err_text,
4251
d33b480befcb mod_rest: Fix attempt at indexing nil if an error stanza is missing <error>
Kim Alvefur <zash@zash.se>
parents: 4035
diff changeset
438 by = error and error.attr.by or nil,
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
439 };
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
440 return t;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
441 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
442
4917
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
443 if type(t.payload) == "table" then
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
444 if type(t.payload.data) == "string" then
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
445 local data, err = json.decode(t.payload.data);
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
446 if err then
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
447 return nil, err;
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
448 else
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
449 t.payload.data = data;
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
450 end
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
451 else
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
452 return nil, "invalid payload.data";
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
453 end
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
454 end
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
455
4372
78de3c7acf58 mod_rest: Fix json-mapping stanzas with text or whitespace between tags
Kim Alvefur <zash@zash.se>
parents: 4309
diff changeset
456 for _, tag in ipairs(s.tags) do
4309
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
457 local prefix = "{" .. (tag.attr.xmlns or "jabber:client") .. "}";
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
458 local mapping = byxmlname[prefix .. tag.name];
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
459 if not mapping then
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
460 mapping = byxmlname[prefix];
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
461 end
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
462
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
463 if mapping and mapping.type == "func" and mapping.st2json then
4309
e8b9228b5265 mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents: 4251
diff changeset
464 t[mapping.key] = mapping.st2json(tag);
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
465 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
466 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
467
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
468 return t;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
469 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
470
3817
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
471 local function str(s)
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
472 if type(s) == "string" then
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
473 return s;
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
474 end
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
475 end
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
476
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
477 local function json2st(t)
3817
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
478 if type(t) ~= "table" or not str(next(t)) then
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
479 return nil, "invalid-json";
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
480 end
4021
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
481 local t_type = str(t.type);
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
482 if t_type == nil then
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
483 for k, implied in pairs(implied_types) do
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
484 if t[k] then
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
485 t_type = implied;
4744
f478855f4565 mod_rest: Stop search when an implied type is determined
Kim Alvefur <zash@zash.se>
parents: 4743
diff changeset
486 break;
4021
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
487 end
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
488 end
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
489 end
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
490 local kind = str(t.kind) or kind_by_type[t_type];
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
491 if not kind then
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
492 for k, implied in pairs(implied_kinds) do
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
493 if t[k] then
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
494 kind = implied;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
495 break
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
496 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
497 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
498 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
499
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
500 if kind == "presence" and t_type == "available" then
4021
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
501 t_type = nil;
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
502 elseif kind == "iq" and not t_type then
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
503 t_type = "get";
4021
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
504 end
4803
f74c7c518bb2 mod_rest: Handle unknown 'kind' values
Kim Alvefur <zash@zash.se>
parents: 4747
diff changeset
505 if not schema.properties[kind or "message"] then
f74c7c518bb2 mod_rest: Handle unknown 'kind' values
Kim Alvefur <zash@zash.se>
parents: 4747
diff changeset
506 return nil, "unknown-kind";
f74c7c518bb2 mod_rest: Handle unknown 'kind' values
Kim Alvefur <zash@zash.se>
parents: 4747
diff changeset
507 end
4021
1925d63eec6b mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents: 3953
diff changeset
508
4743
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
509 -- XEP-0313 conveninece mapping
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
510 if kind == "iq" and t_type == "set" and type(t.archive) == "table" and not t.archive.form then
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
511 local archive = t.archive;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
512 if archive["with"] or archive["start"] or archive["end"] or archive["before-id"] or archive["after-id"]
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
513 or archive["ids"] then
4948
b171ddf1bc3e mod_rest: Treat archive.ids as comma-separated to work in query string
Kim Alvefur <zash@zash.se>
parents: 4936
diff changeset
514 if type(archive["ids"]) == "string" then
b171ddf1bc3e mod_rest: Treat archive.ids as comma-separated to work in query string
Kim Alvefur <zash@zash.se>
parents: 4936
diff changeset
515 local ids = {};
b171ddf1bc3e mod_rest: Treat archive.ids as comma-separated to work in query string
Kim Alvefur <zash@zash.se>
parents: 4936
diff changeset
516 for id in archive["ids"]:gmatch("[^,]+") do
b171ddf1bc3e mod_rest: Treat archive.ids as comma-separated to work in query string
Kim Alvefur <zash@zash.se>
parents: 4936
diff changeset
517 table.insert(ids, id);
b171ddf1bc3e mod_rest: Treat archive.ids as comma-separated to work in query string
Kim Alvefur <zash@zash.se>
parents: 4936
diff changeset
518 end
b171ddf1bc3e mod_rest: Treat archive.ids as comma-separated to work in query string
Kim Alvefur <zash@zash.se>
parents: 4936
diff changeset
519 archive["ids"] = ids;
b171ddf1bc3e mod_rest: Treat archive.ids as comma-separated to work in query string
Kim Alvefur <zash@zash.se>
parents: 4936
diff changeset
520 end
4743
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
521 archive.form = {
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
522 type = "submit";
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
523 fields = {
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
524 { var = "FORM_TYPE"; values = { "urn:xmpp:mam:2" } };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
525 { var = "with"; values = { archive["with"] } };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
526 { var = "start"; values = { archive["start"] } };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
527 { var = "end"; values = { archive["end"] } };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
528 { var = "before-id"; values = { archive["before-id"] } };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
529 { var = "after-id"; values = { archive["after-id"] } };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
530 { var = "ids"; values = archive["ids"] };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
531 };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
532 };
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
533 archive["with"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
534 archive["start"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
535 archive["end"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
536 archive["before-id"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
537 archive["after-id"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
538 archive["ids"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
539 end
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
540
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
541 if archive["after"] or archive["before"] or archive["max"] then
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
542 archive.page = { after = archive["after"]; before = archive["before"]; max = tonumber(archive["max"]) }
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
543 archive["after"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
544 archive["before"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
545 archive["max"] = nil;
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
546 end
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
547 end
0a501df823fd mod_rest: Add some convenience mapping to make MAM queries easier
Kim Alvefur <zash@zash.se>
parents: 4742
diff changeset
548
4917
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
549 if type(t.payload) == "table" then
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
550 t.payload.data = json.encode(t.payload.data);
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
551 end
3dc8e329d233 mod_rest: Move most of XEP-0432 handling into JSON mapping schema
Kim Alvefur <zash@zash.se>
parents: 4916
diff changeset
552
4936
a85efae90e21 mod_rest: Expand mapping of XEP-0045 join stanza
Kim Alvefur <zash@zash.se>
parents: 4928
diff changeset
553 if kind == "presence" and t.join == true and t.muc == nil then
a85efae90e21 mod_rest: Expand mapping of XEP-0045 join stanza
Kim Alvefur <zash@zash.se>
parents: 4928
diff changeset
554 -- COMPAT Older boolean 'join' property used with XEP-0045
a85efae90e21 mod_rest: Expand mapping of XEP-0045 join stanza
Kim Alvefur <zash@zash.se>
parents: 4928
diff changeset
555 t.muc = {};
a85efae90e21 mod_rest: Expand mapping of XEP-0045 join stanza
Kim Alvefur <zash@zash.se>
parents: 4928
diff changeset
556 end
a85efae90e21 mod_rest: Expand mapping of XEP-0045 join stanza
Kim Alvefur <zash@zash.se>
parents: 4928
diff changeset
557
4841
f69c5a443156 mod_rest: Fix nested message stanzas in XEP-0297 containers
Kim Alvefur <zash@zash.se>
parents: 4803
diff changeset
558 local s = map.unparse(schema, { [kind or "message"] = t }).tags[1];
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
559
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
560 s.attr.type = t_type;
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
561 s.attr.to = str(t.to) and jid.prep(t.to);
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
562 s.attr.from = str(t.to) and jid.prep(t.from);
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
563
3817
937f8c463be6 mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents: 3813
diff changeset
564 if type(t.error) == "table" then
3871
e5d08bb58155 mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents: 3870
diff changeset
565 return st.error_reply(st.reply(s), str(t.error.type), str(t.error.condition), str(t.error.text), str(t.error.by));
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
566 elseif t.type == "error" then
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
567 s:text_tag("error", t.body, { code = t.error_code and tostring(t.error_code) });
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
568 return s;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
569 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
570
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
571 for k, v in pairs(t) do
3895
25a3ad36ef3e mod_rest: Rename loop variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 3894
diff changeset
572 local mapping = field_mappings[k];
4518
073f5397c1d2 mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents: 4501
diff changeset
573 if mapping and mapping.type == "func" and mapping.json2st then
4916
1d231fb827d3 mod_rest/jsonmap: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 4841
diff changeset
574 s:add_child(mapping.json2st(v)):up();
1d231fb827d3 mod_rest/jsonmap: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 4841
diff changeset
575 end
3813
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
576 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
577
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
578 s:reset();
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
579
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
580 return s;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
581 end
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
582
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
583 return {
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
584 st2json = st2json;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
585 json2st = json2st;
aa1ad69c7c10 mod_rest: Add JSON support
Kim Alvefur <zash@zash.se>
parents:
diff changeset
586 };