# HG changeset patch # User Kim Alvefur # Date 1543714716 -3600 # Node ID 7d8e08f80dbd9fc2d6a1a3e6a2f066b510df0d40 # Parent e50559a42dfec4c76193d80c18ef2bb9866b5812# Parent 6f97acc4583b0a9f579d4bb09035557f0e13e7f2 Merge 0.11->trunk diff -r e50559a42dfe -r 7d8e08f80dbd plugins/mod_vcard_legacy.lua --- a/plugins/mod_vcard_legacy.lua Sat Dec 01 22:13:24 2018 +0000 +++ b/plugins/mod_vcard_legacy.lua Sun Dec 02 02:38:36 2018 +0100 @@ -274,6 +274,7 @@ local origin, stanza = event.origin, event.stanza; local username = origin.username; if not username then return end + if stanza.attr.type then return end local pep_service = mod_pep.get_pep_service(username); stanza:remove_children("x", "vcard-temp:x:update"); diff -r e50559a42dfe -r 7d8e08f80dbd spec/util_stanza_spec.lua --- a/spec/util_stanza_spec.lua Sat Dec 01 22:13:24 2018 +0000 +++ b/spec/util_stanza_spec.lua Sun Dec 02 02:38:36 2018 +0100 @@ -4,23 +4,33 @@ describe("util.stanza", function() describe("#preserialize()", function() it("should work", function() - local stanza = st.stanza("message", { a = "a" }); + local stanza = st.stanza("message", { type = "chat" }):text_tag("body", "Hello"); local stanza2 = st.preserialize(stanza); - assert.is_string(stanza2 and stanza.name, "preserialize returns a stanza"); + assert.is_table(stanza2, "Preserialized stanza is a table"); + assert.is_nil(getmetatable(stanza2), "Preserialized stanza has no metatable"); + assert.is_string(stanza2.name, "Preserialized stanza has a name field"); + assert.equal(stanza.name, stanza2.name, "Preserialized stanza has same name as the input stanza"); + assert.same(stanza.attr, stanza2.attr, "Preserialized stanza same attr table as input stanza"); assert.is_nil(stanza2.tags, "Preserialized stanza has no tag list"); assert.is_nil(stanza2.last_add, "Preserialized stanza has no last_add marker"); - assert.is_nil(getmetatable(stanza2), "Preserialized stanza has no metatable"); + assert.is_table(stanza2[1], "Preserialized child element preserved"); + assert.equal("body", stanza2[1].name, "Preserialized child element name preserved"); end); end); - describe("#preserialize()", function() + describe("#deserialize()", function() it("should work", function() - local stanza = st.stanza("message", { a = "a" }); + local stanza = { name = "message", attr = { type = "chat" }, { name = "body", attr = { }, "Hello" } }; local stanza2 = st.deserialize(st.preserialize(stanza)); - assert.is_string(stanza2 and stanza.name, "deserialize returns a stanza"); - assert.is_table(stanza2.attr, "Deserialized stanza has attributes"); - assert.are.equal(stanza2.attr.a, "a", "Deserialized stanza retains attributes"); - assert.is_table(getmetatable(stanza2), "Deserialized stanza has metatable"); + + assert.is_table(stanza2, "Deserialized stanza is a table"); + assert.equal(st.stanza_mt, getmetatable(stanza2), "Deserialized stanza has stanza metatable"); + assert.is_string(stanza2.name, "Deserialized stanza has a name field"); + assert.equal(stanza.name, stanza2.name, "Deserialized stanza has same name as the input table"); + assert.same(stanza.attr, stanza2.attr, "Deserialized stanza same attr table as input table"); + assert.is_table(stanza2.tags, "Deserialized stanza has tag list"); + assert.is_table(stanza2[1], "Deserialized child element preserved"); + assert.equal("body", stanza2[1].name, "Deserialized child element name preserved"); end); end); diff -r e50559a42dfe -r 7d8e08f80dbd util/stanza.lua --- a/util/stanza.lua Sat Dec 01 22:13:24 2018 +0000 +++ b/util/stanza.lua Sun Dec 02 02:38:36 2018 +0100 @@ -361,41 +361,31 @@ stanza_mt.__freeze = preserialize; -local function deserialize(stanza) +local function deserialize(serialized) -- Set metatable - if stanza then - local attr = stanza.attr; - for i=1,#attr do attr[i] = nil; end + if serialized then + local attr = serialized.attr; local attrx = {}; - for att in pairs(attr) do - if s_find(att, "|", 1, true) and not s_find(att, "\1", 1, true) then - local ns,na = s_match(att, "^([^|]+)|(.+)$"); - attrx[ns.."\1"..na] = attr[att]; - attr[att] = nil; + for att, val in pairs(attr) do + if type(att) == "string" then + if s_find(att, "|", 1, true) and not s_find(att, "\1", 1, true) then + local ns,na = s_match(att, "^([^|]+)|(.+)$"); + attrx[ns.."\1"..na] = val; + else + attrx[att] = val; + end end end - for a,v in pairs(attrx) do - attr[a] = v; - end - setmetatable(stanza, stanza_mt); - for _, child in ipairs(stanza) do + local stanza = new_stanza(serialized.name, attrx); + for _, child in ipairs(serialized) do if type(child) == "table" then - deserialize(child); + stanza:add_direct_child(deserialize(child)); + elseif type(child) == "string" then + stanza:add_direct_child(child); end end - if not stanza.tags then - -- Rebuild tags - local tags = {}; - for _, child in ipairs(stanza) do - if type(child) == "table" then - t_insert(tags, child); - end - end - stanza.tags = tags; - end + return stanza; end - - return stanza; end local function _clone(stanza)