mod_vcard4: Allow access to the vcard4 PEP node via iq syntax
authorKim Alvefur <zash@zash.se>
Sat, 18 Aug 2018 13:48:38 +0200
changeset 9264 9db9e37610b7
parent 9263 0fc6ffc57dc0
child 9265 37b7cf3470f1
mod_vcard4: Allow access to the vcard4 PEP node via iq syntax
CHANGES
plugins/mod_vcard4.lua
--- 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
 ======
--- /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);
+