From 7117792df505affed478f1d6d80fa1f9fdae83e0 Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Sun, 26 Oct 2008 21:22:59 +0500 Subject: Added support for XEP-0049: Private XML Storage (mod_private) --- plugins/mod_private.lua | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 plugins/mod_private.lua (limited to 'plugins/mod_private.lua') diff --git a/plugins/mod_private.lua b/plugins/mod_private.lua new file mode 100644 index 00000000..91ea83e1 --- /dev/null +++ b/plugins/mod_private.lua @@ -0,0 +1,47 @@ + +local st = require "util.stanza" +local send = require "core.sessionmanager".send_to_session + +local jid_split = require "util.jid".split; +local datamanager = require "util.datamanager" + +add_iq_handler("c2s", "jabber:iq:private", + function (session, stanza) + local type = stanza.attr.type; + local query = stanza.tags[1]; + if (type == "get" or type == "set") and query.name == "query" then + local node, host = jid_split(stanza.attr.to); + if not(node or host) or (node == session.username and host == session.host) then + node, host = session.username, session.host; + if #query.tags == 1 then + local tag = query.tags[1]; + local key = tag.name..":"..tag.attr.xmlns; + local data = datamanager.load(node, host, "private"); + if stanza.attr.type == "get" then + if data and data[key] then + send(session, st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"}):add_child(st.deserialize(data[key]))); + else + send(session, st.reply(stanza):add_child(stanza.tags[1])); + end + else -- set + if not data then data = {}; end; + if #tag == 0 then + data[key] = nil; + else + data[key] = st.preserialize(tag); + end + -- TODO delete datastore if empty + if datamanager.store(node, host, "private", data) then + send(session, st.reply(stanza)); + else + send(session, st.error_reply(stanza, "wait", "internal-server-error")); + end + end + else + send(session, st.error_reply(stanza, "modify", "bad-format")); + end + else + send(session, st.error_reply(stanza, "cancel", "forbidden")); + end + end + end); \ No newline at end of file -- cgit v1.2.3