Diff

plugins/adhoc/mod_adhoc.lua @ 3220:b3772f9bc359

mod_adhoc: Imported from prosody-modules, thanks Florob!
author Matthew Wild <mwild1@gmail.com>
date Wed, 09 Jun 2010 21:27:43 +0100
child 3231:ad3fbed1dda5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/adhoc/mod_adhoc.lua	Wed Jun 09 21:27:43 2010 +0100
@@ -0,0 +1,67 @@
+-- Copyright (C) 2009 Thilo Cestonaro
+-- 
+-- This file is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
+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(xmlns_cmd);
+
+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 = 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
+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
+		-- 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[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[node], origin, stanza);
+		end
+	end
+end, 500);
+
+module:hook("item-added/adhoc", function (event)
+	commands[event.item.node] = event.item;
+end, 500);
+
+module:hook("item-removed/adhoc", function (event)
+	commands[event.item.node] = nil;
+end, 500);