# HG changeset patch # User Maxime “pep” Buquet # Date 1577986322 -3600 # Node ID f20a5d28910f4199cd74fbb1dab9c3acd544b665 # Parent a8aa11cc351d36c28bc2b8789c92cbc174aeb11f mod_muc_occupant_id: Ensure occupants have a generated id diff -r a8aa11cc351d -r f20a5d28910f mod_muc_occupant_id/mod_muc_occupant_id.lua --- 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 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();