annotate mod_muc_notifications/mod_muc_notifications.lua @ 3503:882180b459a0

mod_pubsub_post: Restructure authentication and authorization (BC) This deprecates the default "superuser" actor model and makes the default equivalent to the previous "request.id". A single actor and secret per node is supported because HTTP and WebHooks don't normally include any authorization identity. Allowing authentication bypass when no secret is given should be relatively safe when the actor is unprivileged, as will be unless explicitly configured otherwise.
author Kim Alvefur <zash@zash.se>
date Sat, 30 Mar 2019 21:16:13 +0100
parents 69219097aa85
children ef752c5115f7
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 }
69219097aa85 muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff changeset
47 local reason = "You have messages in group chat "..room:get_name()
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")