Changeset

3829:f20a5d28910f

mod_muc_occupant_id: Ensure occupants have a generated id
author Maxime “pep” Buquet <pep@bouah.net>
date Thu, 02 Jan 2020 18:32:02 +0100
parents 3828:a8aa11cc351d
children 3830:63d8072dc864
files mod_muc_occupant_id/mod_muc_occupant_id.lua
diffstat 1 files changed, 19 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/mod_muc_occupant_id/mod_muc_occupant_id.lua	Thu Jan 02 10:45:19 2020 +0100
+++ b/mod_muc_occupant_id/mod_muc_occupant_id.lua	Thu Jan 02 18:32:02 2020 +0100
@@ -10,8 +10,7 @@
 
 local xmlns_occupant_id = "urn:xmpp:occupant-id:0";
 
-local function edit_occupant(event)
-	local occupant, room = event.occupant, event.room;
+local function generate_id(occupant, room)
 	local bare = occupant.bare_jid;
 
 	-- TODO: Move the salt on the MUC component. Setting the salt on the room
@@ -23,7 +22,11 @@
 		room._data.occupant_id_salt = salt;
 	end
 
-	local unique_id = b64encode(hmac_sha256(bare, room._data.occupant_id_salt));
+	return b64encode(hmac_sha256(bare, room._data.occupant_id_salt));
+end
+
+local function edit_occupant(event)
+	local unique_id = generate_id(event.occupant, event.room);
 
 	-- TODO: Store this only once per bare jid and not once per occupant?
 	local stanza = event.stanza;
@@ -33,16 +36,23 @@
 end
 
 local function handle_stanza(event)
-	local stanza, occupant = event.stanza, event.occupant;
-
-	-- TODO: Handle MAM.
+	local stanza, occupant, room = event.stanza, event.occupant, event.room;
 
 	-- strip any existing <occupant-id/> tags to avoid forgery
 	stanza:remove_children("occupant-id", xmlns_occupant_id);
 
-	local unique_id = occupant.sessions[stanza.attr.from]
-		:get_child("occupant-id", xmlns_occupant_id)
-		:get_text();
+	local occupant_tag = occupant.sessions[stanza.attr.from]
+		:get_child("occupant-id", xmlns_occupant_id);
+
+	local unique_id = nil;
+	if occupant_tag == nil then
+		unique_id = generate_id(occupant, room);
+	else
+		unique_id = occupant.sessions[stanza.attr.from]
+			:get_child("occupant-id", xmlns_occupant_id)
+			:get_text();
+	end
+
 	stanza:tag("occupant-id", { xmlns = xmlns_occupant_id })
 		:text(unique_id)
 		:up();