Annotate

mod_adhoc/adhoc/mod_adhoc.lua @ 246:5a389f9f2ec7

mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
author Florian Zeitz <florob@babelmonkeys.de>
date Sun, 22 Aug 2010 20:09:00 +0200
parent 245:84d03c44bdb9
child 254:9b4a114b2fe6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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;
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
20 if stanza.attr.type == "get" and node
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
21 and commands[node] then
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
22 -- Required for Prosody <= 0.7
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
23 local privileged = is_admin(stanza.attr.from)
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
24 or is_admin(stanza.attr.from, stanza.attr.to);
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
25 if (commands[node].permission == "admin" and privileged)
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
26 or (commands[node].permission == "user") then
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
27 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
28 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
29 node = node });
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
30 reply:tag("identity", { name = commands[node].name,
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
31 category = "automation", type = "command-node" }):up();
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
32 reply:tag("feature", { var = xmlns_cmd }):up();
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
33 reply:tag("feature", { var = "jabber:x:data" }):up();
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
34 else
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
35 reply = st.error_reply(stanza, "auth", "forbidden", "This item is not available to you");
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
36 end
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
37 origin.send(reply);
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
38 return true;
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
39 end
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
40 end);
5a389f9f2ec7 mod_adhoc: Answer disco#info (This is a MUST in XEP-0050)
Florian Zeitz <florob@babelmonkeys.de>
parents: 245
diff changeset
41
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
42 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
43 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
44 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
45 and stanza.tags[1].attr.node == xmlns_cmd then
244
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
46 -- Required for Prosody <= 0.7
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
47 local privileged = is_admin(stanza.attr.from)
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
48 or is_admin(stanza.attr.from, stanza.attr.to);
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
49 reply = st.reply(stanza);
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
50 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
51 node = xmlns_cmd });
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
52 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
53 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
54 or (command.permission == "user") then
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
55 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
56 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
57 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
58 end
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
59 end
125
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
60 origin.send(reply);
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
61 return true;
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
62 end
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
63 end, 500);
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
64
245
84d03c44bdb9 mod_adhoc: Fix typo introduced during refactoring
Florian Zeitz <florob@babelmonkeys.de>
parents: 244
diff changeset
65 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
66 local origin, stanza = event.origin, event.stanza;
244
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
67 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
68 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
69 if commands[node] then
244
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
70 -- Required for Prosody <= 0.7
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
71 local privileged = is_admin(event.stanza.attr.from)
e0802b2716c3 mod_adhoc: Code restructuring
Florian Zeitz <florob@babelmonkeys.de>
parents: 207
diff changeset
72 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
73 if commands[node].permission == "admin"
8111c8a9e1ad mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents: 121
diff changeset
74 and not privileged then
93
611d16867410 mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents: 49
diff changeset
75 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
76 :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
77 :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
78 return true
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
79 end
93
611d16867410 mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents: 49
diff changeset
80 -- 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
81 return adhoc_handle_cmd(commands[node], origin, stanza);
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
82 end
93
611d16867410 mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents: 49
diff changeset
83 end
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
84 end, 500);
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
85
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
86 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
87 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
88 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
89
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
90 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
91 return handle_item_added(event.item);
6
d497d5df360d adds mod_adhoc
Thilo Cestonaro <thilo@cestona.ro>
parents:
diff changeset
92 end, 500);
9
2be8bcce5b18 thx to Florob:
ephraim@errorm.fritz.box
parents: 6
diff changeset
93
2be8bcce5b18 thx to Florob:
ephraim@errorm.fritz.box
parents: 6
diff changeset
94 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
95 commands[event.item.node] = nil;
9
2be8bcce5b18 thx to Florob:
ephraim@errorm.fritz.box
parents: 6
diff changeset
96 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
97
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 -- 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
99 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
100 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
101 end