# HG changeset patch # User Kim Alvefur # Date 1531273077 -7200 # Node ID dc606dc89f44e607fca6a731e994acc62a0d357a # Parent 326fedc1d3c63b723e1fe7c582a800337255a6fc MUC: Add support for storing a tombstone for destroyed rooms (#1182) diff -r 326fedc1d3c6 -r dc606dc89f44 CHANGES --- a/CHANGES Wed Jul 11 03:28:45 2018 +0200 +++ b/CHANGES Wed Jul 11 03:37:57 2018 +0200 @@ -10,6 +10,7 @@ - Store inactive rooms to disk - Store rooms to disk on shutdown - Voice requests + - Tombstones in place of destroyed rooms - PubSub features - Persistence - Affiliations diff -r 326fedc1d3c6 -r dc606dc89f44 plugins/muc/mod_muc.lua --- a/plugins/muc/mod_muc.lua Wed Jul 11 03:28:45 2018 +0200 +++ b/plugins/muc/mod_muc.lua Wed Jul 11 03:37:57 2018 +0200 @@ -323,6 +323,29 @@ 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 @@ 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