annotate plugins/muc/occupant_id.lib.lua @ 14229:ce31fdde0ad1 default tip

net.unbound: Simplify conditional
author Kim Alvefur <zash@zash.se>
date Sat, 13 Jun 2026 11:35:18 +0200
parents 0e346f4d88ce
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13577
a45b209302c1 muc: Update link to XEP-0421 (instead of inbox)
Kim Alvefur <zash@zash.se>
parents: 12977
diff changeset
1 -- Implementation of https://xmpp.org/extensions/xep-0421.html
11215
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- XEP-0421: Anonymous unique occupant identifiers for MUCs
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 -- (C) 2020 Maxime “pep” Buquet <pep@bouah.net>
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- (C) 2020 Matthew Wild <mwild1@gmail.com>
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12108
diff changeset
7 local uuid = require "prosody.util.uuid";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12108
diff changeset
8 local hmac_sha256 = require "prosody.util.hashes".hmac_sha256;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12108
diff changeset
9 local b64encode = require "prosody.util.encodings".base64.encode;
11215
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local xmlns_occupant_id = "urn:xmpp:occupant-id:0";
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
12108
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
13 local function get_room_salt(room)
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
14 local salt = room._data.occupant_id_salt;
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
15 if not salt then
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
16 salt = uuid.generate();
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
17 room._data.occupant_id_salt = salt;
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
18 end
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
19 return salt;
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
20 end
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
21
11215
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local function get_occupant_id(room, occupant)
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 if occupant.stable_id then
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 return occupant.stable_id;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26
12108
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
27 local salt = get_room_salt(room)
11215
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 occupant.stable_id = b64encode(hmac_sha256(occupant.bare_jid, salt));
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 return occupant.stable_id;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33
13905
0e346f4d88ce MUC: Add get_occupant_id_from_jid() method, which works on real JIDs
Matthew Wild <mwild1@gmail.com>
parents: 13577
diff changeset
34 local function get_occupant_id_from_jid(room, real_bare_jid)
0e346f4d88ce MUC: Add get_occupant_id_from_jid() method, which works on real JIDs
Matthew Wild <mwild1@gmail.com>
parents: 13577
diff changeset
35 local salt = get_room_salt(room)
0e346f4d88ce MUC: Add get_occupant_id_from_jid() method, which works on real JIDs
Matthew Wild <mwild1@gmail.com>
parents: 13577
diff changeset
36 return b64encode(hmac_sha256(real_bare_jid, salt));
0e346f4d88ce MUC: Add get_occupant_id_from_jid() method, which works on real JIDs
Matthew Wild <mwild1@gmail.com>
parents: 13577
diff changeset
37 end
0e346f4d88ce MUC: Add get_occupant_id_from_jid() method, which works on real JIDs
Matthew Wild <mwild1@gmail.com>
parents: 13577
diff changeset
38
11215
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 local function update_occupant(event)
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 local stanza, room, occupant, dest_occupant = event.stanza, event.room, event.occupant, event.dest_occupant;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 -- "muc-occupant-pre-change" provides "dest_occupant" but not "occupant".
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 if dest_occupant ~= nil then
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 occupant = dest_occupant;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 -- strip any existing <occupant-id/> tags to avoid forgery
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 stanza:remove_children("occupant-id", xmlns_occupant_id);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 local unique_id = get_occupant_id(room, occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 stanza:tag("occupant-id", { xmlns = xmlns_occupant_id, id = unique_id }):up();
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 local function muc_private(event)
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 local stanza, room = event.stanza, event.room;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 local occupant = room._occupants[stanza.attr.from];
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 update_occupant({
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 stanza = stanza,
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 room = room,
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 occupant = occupant,
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 });
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 if module:get_option_boolean("muc_occupant_id", true) then
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 module:add_feature(xmlns_occupant_id);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 module:hook("muc-disco#info", function (event)
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 event.reply:tag("feature", { var = xmlns_occupant_id }):up();
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 module:hook("muc-broadcast-presence", update_occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 module:hook("muc-occupant-pre-join", update_occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 module:hook("muc-occupant-pre-change", update_occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 module:hook("muc-occupant-groupchat", update_occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 module:hook("muc-private-message", muc_private);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 return {
12108
e9882c4c397f MUC: Add method for getting the occupant id salt to allow reuse
Kim Alvefur <zash@zash.se>
parents: 11215
diff changeset
79 get_room_salt = get_room_salt;
11215
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 get_occupant_id = get_occupant_id;
13905
0e346f4d88ce MUC: Add get_occupant_id_from_jid() method, which works on real JIDs
Matthew Wild <mwild1@gmail.com>
parents: 13577
diff changeset
81 get_occupant_id_from_jid = get_occupant_id_from_jid;
11215
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 };