Diff

plugins/mod_private.lua @ 3522:4646b5b039ca

mod_private: Updated to use the new events API. Smaller, more robust.
author Waqas Hussain <waqas20@gmail.com>
date Sat, 16 Oct 2010 04:11:48 +0500
parent 3114:75ea1aff69da
child 5371:706206e191e8
line wrap: on
line diff
--- a/plugins/mod_private.lua	Fri Oct 15 18:40:37 2010 +0100
+++ b/plugins/mod_private.lua	Sat Oct 16 04:11:48 2010 +0500
@@ -7,7 +7,6 @@
 --
 
 
-
 local st = require "util.stanza"
 
 local jid_split = require "util.jid".split;
@@ -15,47 +14,40 @@
 
 module:add_feature("jabber:iq:private");
 
-module: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, err = datamanager.load(node, host, "private");
-					if err then
-						session.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])));
-						else
-							session.send(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
-							session.send(st.reply(stanza));
-						else
-							session.send(st.error_reply(stanza, "wait", "internal-server-error"));
-						end
-					end
-				else
-					session.send(st.error_reply(stanza, "modify", "bad-format"));
-				end
+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 #query.tags == 1 then
+		local tag = query.tags[1];
+		local key = tag.name..":"..tag.attr.xmlns;
+		local data, err = datamanager.load(origin.username, origin.host, "private");
+		if err then
+			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
+				origin.send(st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"}):add_child(st.deserialize(data[key])));
 			else
-				session.send(st.error_reply(stanza, "cancel", "forbidden"));
+				origin.send(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(origin.username, origin.host, "private", data) then
+				origin.send(st.reply(stanza));
+			else
+				origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
 			end
 		end
-	end);
+	else
+		origin.send(st.error_reply(stanza, "modify", "bad-format"));
+	end
+	return true;
+end);