aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/mod_vcard_legacy.lua1
-rw-r--r--spec/util_stanza_spec.lua28
-rw-r--r--util/stanza.lua44
3 files changed, 37 insertions, 36 deletions
diff --git a/plugins/mod_vcard_legacy.lua b/plugins/mod_vcard_legacy.lua
index cf0724f3..38c56041 100644
--- a/plugins/mod_vcard_legacy.lua
+++ b/plugins/mod_vcard_legacy.lua
@@ -274,6 +274,7 @@ local function inject_xep153(event)
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 --git a/spec/util_stanza_spec.lua b/spec/util_stanza_spec.lua
index 7fe836c7..6fbae41a 100644
--- a/spec/util_stanza_spec.lua
+++ b/spec/util_stanza_spec.lua
@@ -4,23 +4,33 @@ local st = require "util.stanza";
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 --git a/util/stanza.lua b/util/stanza.lua
index 8d199912..a90d56b3 100644
--- a/util/stanza.lua
+++ b/util/stanza.lua
@@ -361,41 +361,31 @@ end
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);
- 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
+ stanza:add_direct_child(deserialize(child));
+ elseif type(child) == "string" then
+ stanza:add_direct_child(child);
end
- stanza.tags = tags;
end
+ return stanza;
end
-
- return stanza;
end
local function _clone(stanza)