File

plugins/muc/lock.lib.lua @ 11192:11f285a439a4

tools/cfgdump: Reads Prosody config file and pretty-prints it back out Useful for comparing what you think you have in your config with what Prosody sees, e.g. wrt (lack of) significance of indentation, order of options vs scope etc. (global options do not go at the end!) Could probably be turned into a prosodyctl command, especially if it learns to redact secrets and passwords.
author Kim Alvefur <zash@zash.se>
date Wed, 28 Oct 2020 22:48:31 +0100
parent 10450:c1edeb9fe337
child 12977:74b9e05af71e
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 "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;
};