Mercurial > prosody-modules
annotate mod_muc_bot/mod_muc_bot.lua @ 4651:8231774f5bfd
mod_cloud_notify_encrypted: Ensure body substring remains valid UTF-8
The `body:sub()` call risks splitting the string in the middle of a
multi-byte UTF-8 sequence. This should have been caught by util.stanza
validation, but that would have caused some havoc, at the very least causing
the notification to not be sent.
There have been no reports of this happening. Likely because this module
isn't widely deployed among users with languages that use many longer UTF-8
sequences.
The util.encodings.utf8.valid() function is O(n) where only the last
sequence really needs to be checked, but it's in C and expected to be fast.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 22 Aug 2021 13:22:59 +0200 |
parents | bcf4518d18d4 |
children | 205b9d06fe6b |
rev | line source |
---|---|
4563
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 local st = require "util.stanza"; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 local jid = require "util.jid"; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 local bots = module:get_option_set("known_bots", {}); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 module:hook("muc-occupant-groupchat", function(event) |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 if event.occupant then return end -- skip messages from actual occupants |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 local room = event.room; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 if bots:contains(jid.bare(event.from)) or bots:contains(jid.host(event.from)) then |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 local nick = room:get_registered_nick(jid); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 if not nick then |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 -- Allow bot to specify its own nick, but we're appending '[bot]' to it. |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 -- FIXME HATS!!! |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 nick = event.stanza:get_child_text("nick", "http://jabber.org/protocol/nick"); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 nick = (nick or jid.bare(event.from)) .. "[bot]"; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 end |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 local virtual_occupant_jid = jid.prep(room.jid .. "/" .. nick, true); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 if not virtual_occupant_jid then |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 module:send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid)); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 return true; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 end |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 |
4564
d25f0fea270f
mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents:
4563
diff
changeset
|
27 local occupant = room:new_occupant(module.host, virtual_occupant_jid); |
d25f0fea270f
mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents:
4563
diff
changeset
|
28 local join = st.presence({from = event.from; to = virtual_occupant_jid}); |
d25f0fea270f
mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents:
4563
diff
changeset
|
29 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}); |
d25f0fea270f
mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents:
4563
diff
changeset
|
30 occupant:set_session(event.from, join, true); |
4565
3b2ae854842c
mod_muc_bot: Save occupant to room
Kim Alvefur <zash@zash.se>
parents:
4564
diff
changeset
|
31 room:save_occupant(occupant); |
3b2ae854842c
mod_muc_bot: Save occupant to room
Kim Alvefur <zash@zash.se>
parents:
4564
diff
changeset
|
32 room:publicise_occupant_status(occupant, dest_x); |
4563
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 -- Inject virtual occupant to trick all the other hooks on this event that |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 -- this is an actual legitimate participant. |
4564
d25f0fea270f
mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents:
4563
diff
changeset
|
35 event.occupant = occupant; |
4563
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 end |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 end, 66); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 module:hook("muc-occupant-pre-join", function(event) |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 local room = event.room; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 local nick = jid.resource(event.occupant.nick); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 if nick:sub(-5, -1) == "[bot]" then |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 event.origin.send(st.error_reply(event.stanza, "modify", "policy-violation", "Only known bots may use the [bot] suffix", room.jid)); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 return true; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 end |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 end, 3); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 module:hook("muc-occupant-pre-change", function(event) |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 local room = event.room; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 local nick = jid.resource(event.dest_occupant.nick); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 if nick:sub(-5, -1) == "[bot]" then |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 event.origin.send(st.error_reply(event.stanza, "modify", "policy-violation", "Only known bots may use the [bot] suffix", room.jid)); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 return true; |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 end |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 end, 3); |
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 |
4566
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
58 if not module:get_option_boolean("bots_get_messages", true) then |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
59 module:hook("muc-broadcast-message", function (event) |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
60 event.room:broadcast(event.stanza, function (nick, occupant) |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
61 if nick:sub(-5, -1) == "[bot]" or bots:contains(occupant.bare_jid) or bots:contains(jid.host(occupant.bare_jid)) then |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
62 return false; |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
63 else |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
64 return true; |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
65 end |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
66 end); |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
67 return true; |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
68 end, -100); |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
69 end |
174c7a3c819b
mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents:
4565
diff
changeset
|
70 |
4567
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
71 if module:get_option_boolean("ignore_bot_errors", true) then |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
72 module:hook("message/full", function (event) |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
73 local stanza = event.stanza; |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
74 if stanza.attr.type == "error" then |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
75 if bots:contains(jid.bare(stanza.attr.from)) or bots:contains(jid.host(stanza.attr.from)) then |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
76 module:log("debug", "Ignoring error from known bot"); |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
77 return true; |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
78 end |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
79 end |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
80 end, 1); |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
81 end |
bcf4518d18d4
mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents:
4566
diff
changeset
|
82 |
4563
30f2d7c3f946
mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 assert(string.sub("foo[bot]", -5, -1) == "[bot]", "substring indicies, how do they work?"); |