annotate mod_muc_notifications/mod_muc_notifications.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 ef752c5115f7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3498
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
1 -- mod_muc_notifications
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
2 --
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
3 -- Copyright (C) 2019 Marcos de Vera Piquero <marcos.devera@quobis.com>
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
4 --
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
5 -- This file is MIT/X11 licensed.
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
6 --
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
7 -- A module to notify non-present members of messages in a group chat
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
8 --
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
9
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
10 local id = require"util.id"
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
11 local st = require"util.stanza"
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
12
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
13 local use_invite = module:get_option_boolean("muc_notification_invite", false)
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
14
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
15 -- Given a stanza, compute if it qualifies as important (notifiable)
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
16 -- return true for message stanzas with non-empty body
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
17 -- Should probably use something similar to muc-message-is-historic event
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
18 local function is_important(stanza)
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
19 local body = stanza:find("body#")
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
20 return body and #body
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
21 end
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
22
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
23 local function handle_muc_message(event)
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
24 -- event.room and event.stanza are available
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
25 local room = event.room
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
26 local stanza = event.stanza
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
27 for jid, aff in pairs(room._affiliations) do
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
28 if aff ~= "outcast" then
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
29 local is_occupant = false
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
30 for _, occupant in pairs(room._occupants) do
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
31 if occupant.bare_jid == jid then
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
32 is_occupant = true
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
33 break
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
34 end
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
35 end
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
36 if not is_occupant and is_important(stanza) then
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
37 -- send notification to jid
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
38 local attrs = {
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
39 to = jid,
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
40 id = id.short(),
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
41 from = room.jid,
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
42 }
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
43 local not_attrs = {
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
44 xmlns = "http://quobis.com/xmpp/muc#push",
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
45 jid = room.jid,
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
46 }
4089
ef752c5115f7 mod_muc_notifications: adapt to MUC get_name() API changes
marc0s <marcos@tenak.net>
parents: 3498
diff changeset
47 local reason = "You have messages in group chat "..(room:get_name() or room.jid)
3498
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
48 local notification = st.message(attrs)
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
49 :body(reason):up()
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
50 :tag("notification", not_attrs):up()
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
51 :tag("no-store", {xmlns = "urn:xmpp:hints"})
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
52 local invite = st.message(attrs):tag("x", {xmlns = "http://jabber.org/protocol/muc#user"})
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
53 :tag("invite", {from = stanza.attr.from})
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
54 :tag("reason"):text(reason):up():up():up()
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
55 :tag("notification", not_attrs):up()
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
56 :tag("no-store", {xmlns = "urn:xmpp:hints"})
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
57 module:log("debug", "notifying with %s", tostring(use_invite and invite or notification))
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
58 module:send(use_invite and invite or notification)
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
59 module:log("debug", "sent notification of MUC message %s", use_invite and invite or notification)
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
60 end
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
61 end
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
62 end
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
63 end
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
64
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
65 module:hook("muc-broadcast-message", handle_muc_message)
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
66
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
67 module:log("debug", "Module loaded")