# HG changeset patch # User Kim Alvefur # Date 1534592918 -7200 # Node ID 9db9e37610b722ab67e44f6113289e7badfaac77 # Parent 0fc6ffc57dc04a04aef363692387dae1bf15ecd3 mod_vcard4: Allow access to the vcard4 PEP node via iq syntax diff -r 0fc6ffc57dc0 -r 9db9e37610b7 CHANGES --- a/CHANGES Sat Sep 01 22:06:25 2018 +0200 +++ b/CHANGES Sat Aug 18 13:48:38 2018 +0200 @@ -21,6 +21,7 @@ - Busted for tests - mod\_muc\_mam (XEP-0313 in groupchats) - mod\_vcard\_legacy (XEP-0398) +- mod\_vcard4 (XEP-0292) 0.10.0 ====== diff -r 0fc6ffc57dc0 -r 9db9e37610b7 plugins/mod_vcard4.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/mod_vcard4.lua Sat Aug 18 13:48:38 2018 +0200 @@ -0,0 +1,43 @@ +local st = require "util.stanza" +local jid_split = require "util.jid".split; + +local mod_pep = module:depends("pep"); + +module:add_feature("urn:ietf:params:xml:ns:vcard-4.0"); + +module:hook("iq-get/bare/urn:ietf:params:xml:ns:vcard-4.0:vcard", function (event) + local origin, stanza = event.origin, event.stanza; + + local pep_service = mod_pep.get_pep_service(jid_split(stanza.attr.to) or origin.username); + local ok, id, item = pep_service:get_last_item("urn:xmpp:vcard4", stanza.attr.from); + if ok and item then + origin.send(st.reply(stanza):add_child(item.tags[1])); + elseif item == "item-not-found" or not id then + origin.send(st.error_reply(stanza, "cancel", "item-not-found")); + elseif item == "forbidden" then + origin.send(st.error_reply(stanza, "auth", "forbidden")); + else + origin.send(st.error_reply(stanza, "modify", "undefined-condition")); + end + return true; +end); + +module:hook("iq-set/self/urn:ietf:params:xml:ns:vcard-4.0:vcard", function (event) + local origin, stanza = event.origin, event.stanza; + + local vcard4 = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = "current" }) + :add_child(stanza.tags[1]); + + local pep_service = mod_pep.get_pep_service(origin.username); + + local ok, err = pep_service:publish("urn:xmpp:vcard4", origin.full_jid, "current", vcard4); + if ok then + origin.send(st.reply(stanza)); + elseif err == "forbidden" then + origin.send(st.error_reply(stanza, "auth", "forbidden")); + else + origin.send(st.error_reply(stanza, "modify", "undefined-condition", err)); + end + return true; +end); +