mod_muc_occupant_id/mod_muc_occupant_id.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 4014 ae27f3359df8
permissions -rw-r--r--
mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);