Mercurial > prosody-modules
annotate mod_rest/jsonmap.lib.lua @ 4646:072d078be095
mod_storage_xmlarchive: Advertise capabilities (none atm)
Both 'total' and 'quota' would be prohibitively expensive for the kind
of archives this module targets as it would require counting items
across the entire archive.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 13 Aug 2021 01:18:32 +0200 |
parents | b68b801ddc50 |
children | d71beacaec3b |
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"; | |
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 | 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 schema._common = nil; |
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 end |
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
22 |
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
23 -- 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
|
24 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
|
25 field_mappings = { |
3813 | 26 -- XEP-0071 |
27 html = { | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
28 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
|
29 st2json = function (s) --> json string |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
30 return (tostring(s:get_child("body", "http://www.w3.org/1999/xhtml")):gsub(" xmlns='[^']*'", "", 1)); |
3813 | 31 end; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
32 json2st = function (s) --> xml |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
33 if type(s) == "string" then |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
34 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
|
35 end |
3813 | 36 end; |
37 }; | |
38 | |
39 -- XEP-0030 | |
40 disco = { | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
41 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
|
42 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
|
43 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
|
44 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
|
45 end |
3953
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
46 local identities, features, extensions = array(), array(), {}; |
3813 | 47 for tag in s:childtags() do |
48 if tag.name == "identity" and tag.attr.category and tag.attr.type then | |
49 identities:push({ category = tag.attr.category, type = tag.attr.type, name = tag.attr.name }); | |
50 elseif tag.name == "feature" and tag.attr.var then | |
51 features:push(tag.attr.var); | |
52 end | |
53 end | |
3953
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
54 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
|
55 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
|
56 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
|
57 if jform then |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
58 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
|
59 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
|
60 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
61 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
62 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
|
63 return { node = s.attr.node, identities = identities, features = features, extensions = extensions }; |
3813 | 64 end; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
65 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
|
66 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
|
67 local disco = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", node = s.node }); |
3813 | 68 if s.identities then |
3848
1b9834500123
mod_rest: Fix iteration over disco#info identities
Kim Alvefur <zash@zash.se>
parents:
3823
diff
changeset
|
69 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
|
70 disco:tag("identity", { category = identity.category, type = identity.type, name = identity.name }):up(); |
3813 | 71 end |
72 end | |
73 if s.features then | |
3849
11c34e97fe1a
mod_rest: Fix iteration over disco#info features
Kim Alvefur <zash@zash.se>
parents:
3848
diff
changeset
|
74 for _, feature in ipairs(s.features) do |
3813 | 75 disco:tag("feature", { var = feature }):up(); |
76 end | |
77 end | |
3953
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
78 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
|
79 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
|
80 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
|
81 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
|
82 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
83 end |
3859
da3a0f055526
mod_rest: Fix handling of 'node' attribute in disco#info
Kim Alvefur <zash@zash.se>
parents:
3856
diff
changeset
|
84 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
|
85 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
|
86 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
|
87 else |
3870 | 88 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", }); |
3813 | 89 end |
90 end; | |
91 }; | |
92 | |
93 items = { | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
94 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
|
95 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
|
96 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
|
97 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
|
98 end |
93f71ab6cb00
mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents:
3871
diff
changeset
|
99 |
3813 | 100 local items = array(); |
101 for item in s:childtags("item") do | |
102 items:push({ jid = item.attr.jid, node = item.attr.node, name = item.attr.name }); | |
103 end | |
104 return items; | |
105 end; | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
106 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
|
107 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
|
108 local disco = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", node = s.node }); |
3813 | 109 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
|
110 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
|
111 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
|
112 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
|
113 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
|
114 end |
3813 | 115 end |
3875
93f71ab6cb00
mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents:
3871
diff
changeset
|
116 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
|
117 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
|
118 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
|
119 else |
93f71ab6cb00
mod_rest: Support passing 'node' attr in disco#items queries
Kim Alvefur <zash@zash.se>
parents:
3871
diff
changeset
|
120 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", }); |
3813 | 121 end |
122 end; | |
123 }; | |
124 | |
3877
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
125 -- XEP-0050: Ad-Hoc Commands |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
126 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
|
127 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
|
128 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
|
129 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
|
130 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
|
131 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
|
132 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
|
133 }; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
134 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
|
135 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
|
136 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
|
137 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
|
138 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
|
139 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
|
140 }; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
141 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
|
142 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
|
143 end |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
144 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
|
145 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
|
146 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
|
147 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
|
148 }; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
149 end |
3878
9a3dfe0bf9fd
mod_rest: Add JSON mapping for dataform (XEP-0004)
Kim Alvefur <zash@zash.se>
parents:
3877
diff
changeset
|
150 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
|
151 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
|
152 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
|
153 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
|
154 end; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
155 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
|
156 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
|
157 local cmd = st.stanza("command", { |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
158 xmlns = "http://jabber.org/protocol/commands", |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
159 action = s.action, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
160 node = s.node, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
161 sessionid = s.sessionid, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
162 status = s.status, |
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
163 }); |
3881
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
164 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
|
165 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
|
166 do |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
167 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
|
168 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
|
169 end |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
170 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
|
171 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
|
172 end |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
173 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
|
174 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
|
175 end |
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 cmd:up(); |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
178 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
|
179 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
|
180 end |
5d7df207dc2b
mod_rest: Add final pieces of XEP-0050 (actions, note, form)
Kim Alvefur <zash@zash.se>
parents:
3880
diff
changeset
|
181 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
|
182 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
|
183 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
|
184 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
|
185 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
|
186 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
|
187 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
|
188 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
|
189 end |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
190 -- 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
|
191 end; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
192 }; |
562b34050561
mod_rest: Add basic support for XEP-0050: Ad-Hoc commands (no forms)
Kim Alvefur <zash@zash.se>
parents:
3875
diff
changeset
|
193 |
3855
0e1e900577c4
mod_rest: Improve some comments
Kim Alvefur <zash@zash.se>
parents:
3854
diff
changeset
|
194 -- 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
|
195 -- 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
|
196 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
|
197 -- 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
|
198 st2json = function (s) |
3813 | 199 return s:get_child_text("url"); |
200 end; | |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
201 json2st = function (s) |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
202 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
|
203 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
|
204 end |
3813 | 205 end; |
206 }; | |
3823
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
207 |
3907
d5ecb9b9cb3b
mod_rest: Update with namespace and name of XEP-0432
Kim Alvefur <zash@zash.se>
parents:
3906
diff
changeset
|
208 -- 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
|
209 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
|
210 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
|
211 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
|
212 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
|
213 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
|
214 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
|
215 return { |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
216 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
|
217 data = parsed; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
218 }; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
219 end; |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
220 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
|
221 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
|
222 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
|
223 :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
|
224 end; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
225 end |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
226 }; |
31b1797a78e1
mod_rest: Add support for XEP-XXXX: User-defined Data Transfer
Kim Alvefur <zash@zash.se>
parents:
3822
diff
changeset
|
227 |
3889
59765d1bb6dc
mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents:
3888
diff
changeset
|
228 -- 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
|
229 dataform = { |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
230 -- 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
|
231 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
|
232 st2json = function (s) |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
233 local fields = array(); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
234 local form = { |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
235 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
|
236 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
|
237 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
|
238 fields = fields; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
239 }; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
240 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
|
241 local i = { |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
242 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
|
243 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
|
244 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
|
245 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
|
246 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
|
247 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
|
248 }; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
249 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
|
250 local value = array(); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
251 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
|
252 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
|
253 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
254 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
|
255 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
|
256 else |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
257 i.value = value; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
258 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
259 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
260 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
|
261 local options = array(); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
262 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
|
263 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
|
264 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
265 i.options = options; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
266 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
267 fields:push(i); |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
268 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
269 return form; |
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 json2st = function (x) |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
272 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
|
273 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
|
274 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
|
275 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
|
276 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
277 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
|
278 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
|
279 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
280 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
|
281 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
|
282 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
|
283 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
|
284 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
|
285 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
|
286 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
287 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
|
288 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
|
289 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
290 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
|
291 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
|
292 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
|
293 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
|
294 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
|
295 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
296 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
297 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
|
298 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
|
299 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
|
300 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
|
301 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
|
302 form:up(); |
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 end |
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 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
307 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
308 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
309 return form; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
310 end |
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 }; |
3889
59765d1bb6dc
mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents:
3888
diff
changeset
|
313 |
3922
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
314 -- 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
|
315 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
|
316 st2json = function (s) |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
317 local r = {}; |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
318 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
|
319 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
|
320 local values = array(); |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
321 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
|
322 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
|
323 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
324 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
|
325 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
|
326 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
|
327 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
|
328 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
|
329 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
|
330 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
|
331 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
|
332 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
|
333 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
|
334 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
335 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
336 end |
2c6d5734ae04
mod_rest: Add JSON mapping of XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents:
3932
diff
changeset
|
337 return r; |
3889
59765d1bb6dc
mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents:
3888
diff
changeset
|
338 end, |
3922
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
339 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
|
340 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
|
341 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
|
342 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
|
343 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
|
344 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
|
345 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
|
346 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
|
347 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
|
348 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
349 end |
3932
8b34222216f4
mod_rest: Fix encoding of simple dataforms
Kim Alvefur <zash@zash.se>
parents:
3923
diff
changeset
|
350 form:up(); |
3922
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
351 end |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
352 return form; |
ea59c9455f93
mod_rest: Move dataforms into structure for more logical code order
Kim Alvefur <zash@zash.se>
parents:
3912
diff
changeset
|
353 end |
3889
59765d1bb6dc
mod_rest: Support mapping XEP-0004 Data Forms directly
Kim Alvefur <zash@zash.se>
parents:
3888
diff
changeset
|
354 }; |
3923
3c3d216c6f6d
mod_rest: Add JSON mapping of XEP-0039: Statistics Gathering
Kim Alvefur <zash@zash.se>
parents:
3922
diff
changeset
|
355 |
3813 | 356 }; |
357 | |
4309
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
358 local byxmlname = {}; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
359 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
|
360 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
|
361 replace.properties[k] = nil |
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
362 end |
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
363 |
4309
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
364 if type(spec) == "table" then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
365 spec.key = k; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
366 if spec.xmlns and spec.tagname then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
367 byxmlname["{" .. spec.xmlns .. "}" .. spec.tagname] = spec; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
368 elseif spec.type == "name" then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
369 byxmlname["{" .. spec.xmlns .. "}"] = spec; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
370 end |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
371 elseif type(spec) == "string" then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
372 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
|
373 end |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
374 end |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
375 |
3813 | 376 local implied_kinds = { |
377 disco = "iq", | |
378 items = "iq", | |
379 ping = "iq", | |
3854
25c34c9f755c
mod_rest: Add mapping of XEP-0092: Software Version
Kim Alvefur <zash@zash.se>
parents:
3852
diff
changeset
|
380 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
|
381 command = "iq", |
3813 | 382 |
383 body = "message", | |
384 html = "message", | |
385 replace = "message", | |
386 state = "message", | |
387 subject = "message", | |
388 thread = "message", | |
389 | |
390 join = "presence", | |
391 priority = "presence", | |
392 show = "presence", | |
393 status = "presence", | |
394 } | |
395 | |
4021
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
396 local implied_types = { |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
397 command = "set", |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
398 } |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
399 |
3813 | 400 local kind_by_type = { |
401 get = "iq", set = "iq", result = "iq", | |
402 normal = "message", chat = "message", headline = "message", groupchat = "message", | |
403 available = "presence", unavailable = "presence", | |
404 subscribe = "presence", unsubscribe = "presence", | |
405 subscribed = "presence", unsubscribed = "presence", | |
406 } | |
407 | |
408 local function st2json(s) | |
4518
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
409 local t = map.parse(schema.properties[s.name], s); |
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
410 |
4525
b68b801ddc50
mod_rest: Restore 'kind' property in JSON-mapped objects
Kim Alvefur <zash@zash.se>
parents:
4519
diff
changeset
|
411 t.kind = s.name; |
b68b801ddc50
mod_rest: Restore 'kind' property in JSON-mapped objects
Kim Alvefur <zash@zash.se>
parents:
4519
diff
changeset
|
412 |
3813 | 413 if s.name == "presence" and not s.attr.type then |
414 t.type = "available"; | |
415 end | |
416 | |
417 if t.to then | |
418 t.to = jid.prep(t.to); | |
419 if not t.to then return nil, "invalid-jid-to"; end | |
420 end | |
421 if t.from then | |
422 t.from = jid.prep(t.from); | |
423 if not t.from then return nil, "invalid-jid-from"; end | |
424 end | |
425 | |
426 if t.type == "error" then | |
3871
e5d08bb58155
mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents:
3870
diff
changeset
|
427 local error = s:get_child("error"); |
3813 | 428 local err_typ, err_condition, err_text = s:get_error(); |
429 t.error = { | |
430 type = err_typ, | |
431 condition = err_condition, | |
3871
e5d08bb58155
mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents:
3870
diff
changeset
|
432 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
|
433 by = error and error.attr.by or nil, |
3813 | 434 }; |
435 return t; | |
436 end | |
437 | |
4372
78de3c7acf58
mod_rest: Fix json-mapping stanzas with text or whitespace between tags
Kim Alvefur <zash@zash.se>
parents:
4309
diff
changeset
|
438 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
|
439 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
|
440 local mapping = byxmlname[prefix .. tag.name]; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
441 if not mapping then |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
442 mapping = byxmlname[prefix]; |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
443 end |
e8b9228b5265
mod_rest: Optimize stanza to JSON mapping
Kim Alvefur <zash@zash.se>
parents:
4251
diff
changeset
|
444 |
4518
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
445 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
|
446 t[mapping.key] = mapping.st2json(tag); |
3813 | 447 end |
448 end | |
449 | |
450 return t; | |
451 end | |
452 | |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
453 local function str(s) |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
454 if type(s) == "string" then |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
455 return s; |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
456 end |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
457 end |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
458 |
3813 | 459 local function json2st(t) |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
460 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
|
461 return nil, "invalid-json"; |
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
462 end |
4021
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
463 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
|
464 if t_type == nil then |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
465 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
|
466 if t[k] then |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
467 t_type = implied; |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
468 end |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
469 end |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
470 end |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
471 local kind = str(t.kind) or kind_by_type[t_type]; |
3813 | 472 if not kind then |
473 for k, implied in pairs(implied_kinds) do | |
474 if t[k] then | |
475 kind = implied; | |
476 break | |
477 end | |
478 end | |
479 end | |
480 | |
4518
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
481 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
|
482 t_type = nil; |
4518
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
483 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
|
484 t_type = "get"; |
4021
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
485 end |
1925d63eec6b
mod_rest/jsonmap: Derive stanza @type from certain payloads
Kim Alvefur <zash@zash.se>
parents:
3953
diff
changeset
|
486 |
4518
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
487 local s = map.unparse(schema.properties[kind or "message"], t); |
3813 | 488 |
4518
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
489 s.attr.type = t_type; |
073f5397c1d2
mod_rest: Replace most mappings by using util.datamapper
Kim Alvefur <zash@zash.se>
parents:
4501
diff
changeset
|
490 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
|
491 s.attr.from = str(t.to) and jid.prep(t.from); |
3813 | 492 |
3817
937f8c463be6
mod_rest: Stricter type checks in JSON mapping
Kim Alvefur <zash@zash.se>
parents:
3813
diff
changeset
|
493 if type(t.error) == "table" then |
3871
e5d08bb58155
mod_rest: Map the error@by attribute
Kim Alvefur <zash@zash.se>
parents:
3870
diff
changeset
|
494 return st.error_reply(st.reply(s), str(t.error.type), str(t.error.condition), str(t.error.text), str(t.error.by)); |
3813 | 495 elseif t.type == "error" then |
496 s:text_tag("error", t.body, { code = t.error_code and tostring(t.error_code) }); | |
497 return s; | |
498 end | |
499 | |
500 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
|
501 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
|
502 if mapping and mapping.type == "func" and mapping.json2st then |
3896
987b203bb091
mod_rest: Restructure JSON / Stanza mapping definitions
Kim Alvefur <zash@zash.se>
parents:
3895
diff
changeset
|
503 s:add_child(mapping.json2st(v)):up(); |
3813 | 504 end |
505 end | |
506 | |
507 s:reset(); | |
508 | |
509 return s; | |
510 end | |
511 | |
512 return { | |
513 st2json = st2json; | |
514 json2st = json2st; | |
515 }; |