Mercurial > prosody-modules
annotate mod_muc_mention_notifications/mod_muc_mention_notifications.lua @ 5193:2bb29ece216b
mod_http_oauth2: Implement stateless dynamic client registration
Replaces previous explicit registration that required either the
additional module mod_adhoc_oauth2_client or manually editing the
database. That method was enough to have something to test with, but
would not probably not scale easily.
Dynamic client registration allows creating clients on the fly, which
may be even easier in theory.
In order to not allow basically unauthenticated writes to the database,
we implement a stateless model here.
per_host_key := HMAC(config -> oauth2_registration_key, hostname)
client_id := JWT { client metadata } signed with per_host_key
client_secret := HMAC(per_host_key, client_id)
This should ensure everything we need to know is part of the client_id,
allowing redirects etc to be validated, and the client_secret can be
validated with only the client_id and the per_host_key.
A nonce injected into the client_id JWT should ensure nobody can submit
the same client metadata and retrieve the same client_secret
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 03 Mar 2023 21:14:19 +0100 |
parents | fc5c53d9d340 |
children |
rev | line source |
---|---|
4280
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
1 local jid = require "util.jid"; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
2 local st = require "util.stanza"; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
3 local datetime = require "util.datetime"; |
4305
2ca55a4da3ea
muc_room_mention_notifications: Handle referenced JID being a MUC nickname JID
JC Brand <jc@opkode.com>
parents:
4280
diff
changeset
|
4 local jid_resource = require "util.jid".resource; |
4280
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
5 |
4307
af7297e49885
muc_mention_notifications: Rename module
JC Brand <jc@opkode.com>
parents:
4306
diff
changeset
|
6 local notify_unaffiliated_users = module:get_option("muc_mmn_notify_unaffiliated_users", false) |
4280
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
7 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
8 local muc_affiliation_store = module:open_store("config", "map"); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
9 |
4306
747a14017d00
muc_room_mention_notifications: Set xmlns to what's used in the protoXEP
JC Brand <jc@opkode.com>
parents:
4305
diff
changeset
|
10 local mmn_xmlns = "urn:xmpp:mmn:0"; |
4280
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
11 local reference_xmlns = "urn:xmpp:reference:0"; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
12 local forwarded_xmlns = "urn:xmpp:forward:0"; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
13 local deplay_xmlns = "urn:xmpp:delay"; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
14 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
15 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
16 -- Returns a set of rooms the user is affiliated to |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
17 local function get_user_rooms(user_bare_jid) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
18 return muc_affiliation_store:get_all(user_bare_jid); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
19 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
20 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
21 local function is_eligible(user_bare_jid, room) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
22 if notify_unaffiliated_users then return true; end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
23 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
24 local user_rooms, err = get_user_rooms(user_bare_jid); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
25 if not user_rooms then |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
26 if err then |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
27 return false, err; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
28 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
29 return false; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
30 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
31 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
32 local room_node = jid.node(room.jid) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
33 if user_rooms[room_node] then |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
34 return true; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
35 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
36 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
37 return false |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
38 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
39 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
40 -- Send a single notification for a room, updating data structures as needed |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
41 local function send_single_notification(user_bare_jid, room_jid, mention_stanza) |
4313
fc5c53d9d340
mod_muc_mention_notifications: Send mention notifications from the MUC JID
JC Brand <jc@opkode.com>
parents:
4308
diff
changeset
|
42 local notification = st.message({ to = user_bare_jid, from = room_jid }) |
4306
747a14017d00
muc_room_mention_notifications: Set xmlns to what's used in the protoXEP
JC Brand <jc@opkode.com>
parents:
4305
diff
changeset
|
43 :tag("mentions", { xmlns = mmn_xmlns }) |
4280
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
44 :tag("forwarded", {xmlns = forwarded_xmlns}) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
45 :tag("delay", {xmlns = deplay_xmlns, stamp = datetime.datetime()}):up() |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
46 :add_child(mention_stanza) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
47 :reset(); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
48 module:log("debug", "Sending mention notification from %s to %s", room_jid, user_bare_jid); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
49 return module:send(notification); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
50 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
51 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
52 local function notify_mentioned_users(room, client_mentions, mention_stanza) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
53 module:log("debug", "NOTIFYING FOR %s", room.jid) |
4305
2ca55a4da3ea
muc_room_mention_notifications: Handle referenced JID being a MUC nickname JID
JC Brand <jc@opkode.com>
parents:
4280
diff
changeset
|
54 for mentioned_jid in pairs(client_mentions) do |
2ca55a4da3ea
muc_room_mention_notifications: Handle referenced JID being a MUC nickname JID
JC Brand <jc@opkode.com>
parents:
4280
diff
changeset
|
55 local user_bare_jid = mentioned_jid; |
2ca55a4da3ea
muc_room_mention_notifications: Handle referenced JID being a MUC nickname JID
JC Brand <jc@opkode.com>
parents:
4280
diff
changeset
|
56 if (string.match(mentioned_jid, room.jid)) then |
2ca55a4da3ea
muc_room_mention_notifications: Handle referenced JID being a MUC nickname JID
JC Brand <jc@opkode.com>
parents:
4280
diff
changeset
|
57 local nick = jid_resource(mentioned_jid); |
2ca55a4da3ea
muc_room_mention_notifications: Handle referenced JID being a MUC nickname JID
JC Brand <jc@opkode.com>
parents:
4280
diff
changeset
|
58 user_bare_jid = room:get_registered_jid(nick); |
2ca55a4da3ea
muc_room_mention_notifications: Handle referenced JID being a MUC nickname JID
JC Brand <jc@opkode.com>
parents:
4280
diff
changeset
|
59 end |
4280
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
60 if is_eligible(user_bare_jid, room) then |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
61 send_single_notification(user_bare_jid, room.jid, mention_stanza); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
62 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
63 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
64 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
65 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
66 local function get_mentions(stanza) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
67 local has_mentions = false |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
68 local client_mentions = {} |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
69 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
70 for element in stanza:childtags("reference", reference_xmlns) do |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
71 if element.attr.type == "mention" then |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
72 local user_bare_jid = element.attr.uri:match("^xmpp:(.+)$"); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
73 if user_bare_jid then |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
74 client_mentions[user_bare_jid] = user_bare_jid; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
75 has_mentions = true |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
76 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
77 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
78 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
79 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
80 return has_mentions, client_mentions |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
81 end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
82 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
83 module:hook("muc-broadcast-message", function (event) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
84 local room, stanza = event.room, event.stanza; |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
85 local body = stanza:get_child_text("body") |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
86 if not body or #body < 1 then return; end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
87 local correction = stanza:get_child("replace", "urn:xmpp:message-correct:0"); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
88 if correction then return; end -- Do not notify on message corrections |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
89 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
90 local has_mentions, client_mentions = get_mentions(stanza) |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
91 if not has_mentions then return; end |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
92 |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
93 -- Notify any users that need to be notified |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
94 notify_mentioned_users(room, client_mentions, stanza); |
278f2998ce49
mod_muc_room_mention_notifications: Publish module
Seve Ferrer <seve@delape.net>
parents:
diff
changeset
|
95 end, -1); |