Mercurial > prosody-modules
annotate mod_rest/jsonmap.lib.lua @ 4515:2e33eeafe962
mod_muc_markers: Prevent any markers from reaching the archive, even if untracked
Original intention was to leave alone things that this module isn't
handling. However markers in archives are just problematic without
more advanced logic about what is markable and what is not. It also
requires a more advanced query in mod_muc_rai to determine the latest
markable message instead of the latest archived message.
I'd rather keep the "is archivable" and "is markable" definition the
same for simplicity. I don't want to introduce yet another set of rules
for no reason.
No markers in MAM.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 22 Mar 2021 15:55:02 +0000 |
parents | 42f43f1383db |
children | 073f5397c1d2 |
rev | line source |
---|---|
3813 | 1 local array = require "util.array"; |
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 | 4 local st = require "util.stanza"; |
5 local xml = require "util.xml"; | |
6 | |
3922
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
7 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
|
8 field_mappings = { |
3886
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
9 -- top level stanza attributes |
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
10 -- needed here to mark them as known fields |
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
11 kind = "attr", |
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
12 type = "attr", |
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
13 to = "attr", |
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
14 from = "attr", |
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
15 id = "attr", |
4035
270cd50852be
mod_rest: Map xml:lang to/from JSON
Kim Alvefur <zash@zash.se>
parents:
4021
diff
changeset
|
16 lang = "attr", |
3886
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
17 |
3813 | 18 -- basic message |
19 body = "text_tag", | |
20 subject = "text_tag", | |
21 thread = "text_tag", | |
22 | |
23 -- basic presence | |
24 show = "text_tag", | |
25 status = "text_tag", | |
26 priority = "text_tag", | |
27 | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
28 state = { type = "name", xmlns = "http://jabber.org/protocol/chatstates" }, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
29 nick = { type = "text_tag", xmlns = "http://jabber.org/protocol/nick", tagname = "nick" }, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
30 delay = { type = "attr", xmlns = "urn:xmpp:delay", tagname = "delay", attr = "stamp" }, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
31 replace = { type = "attr", xmlns = "urn:xmpp:message-correct:0", tagname = "replace", attr = "id" }, |
3813 | 32 |
33 -- XEP-0045 MUC | |
34 -- TODO history, password, ??? | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
35 join = { type = "bool_tag", xmlns = "http://jabber.org/protocol/muc", tagname = "x" }, |
3813 | 36 |
37 -- XEP-0071 | |
38 html = { | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
39 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
|
40 st2json = function (s) --> json string |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
41 return (tostring(s:get_child("body", "http://www.w3.org/1999/xhtml")):gsub(" xmlns='[^']*'", "", 1)); |
3813 | 42 end; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
43 json2st = function (s) --> xml |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
44 if type(s) == "string" then |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
45 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
|
46 end |
3813 | 47 end; |
48 }; | |
49 | |
3855
0e1e900577c4
mod_rest: Improve some comments
Kim Alvefur <zash@zash.se>
parents:
3854
diff
changeset
|
50 -- XEP-0199: XMPP Ping |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
51 ping = { type = "bool_tag", xmlns = "urn:xmpp:ping", tagname = "ping" }, |
3813 | 52 |
3854
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
53 -- XEP-0092: Software Version |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
54 version = { type = "func", xmlns = "jabber:iq:version", tagname = "query", |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
55 st2json = function (s) |
3854
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
56 return { |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
57 name = s:get_child_text("name"); |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
58 version = s:get_child_text("version"); |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
59 os = s:get_child_text("os"); |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
60 } |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
61 end, |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
62 json2st = function (s) |
3854
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
63 local v = st.stanza("query", { xmlns = "jabber:iq:version" }); |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
64 if type(s) == "table" then |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
65 v:text_tag("name", s.name); |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
66 v:text_tag("version", s.version); |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
67 if s.os then |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
68 v:text_tag("os", s.os); |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
69 end |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
70 end |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
71 return v; |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
72 end |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
73 }; |
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
74 |
3813 | 75 -- XEP-0030 |
76 disco = { | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
77 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
|
78 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
|
79 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
|
80 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
|
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 local identities, features, extensions = array(), array(), {}; |
3813 | 83 for tag in s:childtags() do |
84 if tag.name == "identity" and tag.attr.category and tag.attr.type then | |
85 identities:push({ category = tag.attr.category, type = tag.attr.type, name = tag.attr.name }); | |
86 elseif tag.name == "feature" and tag.attr.var then | |
87 features:push(tag.attr.var); | |
88 end | |
89 end | |
3953
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
90 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
|
91 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
|
92 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
|
93 if jform then |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
94 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
|
95 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
|
96 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
97 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
98 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
|
99 return { node = s.attr.node, identities = identities, features = features, extensions = extensions }; |
3813 | 100 end; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
101 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
|
102 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
|
103 local disco = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", node = s.node }); |
3813 | 104 if s.identities then |
3848
1b9834500123
mod_rest: Fix iteration over disco#info identities
Kim Alvefur <zash@zash.se>
parents:
3823
diff
changeset
|
105 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
|
106 disco:tag("identity", { category = identity.category, type = identity.type, name = identity.name }):up(); |
3813 | 107 end |
108 end | |
109 if s.features then | |
3849
11c34e97fe1a
mod_rest: Fix iteration over disco#info features
Kim Alvefur <zash@zash.se>
parents:
3848
diff
changeset
|
110 for _, feature in ipairs(s.features) do |
3813 | 111 disco:tag("feature", { var = feature }):up(); |
112 end | |
113 end | |
3953
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
114 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
|
115 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
|
116 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
|
117 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
|
118 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
119 end |
3859
da3a0f055526
mod_rest: Fix handling of 'node' attribute in disco#info
Kim Alvefur <zash@zash.se>
parents:
3856
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#info", node = s }); |
3859
da3a0f055526
mod_rest: Fix handling of 'node' attribute in disco#info
Kim Alvefur <zash@zash.se>
parents:
3856
diff
changeset
|
123 else |
3870 | 124 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", }); |
3813 | 125 end |
126 end; | |
127 }; | |
128 | |
129 items = { | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
130 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
|
131 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
|
132 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
|
133 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
|
134 end |
93f71ab6cb00
mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents:
3871
diff
changeset
|
135 |
3813 | 136 local items = array(); |
137 for item in s:childtags("item") do | |
138 items:push({ jid = item.attr.jid, node = item.attr.node, name = item.attr.name }); | |
139 end | |
140 return items; | |
141 end; | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
142 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
|
143 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
|
144 local disco = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", node = s.node }); |
3813 | 145 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
|
146 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
|
147 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
|
148 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
|
149 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
|
150 end |
3813 | 151 end |
3875
93f71ab6cb00
mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents:
3871
diff
changeset
|
152 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
|
153 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
|
154 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
|
155 else |
93f71ab6cb00
mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents:
3871
diff
changeset
|
156 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", }); |
3813 | 157 end |
158 end; | |
159 }; | |
160 | |
3877
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
161 -- XEP-0050: Ad-Hoc Commands |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
162 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 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
|
168 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
|
169 }; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
170 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
|
171 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
|
172 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
|
173 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
|
174 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
|
175 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
|
176 }; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
177 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
|
178 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
|
179 end |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
180 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
|
181 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
|
182 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
|
183 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
|
184 }; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
185 end |
3878
9a3dfe0bf9fd
mod_rest: Add JSON mapping for dataform (XEP-0004)
Kim Alvefur <zash@zash.se>
parents:
3877
diff
changeset
|
186 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
|
187 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
|
188 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
|
189 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
|
190 end; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
191 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
|
192 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
|
193 local cmd = st.stanza("command", { |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
194 xmlns = "http://jabber.org/protocol/commands", |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
195 action = s.action, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
196 node = s.node, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
197 sessionid = s.sessionid, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
198 status = s.status, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
199 }); |
3881
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
200 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
|
201 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
|
202 do |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
203 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
|
204 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
|
205 end |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
206 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
|
207 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
|
208 end |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
209 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
|
210 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
|
211 end |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
212 end |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
213 cmd:up(); |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
214 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
|
215 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
|
216 end |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
217 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
|
218 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
|
219 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
|
220 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
|
221 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
|
222 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
|
223 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
|
224 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
|
225 end |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
226 -- 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
|
227 end; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
228 }; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
229 |
3855
0e1e900577c4
mod_rest: Improve some comments
Kim Alvefur <zash@zash.se>
parents:
3854
diff
changeset
|
230 -- XEP-0066: Out of Band Data |
4501
42f43f1383db
mod_rest: Fix tag name in parsing of OOB payloads
Kim Alvefur <zash@zash.se>
parents:
4500
diff
changeset
|
231 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
|
232 -- 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
|
233 st2json = function (s) |
3813 | 234 return s:get_child_text("url"); |
235 end; | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
236 json2st = function (s) |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
237 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
|
238 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
|
239 end |
3813 | 240 end; |
241 }; | |
3823
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
242 |
3907
d5ecb9b9cb3b
mod_rest: Update with namespace and name of XEP-0432
Kim Alvefur <zash@zash.se>
parents:
3906
diff
changeset
|
243 -- XEP-0432: Simple JSON Messaging |
d5ecb9b9cb3b
mod_rest: Update with namespace and name of XEP-0432
Kim Alvefur <zash@zash.se>
parents:
3906
diff
changeset
|
244 payload = { type = "func", xmlns = "urn:xmpp:json-msg:0", tagname = "payload", |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
245 st2json = function (s) |
3823
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
246 local rawjson = s:get_child_text("json", "urn:xmpp:json:0"); |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
247 if not rawjson then return nil, "missing-json-payload"; end |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
248 local parsed, err = json.decode(rawjson); |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
249 if not parsed then return nil, err; end |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
250 return { |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
251 datatype = s.attr.datatype; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
252 data = parsed; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
253 }; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
254 end; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
255 json2st = function (s) |
3823
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
256 if type(s) == "table" then |
3907
d5ecb9b9cb3b
mod_rest: Update with namespace and name of XEP-0432
Kim Alvefur <zash@zash.se>
parents:
3906
diff
changeset
|
257 return st.stanza("payload", { xmlns = "urn:xmpp:json-msg:0", datatype = s.datatype }) |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
258 :tag("json", { xmlns = "urn:xmpp:json:0" }):text(json.encode(s.data)); |
3823
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
259 end; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
260 end |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
261 }; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
262 |
3889
59765d1bb6dc
mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents:
3888
diff
changeset
|
263 -- 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
|
264 dataform = { |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
265 -- 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
|
266 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
|
267 st2json = function (s) |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
268 local fields = array(); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
269 local form = { |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
270 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
|
271 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
|
272 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
|
273 fields = fields; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
274 }; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
275 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
|
276 local i = { |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
277 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
|
278 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
|
279 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
|
280 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
|
281 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
|
282 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
|
283 }; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
284 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
|
285 local value = array(); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
286 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
|
287 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
|
288 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
289 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
|
290 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
|
291 else |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
292 i.value = value; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
293 end |
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 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
|
296 local options = array(); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
297 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
|
298 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
|
299 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
300 i.options = options; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
301 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
302 fields:push(i); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
303 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
304 return form; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
305 end; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
306 json2st = function (x) |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 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
|
311 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
312 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
|
313 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
|
314 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
315 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
|
316 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
|
317 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
|
318 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
|
319 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
|
320 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
|
321 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
322 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
|
323 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
|
324 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
325 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
|
326 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
|
327 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
|
328 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
|
329 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
|
330 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
331 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
332 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
|
333 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
|
334 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
|
335 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
|
336 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
|
337 form:up(); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
338 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
339 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
340 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
341 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
342 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
343 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
344 return form; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
345 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
346 end; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
347 }; |
3889
59765d1bb6dc
mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents:
3888
diff
changeset
|
348 |
3922
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
349 -- 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
|
350 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
|
351 st2json = function (s) |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
352 local r = {}; |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
353 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
|
354 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
|
355 local values = array(); |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
356 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
|
357 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
|
358 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
359 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
|
360 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
|
361 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
|
362 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
|
363 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
|
364 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
|
365 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
|
366 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
|
367 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
|
368 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
|
369 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
370 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
371 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
372 return r; |
3889
59765d1bb6dc
mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents:
3888
diff
changeset
|
373 end, |
3922
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
374 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
|
375 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
|
376 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
|
377 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
|
378 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
|
379 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
|
380 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
|
381 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
|
382 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
|
383 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
384 end |
3932
8b34222216f4
mod_rest: Fix encoding of simple dataforms
Kim Alvefur <zash@zash.se>
parents:
3923
diff
changeset
|
385 form:up(); |
3922
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
386 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
387 return form; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
388 end |
3889
59765d1bb6dc
mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents:
3888
diff
changeset
|
389 }; |
3923
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
390 |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
391 -- XEP-0039: Statistics Gathering |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
392 stats = { type = "func", xmlns = "http://jabber.org/protocol/stats", tagname = "query", |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
393 st2json = function (s) |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
394 local o = array(); |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
395 for stat in s:childtags("stat") do |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
396 o:push({ |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
397 name = stat.attr.name; |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
398 unit = stat.attr.unit; |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
399 value = stat.attr.value; |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
400 }); |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
401 end |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
402 return o; |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
403 end; |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
404 json2st = function (j) |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
405 local stats = st.stanza("query", { xmlns = "http://jabber.org/protocol/stats" }); |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
406 if type(j) == "table" then |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
407 for _, stat in ipairs(j) do |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
408 stats:tag("stat", { name = stat.name, unit = stat.unit, value = stat.value }):up(); |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
409 end |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
410 end |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
411 return stats; |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
412 end; |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
413 }; |
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
414 |
3813 | 415 }; |
416 | |
4309
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
417 local byxmlname = {}; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
418 for k, spec in pairs(field_mappings) do |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
419 if type(spec) == "table" then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
420 spec.key = k; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
421 if spec.xmlns and spec.tagname then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
422 byxmlname["{" .. spec.xmlns .. "}" .. spec.tagname] = spec; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
423 elseif spec.type == "name" then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
424 byxmlname["{" .. spec.xmlns .. "}"] = spec; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
425 end |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
426 elseif type(spec) == "string" then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
427 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
|
428 end |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
429 end |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
430 |
3813 | 431 local implied_kinds = { |
432 disco = "iq", | |
433 items = "iq", | |
434 ping = "iq", | |
3854
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
435 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
|
436 command = "iq", |
3813 | 437 |
438 body = "message", | |
439 html = "message", | |
440 replace = "message", | |
441 state = "message", | |
442 subject = "message", | |
443 thread = "message", | |
444 | |
445 join = "presence", | |
446 priority = "presence", | |
447 show = "presence", | |
448 status = "presence", | |
449 } | |
450 | |
4021
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
451 local implied_types = { |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
452 command = "set", |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
453 } |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
454 |
3813 | 455 local kind_by_type = { |
456 get = "iq", set = "iq", result = "iq", | |
457 normal = "message", chat = "message", headline = "message", groupchat = "message", | |
458 available = "presence", unavailable = "presence", | |
459 subscribe = "presence", unsubscribe = "presence", | |
460 subscribed = "presence", unsubscribed = "presence", | |
461 } | |
462 | |
463 local function st2json(s) | |
464 local t = { | |
465 kind = s.name, | |
466 type = s.attr.type, | |
467 to = s.attr.to, | |
468 from = s.attr.from, | |
469 id = s.attr.id, | |
4035
270cd50852be
mod_rest: Map xml:lang to/from JSON
Kim Alvefur <zash@zash.se>
parents:
4021
diff
changeset
|
470 lang = s.attr["xml:lang"], |
3813 | 471 }; |
472 if s.name == "presence" and not s.attr.type then | |
473 t.type = "available"; | |
474 end | |
475 | |
476 if t.to then | |
477 t.to = jid.prep(t.to); | |
478 if not t.to then return nil, "invalid-jid-to"; end | |
479 end | |
480 if t.from then | |
481 t.from = jid.prep(t.from); | |
482 if not t.from then return nil, "invalid-jid-from"; end | |
483 end | |
484 | |
485 if t.type == "error" then | |
3871
e5d08bb58155
mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents:
3870
diff
changeset
|
486 local error = s:get_child("error"); |
3813 | 487 local err_typ, err_condition, err_text = s:get_error(); |
488 t.error = { | |
489 type = err_typ, | |
490 condition = err_condition, | |
3871
e5d08bb58155
mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents:
3870
diff
changeset
|
491 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
|
492 by = error and error.attr.by or nil, |
3813 | 493 }; |
494 return t; | |
495 end | |
496 | |
4372
78de3c7acf58
mod_rest: Fix json-mapping stanzas with text or whitespace between tags
Kim Alvefur <zash@zash.se>
parents:
4309
diff
changeset
|
497 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
|
498 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
|
499 local mapping = byxmlname[prefix .. tag.name]; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
500 if not mapping then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
501 mapping = byxmlname[prefix]; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
502 end |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
503 |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
504 if not mapping then -- luacheck: ignore 542 |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
505 -- pass |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
506 elseif mapping.type == "text_tag" then |
4309
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
507 t[mapping.key] = tag:get_text(); |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
508 elseif mapping.type == "name" then |
4309
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
509 t[mapping.key] = tag.name; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
510 elseif mapping.type == "attr" then |
4309
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
511 t[mapping.key] = tag.attr[mapping.attr]; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
512 elseif mapping.type == "bool_tag" then |
4309
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
513 t[mapping.key] = true; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
514 elseif 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
|
515 t[mapping.key] = mapping.st2json(tag); |
3813 | 516 end |
517 end | |
518 | |
519 return t; | |
520 end | |
521 | |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
522 local function str(s) |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
523 if type(s) == "string" then |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
524 return s; |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
525 end |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
526 end |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
527 |
3813 | 528 local function json2st(t) |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
529 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
|
530 return nil, "invalid-json"; |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
531 end |
4021
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
532 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
|
533 if t_type == nil then |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
534 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
|
535 if t[k] then |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
536 t_type = implied; |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
537 end |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
538 end |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
539 end |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
540 local kind = str(t.kind) or kind_by_type[t_type]; |
3813 | 541 if not kind then |
542 for k, implied in pairs(implied_kinds) do | |
543 if t[k] then | |
544 kind = implied; | |
545 break | |
546 end | |
547 end | |
548 end | |
549 | |
4021
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
550 if t_type == "available" then |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
551 t_type = nil; |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
552 end |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
553 |
3813 | 554 local s = st.stanza(kind or "message", { |
4021
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
555 type = t_type; |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
556 to = str(t.to) and jid.prep(t.to); |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
557 from = str(t.to) and jid.prep(t.from); |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
558 id = str(t.id), |
4035
270cd50852be
mod_rest: Map xml:lang to/from JSON
Kim Alvefur <zash@zash.se>
parents:
4021
diff
changeset
|
559 ["xml:lang"] = str(t.lang), |
3813 | 560 }); |
561 | |
562 if t.to and not s.attr.to then | |
563 return nil, "invalid-jid-to"; | |
564 end | |
565 if t.from and not s.attr.from then | |
566 return nil, "invalid-jid-from"; | |
567 end | |
3819 | 568 if kind == "iq" and not s.attr.type then |
569 s.attr.type = "get"; | |
3818
a607c69d0804
mod_rest: Guess 'get' as default type for 'iq' stanzas in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3817
diff
changeset
|
570 end |
3813 | 571 |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
572 if type(t.error) == "table" then |
3871
e5d08bb58155
mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents:
3870
diff
changeset
|
573 return st.error_reply(st.reply(s), str(t.error.type), str(t.error.condition), str(t.error.text), str(t.error.by)); |
3813 | 574 elseif t.type == "error" then |
575 s:text_tag("error", t.body, { code = t.error_code and tostring(t.error_code) }); | |
576 return s; | |
577 end | |
578 | |
579 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
|
580 local mapping = field_mappings[k]; |
25a3ad36ef3e
mod_rest: Rename loop variable for improved clarity
Kim Alvefur <zash@zash.se>
parents:
3894
diff
changeset
|
581 if mapping then |
25a3ad36ef3e
mod_rest: Rename loop variable for improved clarity
Kim Alvefur <zash@zash.se>
parents:
3894
diff
changeset
|
582 if mapping == "text_tag" then |
3813 | 583 s:text_tag(k, v); |
3895
25a3ad36ef3e
mod_rest: Rename loop variable for improved clarity
Kim Alvefur <zash@zash.se>
parents:
3894
diff
changeset
|
584 elseif mapping == "attr" then -- luacheck: ignore 542 |
3886
b64b08b7bf8e
mod_rest: Ignore already handled top-level stanza attr fields
Kim Alvefur <zash@zash.se>
parents:
3885
diff
changeset
|
585 -- handled already |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
586 elseif mapping.type == "text_tag" then |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
587 s:text_tag(mapping.tagname or k, v, mapping.xmlns and { xmlns = mapping.xmlns }); |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
588 elseif mapping.type == "name" then |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
589 s:tag(v, { xmlns = mapping.xmlns }):up(); |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
590 elseif mapping.type == "attr" then |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
591 s:tag(mapping.tagname or k, { xmlns = mapping.xmlns, [mapping.attr or k] = v }):up(); |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
592 elseif mapping.type == "bool_tag" then |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
593 s:tag(mapping.tagname or k, { xmlns = mapping.xmlns }):up(); |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
594 elseif mapping.type == "func" and mapping.json2st then |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
595 s:add_child(mapping.json2st(v)):up(); |
3813 | 596 end |
3885
1ec45dbc7db5
mod_rest: Return an error for unknown fields in JSON input
Kim Alvefur <zash@zash.se>
parents:
3881
diff
changeset
|
597 else |
1ec45dbc7db5
mod_rest: Return an error for unknown fields in JSON input
Kim Alvefur <zash@zash.se>
parents:
3881
diff
changeset
|
598 return nil, "unknown-field"; |
3813 | 599 end |
600 end | |
601 | |
602 s:reset(); | |
603 | |
604 return s; | |
605 end | |
606 | |
607 return { | |
608 st2json = st2json; | |
609 json2st = json2st; | |
610 }; |