mirror of
https://github.com/bjc/prosody.git
synced 2025-04-03 05:07:42 +03:00
62 lines
1.7 KiB
Lua
62 lines
1.7 KiB
Lua
-- 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_number("muc_room_lock_timeout", 300);
|
|
|
|
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;
|
|
};
|