comparison mod_rest/jsonmap.lib.lua @ 3817:937f8c463be6

mod_rest: Stricter type checks in JSON mapping
author Kim Alvefur <zash@zash.se>
date Wed, 01 Jan 2020 17:16:40 +0100
parents aa1ad69c7c10
children a607c69d0804
comparison
equal deleted inserted replaced
3816:8473fd2d09c1 3817:937f8c463be6
29 "func", "http://jabber.org/protocol/xhtml-im", "html", 29 "func", "http://jabber.org/protocol/xhtml-im", "html",
30 function (s) --> json string 30 function (s) --> json string
31 return tostring(s:get_child("body", "http://www.w3.org/1999/xhtml")); 31 return tostring(s:get_child("body", "http://www.w3.org/1999/xhtml"));
32 end; 32 end;
33 function (s) --> xml 33 function (s) --> xml
34 return xml.parse([[<html xmlns='http://jabber.org/protocol/xhtml-im'>]]..s..[[</html>]]); 34 if type(s) == "string" then
35 return xml.parse([[<html xmlns='http://jabber.org/protocol/xhtml-im'>]]..s..[[</html>]]);
36 end
35 end; 37 end;
36 }; 38 };
37 39
38 -- XEP-0199 40 -- XEP-0199
39 ping = {"bool_tag", "urn:xmpp:ping", "ping"}, 41 ping = {"bool_tag", "urn:xmpp:ping", "ping"},
93 oob_url = {"func", "jabber:iq:oob", "query", 95 oob_url = {"func", "jabber:iq:oob", "query",
94 function (s) 96 function (s)
95 return s:get_child_text("url"); 97 return s:get_child_text("url");
96 end; 98 end;
97 function (s) 99 function (s)
98 return st.stanza("query", { xmlns = "jabber:iq:oob" }):text_tag("url", s); 100 if type(s) == "string" then
101 return st.stanza("query", { xmlns = "jabber:iq:oob" }):text_tag("url", s);
102 end
99 end; 103 end;
100 }; 104 };
101 }; 105 };
102 106
103 local implied_kinds = { 107 local implied_kinds = {
186 end 190 end
187 191
188 return t; 192 return t;
189 end 193 end
190 194
195 local function str(s)
196 if type(s) == "string" then
197 return s;
198 end
199 end
200
191 local function json2st(t) 201 local function json2st(t)
192 local kind = t.kind or kind_by_type[t.type]; 202 if type(t) ~= "table" or not str(next(t)) then
203 return nil, "invalid-json";
204 end
205 local kind = str(t.kind) or kind_by_type[str(t.type)];
193 if not kind then 206 if not kind then
194 for k, implied in pairs(implied_kinds) do 207 for k, implied in pairs(implied_kinds) do
195 if t[k] then 208 if t[k] then
196 kind = implied; 209 kind = implied;
197 break 210 break
198 end 211 end
199 end 212 end
200 end 213 end
201 214
202 local s = st.stanza(kind or "message", { 215 local s = st.stanza(kind or "message", {
203 type = t.type ~= "available" and t.type or nil, 216 type = t.type ~= "available" and str(t.type) or nil,
204 to = jid.prep(t.to); 217 to = str(t.to) and jid.prep(t.to);
205 from = jid.prep(t.from); 218 from = str(t.to) and jid.prep(t.from);
206 id = t.id, 219 id = str(t.id),
207 }); 220 });
208 221
209 if t.to and not s.attr.to then 222 if t.to and not s.attr.to then
210 return nil, "invalid-jid-to"; 223 return nil, "invalid-jid-to";
211 end 224 end
212 if t.from and not s.attr.from then 225 if t.from and not s.attr.from then
213 return nil, "invalid-jid-from"; 226 return nil, "invalid-jid-from";
214 end 227 end
215 228
216 if t.error then 229 if type(t.error) == "table" then
217 return st.error_reply(st.reply(s), t.error.type, t.error.condition, t.error.text); 230 return st.error_reply(st.reply(s), str(t.error.type), str(t.error.condition), str(t.error.text));
218 elseif t.type == "error" then 231 elseif t.type == "error" then
219 s:text_tag("error", t.body, { code = t.error_code and tostring(t.error_code) }); 232 s:text_tag("error", t.body, { code = t.error_code and tostring(t.error_code) });
220 return s; 233 return s;
221 end 234 end
222 235