author | Matthew Wild <mwild1@gmail.com> |
Tue, 16 Apr 2024 12:05:47 +0100 | |
changeset 5887 | 6c11e1b4066d |
parent 4014 | ae27f3359df8 |
permissions | -rw-r--r-- |
3633
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
1 |
|
3635
d6164ae6179c
mod_muc_occupant_id: Update links to the XEP inbox.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3634
diff
changeset
|
2 |
-- Implementation of https://xmpp.org/extensions/inbox/occupant-id.html |
3658
7b02b8de6d27
mod_muc_occupant_id: Update XEP number (XEP-0421)
Maxime “pep” Buquet <pep@bouah.net>
parents:
3636
diff
changeset
|
3 |
-- XEP-0421: Anonymous unique occupant identifiers for MUCs |
3633
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
4 |
|
3636
83a68f5fde1d
mod_muc_occupant_id: depend on muc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3635
diff
changeset
|
5 |
module:depends("muc"); |
83a68f5fde1d
mod_muc_occupant_id: depend on muc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3635
diff
changeset
|
6 |
|
3633
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
7 |
local uuid = require "util.uuid"; |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
8 |
local hmac_sha256 = require "util.hashes".hmac_sha256; |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
9 |
local b64encode = require "util.encodings".base64.encode; |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
10 |
|
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
11 |
local xmlns_occupant_id = "urn:xmpp:occupant-id:0"; |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
12 |
|
3833
f20a5d28910f
mod_muc_occupant_id: Ensure occupants have a generated id
Maxime “pep” Buquet <pep@bouah.net>
parents:
3779
diff
changeset
|
13 |
local function generate_id(occupant, room) |
3633
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
14 |
local bare = occupant.bare_jid; |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
15 |
|
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
16 |
if room._data.occupant_id_salt == nil then |
3838
2f189f022b84
mod_muc_occupant_id: Simplify handling of occupants (all into one function)
Maxime “pep” Buquet <pep@bouah.net>
parents:
3835
diff
changeset
|
17 |
room._data.occupant_id_salt = uuid.generate(); |
3633
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
18 |
end |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
19 |
|
4014
ae27f3359df8
mod_muc_occupant_id: Don't store occupant-ids.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3949
diff
changeset
|
20 |
-- XXX: Temporary not-so-important migration measure. Remove this next time |
ae27f3359df8
mod_muc_occupant_id: Don't store occupant-ids.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3949
diff
changeset
|
21 |
-- somebody looks at it. This module used to store every participant's |
ae27f3359df8
mod_muc_occupant_id: Don't store occupant-ids.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3949
diff
changeset
|
22 |
-- occupant-id all the time forever. |
ae27f3359df8
mod_muc_occupant_id: Don't store occupant-ids.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3949
diff
changeset
|
23 |
room._data.occupant_ids = nil; |
3838
2f189f022b84
mod_muc_occupant_id: Simplify handling of occupants (all into one function)
Maxime “pep” Buquet <pep@bouah.net>
parents:
3835
diff
changeset
|
24 |
|
4014
ae27f3359df8
mod_muc_occupant_id: Don't store occupant-ids.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3949
diff
changeset
|
25 |
return b64encode(hmac_sha256(bare, room._data.occupant_id_salt)); |
3833
f20a5d28910f
mod_muc_occupant_id: Ensure occupants have a generated id
Maxime “pep” Buquet <pep@bouah.net>
parents:
3779
diff
changeset
|
26 |
end |
f20a5d28910f
mod_muc_occupant_id: Ensure occupants have a generated id
Maxime “pep” Buquet <pep@bouah.net>
parents:
3779
diff
changeset
|
27 |
|
3838
2f189f022b84
mod_muc_occupant_id: Simplify handling of occupants (all into one function)
Maxime “pep” Buquet <pep@bouah.net>
parents:
3835
diff
changeset
|
28 |
local function update_occupant(event) |
3920
f1e28dcb3791
mod_muc_occupant_id: Ensure id is added to self-presences, nick changes, etc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3908
diff
changeset
|
29 |
local stanza, room, occupant, dest_occupant = event.stanza, event.room, event.occupant, event.dest_occupant; |
f1e28dcb3791
mod_muc_occupant_id: Ensure id is added to self-presences, nick changes, etc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3908
diff
changeset
|
30 |
|
f1e28dcb3791
mod_muc_occupant_id: Ensure id is added to self-presences, nick changes, etc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3908
diff
changeset
|
31 |
-- "muc-occupant-pre-change" provides "dest_occupant" but not "occupant". |
f1e28dcb3791
mod_muc_occupant_id: Ensure id is added to self-presences, nick changes, etc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3908
diff
changeset
|
32 |
if dest_occupant ~= nil then |
f1e28dcb3791
mod_muc_occupant_id: Ensure id is added to self-presences, nick changes, etc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3908
diff
changeset
|
33 |
occupant = dest_occupant; |
f1e28dcb3791
mod_muc_occupant_id: Ensure id is added to self-presences, nick changes, etc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3908
diff
changeset
|
34 |
end |
3674
6a437d6eb69f
mod_muc_occupant_id: add TODO regarding MAM handling
Maxime “pep” Buquet <pep@bouah.net>
parents:
3658
diff
changeset
|
35 |
|
3633
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
36 |
-- strip any existing <occupant-id/> tags to avoid forgery |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
37 |
stanza:remove_children("occupant-id", xmlns_occupant_id); |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
38 |
|
3838
2f189f022b84
mod_muc_occupant_id: Simplify handling of occupants (all into one function)
Maxime “pep” Buquet <pep@bouah.net>
parents:
3835
diff
changeset
|
39 |
local unique_id = generate_id(occupant, room); |
3908
d14fc974efbc
mod_muc_occupant_id: id is an attribute not a text node
Maxime “pep” Buquet <pep@bouah.net>
parents:
3841
diff
changeset
|
40 |
stanza:tag("occupant-id", { xmlns = xmlns_occupant_id, id = unique_id }):up(); |
3633
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
41 |
end |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
42 |
|
3949
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
43 |
local function muc_private(event) |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
44 |
local stanza, room = event.stanza, event.room; |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
45 |
local occupant = room._occupants[stanza.attr.from]; |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
46 |
|
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
47 |
update_occupant({ |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
48 |
stanza = stanza, |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
49 |
room = room, |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
50 |
occupant = occupant, |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
51 |
}); |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
52 |
end |
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
53 |
|
3633
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
54 |
module:add_feature(xmlns_occupant_id); |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
55 |
module:hook("muc-disco#info", function (event) |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
56 |
event.reply:tag("feature", { var = xmlns_occupant_id }):up(); |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
57 |
end); |
cfe0907808e1
mod_muc_occupant_id: initial commit
Maxime “pep” Buquet <pep@bouah.net>
parents:
diff
changeset
|
58 |
|
3839
5258f0afa8b4
mod_muc_occupant_id: Add <occupant-id/> in presence
Maxime “pep” Buquet <pep@bouah.net>
parents:
3838
diff
changeset
|
59 |
module:hook("muc-broadcast-presence", update_occupant); |
3838
2f189f022b84
mod_muc_occupant_id: Simplify handling of occupants (all into one function)
Maxime “pep” Buquet <pep@bouah.net>
parents:
3835
diff
changeset
|
60 |
module:hook("muc-occupant-pre-join", update_occupant); |
3920
f1e28dcb3791
mod_muc_occupant_id: Ensure id is added to self-presences, nick changes, etc.
Maxime “pep” Buquet <pep@bouah.net>
parents:
3908
diff
changeset
|
61 |
module:hook("muc-occupant-pre-change", update_occupant); |
3838
2f189f022b84
mod_muc_occupant_id: Simplify handling of occupants (all into one function)
Maxime “pep” Buquet <pep@bouah.net>
parents:
3835
diff
changeset
|
62 |
module:hook("muc-occupant-groupchat", update_occupant); |
3949
cf682a02b6d8
mod_muc_occupant_id: Handle MUC-PMs
Maxime “pep” Buquet <pep@bouah.net>
parents:
3920
diff
changeset
|
63 |
module:hook("muc-private-message", muc_private); |