From 47887761c66965740a231c2869806ef03acba901 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 11 Jan 2019 09:20:45 +0100 Subject: mod_vcard_legacy: Factor out conversion from vcard-temp to 4 --- plugins/mod_vcard_legacy.lua | 49 ++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 18 deletions(-) (limited to 'plugins') diff --git a/plugins/mod_vcard_legacy.lua b/plugins/mod_vcard_legacy.lua index 38c56041..5c40b7dd 100644 --- a/plugins/mod_vcard_legacy.lua +++ b/plugins/mod_vcard_legacy.lua @@ -143,19 +143,12 @@ local node_defaults = { _defaults_only = true; }; -module:hook("iq-set/self/vcard-temp:vCard", function (event) - local origin, stanza = event.origin, event.stanza; - local pep_service = mod_pep.get_pep_service(origin.username); - - local vcard_temp = stanza.tags[1]; +function vcard_to_pep(vcard_temp) + local avatars = {}; local vcard4 = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = "current" }) :tag("vcard", { xmlns = 'urn:ietf:params:xml:ns:vcard-4.0' }); - if pep_service:purge("urn:xmpp:avatar:metadata", origin.full_jid) then - pep_service:purge("urn:xmpp:avatar:data", origin.full_jid); - end - vcard4:tag("fn"):text_tag("text", vcard_temp:get_child_text("FN")):up(); local N = vcard_temp:get_child("N"); @@ -248,19 +241,39 @@ module:hook("iq-set/self/vcard-temp:vCard", function (event) :tag("data", { xmlns="urn:xmpp:avatar:data" }) :text(avatar_payload); - local ok, err = pep_service:publish("urn:xmpp:avatar:data", origin.full_jid, avatar_hash, avatar_data, node_defaults) - if ok then - ok, err = pep_service:publish("urn:xmpp:avatar:metadata", origin.full_jid, avatar_hash, avatar_meta, node_defaults); - end - if not ok then - handle_error(origin, stanza, err); - return true; - end + table.insert(avatars, { hash = avatar_hash, meta = avatar_meta, data = avatar_data }); end end end + return vcard4, avatars; +end + +function save_to_pep(pep_service, actor, vcard4, avatars) + + if pep_service:purge("urn:xmpp:avatar:metadata", actor) then + pep_service:purge("urn:xmpp:avatar:data", actor); + end + + for _, avatar in ipairs(avatars) do + local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, node_defaults) + if ok then + ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, node_defaults); + end + if not ok then + return ok, err; + end + end + + return pep_service:publish("urn:xmpp:vcard4", actor, "current", vcard4, node_defaults); +end + +module:hook("iq-set/self/vcard-temp:vCard", function (event) + local origin, stanza = event.origin, event.stanza; + local pep_service = mod_pep.get_pep_service(origin.username); + + local vcard_temp = stanza.tags[1]; - local ok, err = pep_service:publish("urn:xmpp:vcard4", origin.full_jid, "current", vcard4, node_defaults); + local ok, err = save_to_pep(pep_service, origin.full_jid, vcard_to_pep(vcard_temp)); if ok then origin.send(st.reply(stanza)); else -- cgit v1.2.3 From cc4a160cdb7d02a3c08d7ccbb0ce3e04025137ad Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 11 Jan 2019 09:20:48 +0100 Subject: mod_vcard_legacy: Adapt node defaults to number of avatars --- plugins/mod_vcard_legacy.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'plugins') diff --git a/plugins/mod_vcard_legacy.lua b/plugins/mod_vcard_legacy.lua index 5c40b7dd..80ce9e61 100644 --- a/plugins/mod_vcard_legacy.lua +++ b/plugins/mod_vcard_legacy.lua @@ -254,10 +254,18 @@ function save_to_pep(pep_service, actor, vcard4, avatars) pep_service:purge("urn:xmpp:avatar:data", actor); end + local avatar_defaults = node_defaults; + if #avatars > 1 then + avatar_defaults = {}; + for k,v in pairs(node_defaults) do + avatar_defaults[k] = v; + end + avatar_defaults.max_items = #avatars; + end for _, avatar in ipairs(avatars) do - local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, node_defaults) + local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults) if ok then - ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, node_defaults); + ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, avatar_defaults); end if not ok then return ok, err; -- cgit v1.2.3 From f7c48ad3bc1f4819ecb344729bf771887f6ab59b Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Thu, 10 Jan 2019 15:39:02 +0100 Subject: mod_vcard_legacy: Upgrade vcard-temp on login (fixes #1289) --- plugins/mod_vcard_legacy.lua | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'plugins') diff --git a/plugins/mod_vcard_legacy.lua b/plugins/mod_vcard_legacy.lua index 80ce9e61..6a196b32 100644 --- a/plugins/mod_vcard_legacy.lua +++ b/plugins/mod_vcard_legacy.lua @@ -130,10 +130,6 @@ module:hook("iq-get/bare/vcard-temp:vCard", function (event) end end - if not vcard_temp.tags[1] then - vcard_temp = st.deserialize(vcards:get(jid_split(stanza.attr.to) or origin.username)) or vcard_temp; - end - origin.send(st.reply(stanza):add_child(vcard_temp)); return true; end); @@ -310,3 +306,21 @@ end module:hook("pre-presence/full", inject_xep153, 1); module:hook("pre-presence/bare", inject_xep153, 1); module:hook("pre-presence/host", inject_xep153, 1); + +module:hook("resource-bind", function (event) + local session = event.session; + local username = session.username; + local vcard_temp = vcards:get(username); + if not vcard_temp then + session.log("debug", "No legacy vCard to migrate or already migrated"); + return; + end + vcard_temp = st.deserialize(vcard_temp); + local pep_service = mod_pep.get_pep_service(username); + local ok, err = save_to_pep(pep_service, true, vcard_to_pep(vcard_temp)); + if ok and vcards:set(username, nil) then + session.log("info", "Migrated vCard-temp to PEP"); + else + session.log("info", "Failed to migrate vCard-temp to PEP: %s", err or "problem emptying 'vcard' store"); + end +end); -- cgit v1.2.3 From 55490159fd26ac8fcb79c99dd1d1eb63d6d93e52 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 25 Jan 2019 23:21:13 +0100 Subject: mod_vcard_legacy: Add some missing semicolons --- plugins/mod_vcard_legacy.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins') diff --git a/plugins/mod_vcard_legacy.lua b/plugins/mod_vcard_legacy.lua index 6a196b32..a738a5f7 100644 --- a/plugins/mod_vcard_legacy.lua +++ b/plugins/mod_vcard_legacy.lua @@ -1,4 +1,4 @@ -local st = require "util.stanza" +local st = require "util.stanza"; local jid_split = require "util.jid".split; local mod_pep = module:depends("pep"); @@ -259,7 +259,7 @@ function save_to_pep(pep_service, actor, vcard4, avatars) avatar_defaults.max_items = #avatars; end for _, avatar in ipairs(avatars) do - local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults) + local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults); if ok then ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, avatar_defaults); end -- cgit v1.2.3 From 22bdd21fc1b1d8b4b926c098ef71e506b21e1a88 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 25 Jan 2019 23:27:23 +0100 Subject: mod_vcard_legacy: Don't overwrite existing PEP data --- plugins/mod_vcard_legacy.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'plugins') diff --git a/plugins/mod_vcard_legacy.lua b/plugins/mod_vcard_legacy.lua index a738a5f7..633b7729 100644 --- a/plugins/mod_vcard_legacy.lua +++ b/plugins/mod_vcard_legacy.lua @@ -315,8 +315,15 @@ module:hook("resource-bind", function (event) session.log("debug", "No legacy vCard to migrate or already migrated"); return; end - vcard_temp = st.deserialize(vcard_temp); local pep_service = mod_pep.get_pep_service(username); + if pep_service:get_last_item("urn:xmpp:vcard4", true) + or pep_service:get_last_item("urn:xmpp:avatar:metadata", true) + or pep_service:get_last_item("urn:xmpp:avatar:data", true) then + session.log("debug", "Already PEP data, not overwriting with migrated data"); + vcards:set(username, nil); + return; + end + vcard_temp = st.deserialize(vcard_temp); local ok, err = save_to_pep(pep_service, true, vcard_to_pep(vcard_temp)); if ok and vcards:set(username, nil) then session.log("info", "Migrated vCard-temp to PEP"); -- cgit v1.2.3 From 1fe3e2754ac0de82ea56cb911f74a52edc59ea29 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 25 Jan 2019 23:31:02 +0100 Subject: mod_vcard_legacy: Allow disabling vcard conversion Once everyone has been migrated it might be nice to skip these checks --- plugins/mod_vcard_legacy.lua | 2 ++ 1 file changed, 2 insertions(+) (limited to 'plugins') diff --git a/plugins/mod_vcard_legacy.lua b/plugins/mod_vcard_legacy.lua index 633b7729..7dff1d09 100644 --- a/plugins/mod_vcard_legacy.lua +++ b/plugins/mod_vcard_legacy.lua @@ -307,6 +307,7 @@ module:hook("pre-presence/full", inject_xep153, 1); module:hook("pre-presence/bare", inject_xep153, 1); module:hook("pre-presence/host", inject_xep153, 1); +if module:get_option_boolean("upgrade_legacy_vcards", true) then module:hook("resource-bind", function (event) local session = event.session; local username = session.username; @@ -331,3 +332,4 @@ module:hook("resource-bind", function (event) session.log("info", "Failed to migrate vCard-temp to PEP: %s", err or "problem emptying 'vcard' store"); end end); +end -- cgit v1.2.3 From d0d8bf923764d1d6482184d4bf0593488ffbb32a Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 26 Jan 2019 13:32:26 +0100 Subject: mod_vcard_legacy: Handle partial migration Eg in case the user already published an avatar, migrate only the vcard, and vice versa. --- plugins/mod_vcard_legacy.lua | 56 +++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 22 deletions(-) (limited to 'plugins') diff --git a/plugins/mod_vcard_legacy.lua b/plugins/mod_vcard_legacy.lua index 7dff1d09..ab2c4490 100644 --- a/plugins/mod_vcard_legacy.lua +++ b/plugins/mod_vcard_legacy.lua @@ -245,30 +245,36 @@ function vcard_to_pep(vcard_temp) end function save_to_pep(pep_service, actor, vcard4, avatars) + if avatars then - if pep_service:purge("urn:xmpp:avatar:metadata", actor) then - pep_service:purge("urn:xmpp:avatar:data", actor); - end - - local avatar_defaults = node_defaults; - if #avatars > 1 then - avatar_defaults = {}; - for k,v in pairs(node_defaults) do - avatar_defaults[k] = v; + if pep_service:purge("urn:xmpp:avatar:metadata", actor) then + pep_service:purge("urn:xmpp:avatar:data", actor); end - avatar_defaults.max_items = #avatars; - end - for _, avatar in ipairs(avatars) do - local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults); - if ok then - ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, avatar_defaults); + + local avatar_defaults = node_defaults; + if #avatars > 1 then + avatar_defaults = {}; + for k,v in pairs(node_defaults) do + avatar_defaults[k] = v; + end + avatar_defaults.max_items = #avatars; end - if not ok then - return ok, err; + for _, avatar in ipairs(avatars) do + local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults); + if ok then + ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, avatar_defaults); + end + if not ok then + return ok, err; + end end end - return pep_service:publish("urn:xmpp:vcard4", actor, "current", vcard4, node_defaults); + if vcard4 then + return pep_service:publish("urn:xmpp:vcard4", actor, "current", vcard4, node_defaults); + end + + return true; end module:hook("iq-set/self/vcard-temp:vCard", function (event) @@ -317,15 +323,21 @@ module:hook("resource-bind", function (event) return; end local pep_service = mod_pep.get_pep_service(username); - if pep_service:get_last_item("urn:xmpp:vcard4", true) - or pep_service:get_last_item("urn:xmpp:avatar:metadata", true) + vcard_temp = st.deserialize(vcard_temp); + local vcard4, avatars = vcard_to_pep(vcard_temp); + if pep_service:get_last_item("urn:xmpp:vcard4", true) then + vcard4 = nil; + end + if pep_service:get_last_item("urn:xmpp:avatar:metadata", true) or pep_service:get_last_item("urn:xmpp:avatar:data", true) then + avatars = nil; + end + if not (vcard4 or avatars) then session.log("debug", "Already PEP data, not overwriting with migrated data"); vcards:set(username, nil); return; end - vcard_temp = st.deserialize(vcard_temp); - local ok, err = save_to_pep(pep_service, true, vcard_to_pep(vcard_temp)); + local ok, err = save_to_pep(pep_service, true, vcard4, avatars); if ok and vcards:set(username, nil) then session.log("info", "Migrated vCard-temp to PEP"); else -- cgit v1.2.3