Software /
code /
prosody
Annotate
plugins/mod_announce.lua @ 8791:8da11142fabf
muc: Allow clients to change multiple affiliations or roles at once (#345)
According to XEP-0045 sections 9.2, 9.5 and 9.8 affiliation lists and role
lists should allow mass-modification. Prosody however would just use the
first entry of the list and ignore the rest. This is fixed by introducing
a `for` loop to `set` stanzas of the respective `muc#admin` namespace.
In order for this loop to work, the error handling was changed a little.
Prosody no longer returns after the first error. Instead, an error reply
is sent for each malformed or otherwise wrong entry, but the loop keeps
going over the other entries. This may lead to multiple error messages
being sent for one client request. A notable exception from this is when
the XML Schema for `muc#admin` requests is violated. In that case the loop
is aborted with an error message to the client.
The change is a bit bigger than that in order to have the loop only for
`set` stanzas without changing the behaviour of the `get` stanzas. This is
now more in line with trunk, where there are separate methods for each
stanza type.
References: #345
author | Lennart Sauerbeck <devel@lennart.sauerbeck.org> |
---|---|
date | Sat, 18 Mar 2017 18:47:28 +0100 |
parent | 5776:bd0ff8ae98a8 |
child | 8680:1cc9a293e958 |
rev | line source |
---|---|
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1397
diff
changeset
|
1 -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5370
diff
changeset
|
4 -- |
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1397
diff
changeset
|
5 -- This project is MIT/X11 licensed. Please see the |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1397
diff
changeset
|
6 -- COPYING file in the source package for more information. |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1397
diff
changeset
|
7 -- |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1397
diff
changeset
|
8 |
3276
4e44469b0583
mod_announce: Removed unused variables.
Waqas Hussain <waqas20@gmail.com>
parents:
3275
diff
changeset
|
9 local st, jid = require "util.stanza", require "util.jid"; |
1385
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
5370
7838acadb0fa
mod_announce, mod_auth_anonymous, mod_c2s, mod_c2s, mod_component, mod_iq, mod_message, mod_presence, mod_tls: Access prosody.{hosts,bare_sessions,full_sessions} instead of the old globals
Kim Alvefur <zash@zash.se>
parents:
5076
diff
changeset
|
11 local hosts = prosody.hosts; |
1396
ce3eb5f71899
mod_announce: Use usermanager.is_admin to verify admin status
Waqas Hussain <waqas20@gmail.com>
parents:
1385
diff
changeset
|
12 local is_admin = require "core.usermanager".is_admin; |
1385
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
3278
5ca2ed58788f
mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents:
3276
diff
changeset
|
14 function send_to_online(message, host) |
3275
05c1d8269043
mod_announce: Changed a global variable to local.
Waqas Hussain <waqas20@gmail.com>
parents:
3228
diff
changeset
|
15 local sessions; |
3278
5ca2ed58788f
mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents:
3276
diff
changeset
|
16 if host then |
5ca2ed58788f
mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents:
3276
diff
changeset
|
17 sessions = { [host] = hosts[host] }; |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
18 else |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
19 sessions = hosts; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
20 end |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
21 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
22 local c = 0; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
23 for hostname, host_session in pairs(sessions) do |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
24 if host_session.sessions then |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
25 message.attr.from = hostname; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
26 for username in pairs(host_session.sessions) do |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
27 c = c + 1; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
28 message.attr.to = username.."@"..hostname; |
5014
b2006c1cfa85
mod_announce, mod_motd, mod_pubsub, mod_register, mod_watchregistrations, mod_welcome: Use module:send() instead of core_*_stanza()
Kim Alvefur <zash@zash.se>
parents:
4926
diff
changeset
|
29 module:send(message); |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
30 end |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
31 end |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
32 end |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
33 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
34 return c; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
35 end |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
36 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
37 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
38 -- Old <message>-based jabberd-style announcement sending |
3278
5ca2ed58788f
mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents:
3276
diff
changeset
|
39 function handle_announcement(event) |
5ca2ed58788f
mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents:
3276
diff
changeset
|
40 local origin, stanza = event.origin, event.stanza; |
5ca2ed58788f
mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents:
3276
diff
changeset
|
41 local node, host, resource = jid.split(stanza.attr.to); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5370
diff
changeset
|
42 |
1385
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 if resource ~= "announce/online" then |
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 return; -- Not an announcement |
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5370
diff
changeset
|
46 |
1397
4c7b8b8ab569
mod_announce: Work with non-local admins
Waqas Hussain <waqas20@gmail.com>
parents:
1396
diff
changeset
|
47 if not is_admin(stanza.attr.from) then |
1385
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 -- Not an admin? Not allowed! |
3278
5ca2ed58788f
mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents:
3276
diff
changeset
|
49 module:log("warn", "Non-admin '%s' tried to send server announcement", stanza.attr.from); |
1385
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 return; |
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5370
diff
changeset
|
52 |
1385
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 module:log("info", "Sending server announcement to all online users"); |
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 local message = st.clone(stanza); |
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 message.attr.type = "headline"; |
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 message.attr.from = host; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5370
diff
changeset
|
57 |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
58 local c = send_to_online(message, host); |
1385
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 module:log("info", "Announcement sent to %d online users", c); |
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 return true; |
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 end |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
62 module:hook("message/host", handle_announcement); |
1385
8999dd4253f9
mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
64 -- Ad-hoc command (XEP-0133) |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
65 local dataforms_new = require "util.dataforms".new; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
66 local announce_layout = dataforms_new{ |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
67 title = "Making an Announcement"; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
68 instructions = "Fill out this form to make an announcement to all\nactive users of this service."; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
69 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
70 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
71 { name = "subject", type = "text-single", label = "Subject" }; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
72 { name = "announcement", type = "text-multi", required = true, label = "Announcement" }; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
73 }; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
74 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
75 function announce_handler(self, data, state) |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
76 if state then |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
77 if data.action == "cancel" then |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
78 return { status = "canceled" }; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
79 end |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
80 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
81 local fields = announce_layout:data(data.form); |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
82 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
83 module:log("info", "Sending server announcement to all online users"); |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
84 local message = st.message({type = "headline"}, fields.announcement):up() |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
85 :tag("subject"):text(fields.subject or "Announcement"); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5370
diff
changeset
|
86 |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
87 local count = send_to_online(message, data.to); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5370
diff
changeset
|
88 |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
89 module:log("info", "Announcement sent to %d online users", count); |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
90 return { status = "completed", info = ("Announcement sent to %d online users"):format(count) }; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
91 else |
5076
88fb94df9b18
mod_admin_adhoc, mod_announce: Explicitly specify possible actions for ad-hoc commands
Florian Zeitz <florob@babelmonkeys.de>
parents:
5014
diff
changeset
|
92 return { status = "executing", actions = {"next", "complete", default = "complete"}, form = announce_layout }, "executing"; |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
93 end |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
94 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
95 return true; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
96 end |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
97 |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
98 local adhoc_new = module:require "adhoc".new; |
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
99 local announce_desc = adhoc_new("Send Announcement to Online Users", "http://jabber.org/protocol/admin#announce", announce_handler, "admin"); |
4926
58714123f600
mod_adhoc, mod_admin_adhoc, mod_announce: Use module:provides() to manage Ad-Hoc commands
Florian Zeitz <florob@babelmonkeys.de>
parents:
3278
diff
changeset
|
100 module:provides("adhoc", announce_desc); |
3228
65e5dfcf5a9f
mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents:
3199
diff
changeset
|
101 |