mod_adhoc/adhoc/mod_adhoc.lua
author Matthew Wild <mwild1@gmail.com>
Mon, 19 Mar 2012 17:06:02 +0000
changeset 625 2c07bcf56a36
parent 254 9b4a114b2fe6
permissions -rw-r--r--
mod_smacks: Don't hibernate session on graceful stream close
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
     1
-- Copyright (C) 2009 Thilo Cestonaro
169
b3a68e71b8a1 mod_adhoc, mod_adhoc_cmd_admin: Handle errors according to XEP
Florian Zeitz < florob@babelmonkeys.de>
parents: 125
diff changeset
     2
-- Copyright (C) 2009-2010 Florian Zeitz
b3a68e71b8a1 mod_adhoc, mod_adhoc_cmd_admin: Handle errors according to XEP
Florian Zeitz < florob@babelmonkeys.de>
parents: 125
diff changeset
     3
--
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
     4
-- This file is MIT/X11 licensed. Please see the
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
     5
-- COPYING file in the source package for more information.
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
     6
--
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
     7
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
     8
local st = require "util.stanza";
43
adc9eff8adb2 mod_adhoc, mod_adhoc_cmd_admin: Show only commands they may execute to the user
Florian Zeitz <florob@babelmonkeys.de>
parents: 36
diff changeset
     9
local is_admin = require "core.usermanager".is_admin;
121
a9898f13c89e mod_adhoc: Major refactoring. Actuall data exchange happens here now
Florian Zeitz <florob@babelmonkeys.de>
parents: 109
diff changeset
    10
local adhoc_handle_cmd = module:require "adhoc".handle_cmd;
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    11
local xmlns_cmd = "http://jabber.org/protocol/commands";
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    12
local xmlns_disco = "http://jabber.org/protocol/disco";
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    13
local commands = {};
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    14
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    15
module:add_feature(xmlns_cmd);
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    16
246
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    17
module:hook("iq/host/"..xmlns_disco.."#info:query", function (event)
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    18
	local origin, stanza = event.origin, event.stanza;
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    19
	local node = stanza.tags[1].attr.node;
254
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    20
	if stanza.attr.type == "get" and node then
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    21
		if commands[node] then
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    22
			-- Required for Prosody <= 0.7
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    23
			local privileged = is_admin(stanza.attr.from)
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    24
			    or is_admin(stanza.attr.from, stanza.attr.to);
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    25
			if (commands[node].permission == "admin" and privileged)
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    26
			    or (commands[node].permission == "user") then
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    27
				reply = st.reply(stanza);
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    28
				reply:tag("query", { xmlns = xmlns_disco.."#info",
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    29
				    node = node });
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    30
				reply:tag("identity", { name = commands[node].name,
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    31
				    category = "automation", type = "command-node" }):up();
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    32
				reply:tag("feature", { var = xmlns_cmd }):up();
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    33
				reply:tag("feature", { var = "jabber:x:data" }):up();
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    34
			else
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    35
				reply = st.error_reply(stanza, "auth", "forbidden", "This item is not available to you");
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    36
			end
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    37
			origin.send(reply);
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    38
			return true;
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    39
		elseif node == xmlns_cmd then
246
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    40
			reply = st.reply(stanza);
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    41
			reply:tag("query", { xmlns = xmlns_disco.."#info",
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    42
			    node = node });
254
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    43
			reply:tag("identity", { name = "Ad-Hoc Commands",
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    44
			    category = "automation", type = "command-list" }):up();
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    45
			origin.send(reply);
9b4a114b2fe6 mod_adhoc: Answer disco#info for node=xmlns_cmd
Florian Zeitz <florob@babelmonkeys.de>
parents: 246
diff changeset
    46
			return true;
246
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    47
		end
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    48
	end
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    49
end);
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
    50
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    51
module:hook("iq/host/"..xmlns_disco.."#items:query", function (event)
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    52
	local origin, stanza = event.origin, event.stanza;
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    53
	if stanza.attr.type == "get" and stanza.tags[1].attr.node
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    54
	    and stanza.tags[1].attr.node == xmlns_cmd then
244
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
    55
		-- Required for Prosody <= 0.7
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
    56
		local privileged = is_admin(stanza.attr.from)
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
    57
		    or is_admin(stanza.attr.from, stanza.attr.to);
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    58
		reply = st.reply(stanza);
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    59
		reply:tag("query", { xmlns = xmlns_disco.."#items",
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    60
		    node = xmlns_cmd });
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    61
		for node, command in pairs(commands) do
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    62
			if (command.permission == "admin" and privileged)
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    63
			    or (command.permission == "user") then
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    64
				reply:tag("item", { name = command.name,
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    65
				    node = node, jid = module:get_host() });
43
adc9eff8adb2 mod_adhoc, mod_adhoc_cmd_admin: Show only commands they may execute to the user
Florian Zeitz <florob@babelmonkeys.de>
parents: 36
diff changeset
    66
				reply:up();
adc9eff8adb2 mod_adhoc, mod_adhoc_cmd_admin: Show only commands they may execute to the user
Florian Zeitz <florob@babelmonkeys.de>
parents: 36
diff changeset
    67
			end
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    68
		end
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    69
		origin.send(reply);
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    70
		return true;
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    71
	end
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    72
end, 500);
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    73
245
84d03c44bdb9 mod_adhoc: Fix typo introduced during refactoring
Florian Zeitz <florob@babelmonkeys.de>
parents: 244
diff changeset
    74
