util.stanza: Validate input to clone() (with brief tests)

This commit is contained in:
Kim Alvefur 2018-11-17 15:26:11 +01:00
parent 813f69fd2b
commit 50f6335501
2 changed files with 23 additions and 2 deletions

View file

@ -346,4 +346,18 @@ describe("util.stanza", function()
end, "Invalid stanza");
end);
end);
describe("#clone", function ()
it("works", function ()
local s = st.message({type="chat"}, "Hello"):reset();
local c = st.clone(s);
assert.same(s, c);
end);
it("works", function ()
assert.has_error(function ()
st.clone("this is not a stanza");
end);
end);
end);
end);

View file

@ -398,7 +398,7 @@ local function deserialize(stanza)
return stanza;
end
local function clone(stanza)
local function _clone(stanza)
local attr, tags = {}, {};
for k,v in pairs(stanza.attr) do attr[k] = v; end
local old_namespaces, namespaces = stanza.namespaces;
@ -410,7 +410,7 @@ local function clone(stanza)
for i=1,#stanza do
local child = stanza[i];
if child.name then
child = clone(child);
child = _clone(child);
t_insert(tags, child);
end
t_insert(new, child);
@ -418,6 +418,13 @@ local function clone(stanza)
return setmetatable(new, stanza_mt);
end
local function clone(stanza)
if not is_stanza(stanza) then
error("bad argument to clone: expected stanza, got "..type(stanza));
end
return _clone(stanza);
end
local function message(attr, body)
if not body then
return new_stanza("message", attr);