From 85fa97aa78b008b3249db2e54a7833cf83079c79 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 11 Jul 2018 03:37:57 +0200 Subject: MUC: Add support for storing a tombstone for destroyed rooms (#1182) --- CHANGES | 1 + plugins/muc/mod_muc.lua | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/CHANGES b/CHANGES index c35e9a20..58dd38fd 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,7 @@ New features - Store inactive rooms to disk - Store rooms to disk on shutdown - Voice requests + - Tombstones in place of destroyed rooms - PubSub features - Persistence - Affiliations diff --git a/plugins/muc/mod_muc.lua b/plugins/muc/mod_muc.lua index 8cf6d23c..7704adfe 100644 --- a/plugins/muc/mod_muc.lua +++ b/plugins/muc/mod_muc.lua @@ -323,6 +323,29 @@ module:hook("muc-room-destroyed",function(event) delete_room(room); end); +if module:get_option_boolean("muc_tombstones", true) then + + local ttl = module:get_option_number("muc_tombstone_expiry", 86400 * 31); + + module:hook("muc-room-destroyed",function(event) + local room = event.room; + if not room:get_persistent() then return end + + local tombstone = new_room(room.jid, { + locked = os.time() + ttl; + destroyed = true; + reason = event.reason; + newjid = event.newjid; + -- password? + }); + tombstone.save = room_save; + tombstone:set_persistent(true); + tombstone:set_hidden(true); + tombstone:save(true); + return true; + end, -10); +end + do local restrict_room_creation = module:get_option("restrict_room_creation"); if restrict_room_creation == true then @@ -372,6 +395,25 @@ for event_name, method in pairs { local origin, stanza = event.origin, event.stanza; local room_jid = jid_bare(stanza.attr.to); local room = get_room_from_jid(room_jid); + + if room and room._data.destroyed then + if stanza.attr.type == nil and stanza.name == "presence" then + if room._data.locked < os.time() then + -- Allow the room to be recreated after time has passed + delete_room(room); + room = nil; + else + local reply = st.reply(stanza) + :tag("x", {xmlns = "http://jabber.org/protocol/muc#user"}) + :tag("item", { affiliation='none', role='none' }):up() + :tag("destroy", {jid=room._data.newjid}):text(room._data.reason); + reply.attr.type = "unavailable"; + event.origin.send(reply); + return true; + end + end + end + if room == nil then -- Watch presence to create rooms if stanza.attr.type == nil and stanza.name == "presence" then -- cgit v1.2.3