aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_vcard4.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mod_vcard4.lua')
-rw-r--r--plugins/mod_vcard4.lua45
1 files changed, 45 insertions, 0 deletions
diff --git a/plugins/mod_vcard4.lua b/plugins/mod_vcard4.lua
new file mode 100644
index 00000000..378c0602
--- /dev/null
+++ b/plugins/mod_vcard4.lua
@@ -0,0 +1,45 @@
+local st = require "util.stanza"
+local jid_split = require "util.jid".split;
+
+local mod_pep = module:depends("pep");
+
+module:hook("account-disco-info", function (event)
+ event.reply:tag("feature", { var = "urn:ietf:params:xml:ns:vcard-4.0" }):up();
+end);
+
+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);
+