Software /
code /
prosody
File
plugins/muc/lock.lib.lua @ 13213:50324f66ca2a
plugins: Use integer config API with interval specification where sensible
Many of these fall into a few categories:
- util.cache size, must be >= 1
- byte or item counts that logically can't be negative
- port numbers that should be in 1..0xffff
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 17 Jul 2023 01:38:54 +0200 |
parent | 13209:c8d949cf6b09 |
line wrap: on
line source
-- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain -- Copyright (C) 2014 Daurnimator -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- local st = require "prosody.util.stanza"; local lock_rooms = module:get_option_boolean("muc_room_locking", true); local lock_room_timeout = module:get_option_period("muc_room_lock_timeout", "5 minutes"); local function lock(room) module:fire_event("muc-room-locked", {room = room;}); room._data.locked = os.time() + lock_room_timeout; end local function unlock(room) module:fire_event("muc-room-unlocked", {room = room;}); room._data.locked = nil; end local function is_locked(room) local ts = room._data.locked; if ts then if os.time() < ts then return true; end unlock(room); end return false; end if lock_rooms then module:hook("muc-room-pre-create", function(event) -- Older groupchat protocol doesn't lock if not event.stanza:get_child("x", "http://jabber.org/protocol/muc") then return end -- Lock room at creation local room = event.room; lock(room); end, 10); end -- Don't let users into room while it is locked module:hook("muc-occupant-pre-join", function(event) if not event.is_new_room and is_locked(event.room) then -- Deny entry module:log("debug", "Room is locked, denying entry"); event.origin.send(st.error_reply(event.stanza, "cancel", "item-not-found", nil, module.host)); return true; end end, -30); -- When config is submitted; unlock the room module:hook("muc-config-submitted", function(event) if is_locked(event.room) then unlock(event.room); end end, -1); return { lock = lock; unlock = unlock; is_locked = is_locked; };