module:hook("iq/host/"..xmlns_cmd..":command", function (event)
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    75
	local origin, stanza = event.origin, event.stanza;
244
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
    76
	if stanza.attr.type == "set" then
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    77
		local node = stanza.tags[1].attr.node
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    78
		if commands[node] then
244
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
    79
			-- Required for Prosody <= 0.7
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
    80
			local privileged = is_admin(event.stanza.attr.from)
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
    81
			    or is_admin(stanza.attr.from, stanza.attr.to);
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    82
			if commands[node].permission == "admin"
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    83
			    and not privileged then
93
611d16867410 mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents: 49
diff changeset
    84
				origin.send(st.error_reply(stanza, "auth", "forbidden", "You don't have permission to execute this command"):up()
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    85
				    :add_child(commands[node]:cmdtag("canceled")
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    86
					:tag("note", {type="error"}):text("You don't have permission to execute this command")));
93
611d16867410 mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents: 49
diff changeset
    87
				return true
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    88
			end
93
611d16867410 mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents: 49
diff changeset
    89
			-- User has permission now execute the command
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
    90
			return adhoc_handle_cmd(commands[node], origin, stanza);
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    91
		end
93
611d16867410 mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents: 49
diff changeset
    92
	end
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    93
end, 500);
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    94
170
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
    95
local function handle_item_added(item)
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
    96
	commands[item.node] = item;
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
    97
end
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
    98
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
    99
module:hook("item-added/adhoc", function (event)
170
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
   100
	return handle_item_added(event.item);
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
   101
end, 500);
9
2be8bcce5b18 thx to Florob:
ephraim@errorm.fritz.box
parents: 6
diff changeset
   102
2be8bcce5b18 thx to Florob:
ephraim@errorm.fritz.box
parents: 6
diff changeset
   103
module:hook("item-removed/adhoc", function (event)
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
   104
	commands[event.item.node] = nil;
9
2be8bcce5b18 thx to Florob:
ephraim@errorm.fritz.box
parents: 6
diff changeset
   105
end, 500);
170
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
   106
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
   107
-- Pick up any items that are already added
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
   108
for _, item in ipairs(module:get_host_items("adhoc")) do
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
   109
	handle_item_added(item);
0d438a7ac4fc mod_adhoc: Scan through list of items on load, in case items have been added before we were loaded
Matthew Wild <mwild1@gmail.com>
parents: 169
diff changeset
   110
end