Mercurial > prosody-modules
annotate mod_adhoc/adhoc/mod_adhoc.lua @ 234:abcb59ab355c
Add new motd_sequential module. This module lets you define numbered messages shown to each user in order, but only once per user, and persistent across server restarts. Useful for notifying users of added features and changes in an
incremental fashion.
author | Jeff Mitchell <jeffrey.mitchell@gmail.com> |
---|---|
date | Wed, 04 Aug 2010 22:29:51 +0000 |
parents | 1ae653712e37 |
children | e0802b2716c3 |
rev | line source |
---|---|
6 | 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 | 4 -- This file is MIT/X11 licensed. Please see the |
5 -- COPYING file in the source package for more information. | |
6 -- | |
7 | |
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 | 13 local commands = {}; |
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 | 16 |
125
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
17 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
|
18 local origin, stanza = event.origin, event.stanza; |
207
1ae653712e37
mod_adhoc: Add capability to pass data to forms
Florian Zeitz <florob@babelmonkeys.de>
parents:
170
diff
changeset
|
19 -- Required for Prosody <= 0.7 |
125
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
20 local privileged = is_admin(stanza.attr.from) |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
21 or is_admin(stanza.attr.from, stanza.attr.to); |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
22 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
|
23 and stanza.tags[1].attr.node == xmlns_cmd then |
6 | 24 reply = st.reply(stanza); |
125
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
25 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
|
26 node = xmlns_cmd }); |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
27 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
|
28 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
|
29 or (command.permission == "user") then |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
30 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
|
31 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
|
32 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
|
33 end |
6 | 34 end |
125
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
35 origin.send(reply); |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
36 return true; |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
37 end |
6 | 38 end, 500); |
39 | |
40 module:hook("iq/host", function (event) | |
125
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
41 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
|
42 if stanza.attr.type == "set" and stanza.tags[1] |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
43 and stanza.tags[1].name == "command" then |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
44 local node = stanza.tags[1].attr.node |
207
1ae653712e37
mod_adhoc: Add capability to pass data to forms
Florian Zeitz <florob@babelmonkeys.de>
parents:
170
diff
changeset
|
45 -- Required for Prosody <= 0.7 |
125
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
46 local privileged = is_admin(event.stanza.attr.from) |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
47 or is_admin(stanza.attr.from, stanza.attr.to); |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
48 if commands[node] then |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
49 if commands[node].permission == "admin" |
8111c8a9e1ad
mod_adhoc: Use hashtable instead of array, coding style
Florian Zeitz <florob@babelmonkeys.de>
parents:
121
diff
changeset
|
50 and not privileged then |
93
611d16867410
mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents:
49
diff
changeset
|
51 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
|
52 :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
|
53 :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
|
54 return true |
6 | 55 end |
93
611d16867410
mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents:
49
diff
changeset
|
56 -- 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
|
57 return adhoc_handle_cmd(commands[node], origin, stanza); |
6 | 58 end |
93
611d16867410
mod_adhoc: Check for global and host admins
Florian Zeitz <florob@babelmonkeys.de>
parents:
49
diff
changeset
|
59 end |
6 | 60 end, 500); |
61 | |
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
|
62 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
|
63 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
|
64 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
|
65 |
6 | 66 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
|
67 return handle_item_added(event.item); |
6 | 68 end, 500); |
9 | 69 |
70 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
|
71 commands[event.item.node] = nil; |
9 | 72 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
|
73 |
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
|
74 -- 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
|
75 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
|
76 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
|
77 end |