aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_private.lua
diff options
context:
space:
mode:
authorWaqas Hussain <waqas20@gmail.com>2008-10-26 21:22:59 +0500
committerWaqas Hussain <waqas20@gmail.com>2008-10-26 21:22:59 +0500
commit7117792df505affed478f1d6d80fa1f9fdae83e0 (patch)
treee3e28f18f79d9fd7a1cef02195d3133918d6fdd8 /plugins/mod_private.lua
parent0e5389054a902fdd3726d1dc838c2f31a15d4eba (diff)
downloadprosody-7117792df505affed478f1d6d80fa1f9fdae83e0.tar.gz
prosody-7117792df505affed478f1d6d80fa1f9fdae83e0.zip
Added support for XEP-0049: Private XML Storage (mod_private)
Diffstat (limited to 'plugins/mod_private.lua')
-rw-r--r--plugins/mod_private.lua47
1 files changed, 47 insertions, 0 deletions
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