view plugins/muc/lock.lib.lua @ 10486:479e96e554c8

net.server_epoll: Add debug logging for delayed reading In :onreadable, if there is still buffered incoming data after reading from the socket (as indicated by the :dirty method, usually because LuaSocket has an 8k buffer that's full but it read a smaller amount), another attempt to read is scheduled via this :pausefor method. This is also called from some other places where it would be pointless to read because there shouldn't be any data. In the delayed read case, this should report that the socket is "dirty". If it reports that the socket is "clean" then the question is where the buffer contents went? If this doesn't get logged after the scheduled time (0.000001s by default) then this would suggests a problem with timer or scheduling.
author Kim Alvefur <zash@zash.se>
date Sat, 07 Dec 2019 19:05:10 +0100
parents c1edeb9fe337
children 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;
};