Software /
code /
prosody
Changeset
9015:dc606dc89f44
MUC: Add support for storing a tombstone for destroyed rooms (#1182)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 11 Jul 2018 03:37:57 +0200 |
parents | 9014:326fedc1d3c6 |
children | 9016:946ae1181c57 |
files | CHANGES plugins/muc/mod_muc.lua |
diffstat | 2 files changed, 43 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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