File

plugins/adhoc/mod_adhoc.lua @ 5915:e6fed1d80116

Back out 1b0ac7950129, as SSLv3 appears to still be in moderate use on the network. Also, although obsolete, SSLv3 isn't documented to have any weaknesses that TLS 1.0 (the most common version used today) doesn't also have. Get your act together clients!
author Matthew Wild <mwild1@gmail.com>
date Tue, 12 Nov 2013 02:13:01 +0000
parent 4926:58714123f600
child 5760:e599d9a367cf
line wrap: on
line source

-- Copyright (C) 2009 Thilo Cestonaro
-- Copyright (C) 2009-2011 Florian Zeitz
--
-- 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.."#info:query", function (event)
	local origin, stanza = event.origin, event.stanza;
	local node = stanza.tags[1].attr.node;
	if stanza.attr.type == "get" and node then
		if commands[node] then
			local privileged = is_admin(stanza.attr.from, stanza.attr.to);
			if (commands[node].permission == "admin" and privileged)
			    or (commands[node].permission == "user") then
				reply = st.reply(stanza);
				reply:tag("query", { xmlns = xmlns_disco.."#info",
				    node = node });
				reply:tag("identity", { name = commands[node].name,
				    category = "automation", type = "command-node" }):up();
				reply:tag("feature", { var = xmlns_cmd }):up();
				reply:tag("feature", { var = "jabber:x:data" }):up();
			else
				reply = st.error_reply(stanza, "auth", "forbidden", "This item is not available to you");
			end
			origin.send(reply);
			return true;
		elseif node == xmlns_cmd then
			reply = st.reply(stanza);
			reply:tag("query", { xmlns = xmlns_disco.."#info",
			    node = node });
			reply:tag("identity", { name = "Ad-Hoc Commands",
			    category = "automation", type = "command-list" }):up();
			origin.send(reply);
			return true;

		end
	end
end);

module:hook("iq/host/"..xmlns_disco.."#items:query", function (event)
	local origin, stanza = event.origin, event.stanza;
	if stanza.attr.type == "get" and stanza.tags[1].attr.node
	    and stanza.tags[1].attr.node == xmlns_cmd then
		local admin = is_admin(stanza.attr.from, stanza.attr.to);
		local global_admin = is_admin(stanza.attr.from);
		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 admin)
			    or (command.permission == "global_admin" and global_admin)
			    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/"..xmlns_cmd..":command", function (event)
	local origin, stanza = event.origin, event.stanza;
	if stanza.attr.type == "set" then
		local node = stanza.tags[1].attr.node
		if commands[node] then
			local admin = is_admin(stanza.attr.from, stanza.attr.to);
			local global_admin = is_admin(stanza.attr.from);
			if (commands[node].permission == "admin" and not admin)
			    or (commands[node].permission == "global_admin" and not global_admin) 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);

local function adhoc_added(event)
	local item = event.item;
	commands[item.node] = item;
end

local function adhoc_removed(event)
	commands[event.item.node] = nil;
end

module:handle_items("adhoc", adhoc_added, adhoc_removed);
module:handle_items("adhoc-provider", adhoc_added, adhoc_removed);