mod_private: Updated to use the new events API. Smaller, more robust.

This commit is contained in:
Waqas Hussain 2010-10-16 04:11:48 +05:00
parent 3b90625e4c
commit a8c2092b65

View file

@ -7,7 +7,6 @@
--
local st = require "util.stanza"
local jid_split = require "util.jid".split;
@ -15,27 +14,23 @@ local datamanager = require "util.datamanager"
module:add_feature("jabber:iq:private");
module:add_iq_handler("c2s", "jabber:iq:private",
function (session, stanza)
module:hook("iq/self/jabber:iq:private:query", function(event)
local origin, stanza = event.origin, event.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, err = datamanager.load(node, host, "private");
local data, err = datamanager.load(origin.username, origin.host, "private");
if err then
session.send(st.error_reply(stanza, "wait", "internal-server-error"));
origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
return true;
end
if stanza.attr.type == "get" then
if data and data[key] then
session.send(st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"}):add_child(st.deserialize(data[key])));
origin.send(st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"}):add_child(st.deserialize(data[key])));
else
session.send(st.reply(stanza):add_child(stanza.tags[1]));
origin.send(st.reply(stanza):add_child(stanza.tags[1]));
end
else -- set
if not data then data = {}; end;
@ -45,17 +40,14 @@ module:add_iq_handler("c2s", "jabber:iq:private",
data[key] = st.preserialize(tag);
end
-- TODO delete datastore if empty
if datamanager.store(node, host, "private", data) then
session.send(st.reply(stanza));
if datamanager.store(origin.username, origin.host, "private", data) then
origin.send(st.reply(stanza));
else
session.send(st.error_reply(stanza, "wait", "internal-server-error"));
origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
end
end
else
session.send(st.error_reply(stanza, "modify", "bad-format"));
end
else
session.send(st.error_reply(stanza, "cancel", "forbidden"));
end
origin.send(st.error_reply(stanza, "modify", "bad-format"));
end
return true;
end);