Changeset

125:8111c8a9e1ad

mod_adhoc: Use hashtable instead of array, coding style
author Florian Zeitz <florob@babelmonkeys.de>
date Mon, 25 Jan 2010 01:42:21 +0100
parents 124:843cadf36306
children 126:e190c1643a8f
files mod_adhoc/adhoc/mod_adhoc.lua
diffstat 1 files changed, 35 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/mod_adhoc/adhoc/mod_adhoc.lua	Sat Jan 23 04:43:28 2010 +0100
+++ b/mod_adhoc/adhoc/mod_adhoc.lua	Mon Jan 25 01:42:21 2010 +0100
@@ -7,60 +7,61 @@
 local st = require "util.stanza";
 local is_admin = require "core.usermanager".is_admin;
 local adhoc_handle_cmd = module:require "adhoc".handle_cmd;
+local xmlns_cmd = "http://jabber.org/protocol/commands";
+local xmlns_disco = "http://jabber.org/protocol/disco";
 local commands = {};
 
-module:add_feature("http://jabber.org/protocol/commands");
+module:add_feature(xmlns_cmd);
 
-module:hook("iq/host/http://jabber.org/protocol/disco#items:query", function (event)
-    local origin, stanza = event.origin, event.stanza;
-    local privileged = is_admin(event.stanza.attr.from) or is_admin(stanza.attr.from, stanza.attr.to); -- TODO: Is this correct, or should is_admin be changed?
-    if stanza.attr.type == "get" and stanza.tags[1].attr.node and stanza.tags[1].attr.node == "http://jabber.org/protocol/commands" then
+module:hook("iq/host/"..xmlns_disco.."#items:query", function (event)
+	local origin, stanza = event.origin, event.stanza;
+	-- TODO: Is this correct, or should is_admin be changed?
+	local privileged = is_admin(stanza.attr.from)
+	    or is_admin(stanza.attr.from, stanza.attr.to); 
+	if stanza.attr.type == "get" and stanza.tags[1].attr.node
+	    and stanza.tags[1].attr.node == xmlns_cmd then
 		reply = st.reply(stanza);
-		reply:tag("query", {xmlns="http://jabber.org/protocol/disco#items", node="http://jabber.org/protocol/commands"});
-		for i = 1, #commands do
-			-- module:log("info", "adding command %s", commands[i].name);
-			if (commands[i].permission == "admin" and privileged) or (commands[i].permission == "user") then
-				reply:tag("item", {name=commands[i].name, node=commands[i].node, jid=module:get_host()});
+		reply:tag("query", { xmlns = xmlns_disco.."#items",
+		    node = xmlns_cmd });
+		for node, command in pairs(commands) do
+			if (command.permission == "admin" and privileged)
+			    or (command.permission == "user") then
+				reply:tag("item", { name = command.name,
+				    node = node, jid = module:get_host() });
 				reply:up();
 			end
 		end
-        origin.send(reply);
-        return true;
-    end 
+		origin.send(reply);
+		return true;
+	end
 end, 500);
 
 module:hook("iq/host", function (event)
-    local origin, stanza = event.origin, event.stanza;
-    if stanza.attr.type == "set" and stanza.tags[1] and stanza.tags[1].name == "command" then 
-        local node = stanza.tags[1].attr.node
-	local privileged = is_admin(event.stanza.attr.from) or is_admin(stanza.attr.from, stanza.attr.to); -- TODO: Is this correct, or should is_admin be changed?
-	for i = 1, #commands do
-		if commands[i].node == node then
-			-- check whether user has permission to execute this command first
-			if commands[i].permission == "admin" and not privileged then
+	local origin, stanza = event.origin, event.stanza;
+	if stanza.attr.type == "set" and stanza.tags[1]
+	    and stanza.tags[1].name == "command" then 
+		local node = stanza.tags[1].attr.node
+		-- TODO: Is this correct, or should is_admin be changed?
+		local privileged = is_admin(event.stanza.attr.from)
+		    or is_admin(stanza.attr.from, stanza.attr.to);
+		if commands[node] then
+			if commands[node].permission == "admin"
+			    and not privileged then
 				origin.send(st.error_reply(stanza, "auth", "forbidden", "You don't have permission to execute this command"):up()
-					:add_child(commands[i]:cmdtag("canceled")
-						:tag("note", {type="error"}):text("You don't have permission to execute this command")));
+				    :add_child(commands[node]:cmdtag("canceled")
+					:tag("note", {type="error"}):text("You don't have permission to execute this command")));
 				return true
 			end
 			-- User has permission now execute the command
-			return adhoc_handle_cmd(commands[i], origin, stanza);
+			return adhoc_handle_cmd(commands[node], origin, stanza);
 		end
 	end
-    end 
 end, 500);
 
 module:hook("item-added/adhoc", function (event)
-	commands[ #commands + 1] = event.item;
+	commands[event.item.node] = event.item;
 end, 500);
 
-local _G = _G;
-local t_remove = _G.table.remove;
 module:hook("item-removed/adhoc", function (event)
-	for i = 1, #commands do
-		if commands[i].node == event.item.node then
-			t_remove(commands, i);
-			break;
-		end
-	end
+	commands[event.item.node] = nil;
 end, 500);