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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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?");