plugins/muc: Move locking to seperate module
authordaurnimator <quae@daurnimator.com>
Wed, 02 Apr 2014 15:48:25 -0400
changeset 6206 f937bb5c83c3
parent 6205 49dd381666f3
child 6207 a5928fdeaf97
plugins/muc: Move locking to seperate module
plugins/muc/lock.lib.lua
plugins/muc/mod_muc.lua
plugins/muc/muc.lib.lua
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/muc/lock.lib.lua	Wed Apr 02 15:48:25 2014 -0400
@@ -0,0 +1,65 @@
+-- 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 lock_rooms = module:get_option_boolean("muc_room_locking", false);
+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.locked = true;
+end
+local function unlock(room)
+	module:fire_event("muc-room-unlocked", {room = room;});
+	room.locked = nil;
+end
+local function is_locked(room)
+	return not not room.locked;
+end
+
+if lock_rooms then
+	module:hook("muc-room-created", function(event)
+		local room = event.room;
+		lock(room);
+		if lock_room_timeout and lock_room_timeout > 0 then
+			module:add_timer(lock_room_timeout, function ()
+				if is_locked(room) then
+					room:destroy(); -- Not unlocked in time
+				end
+			end);
+		end
+	end);
+end
+
+-- Older groupchat protocol doesn't lock
+module:hook("muc-room-pre-create", function(event)
+	if is_locked(event.room) and not event.stanza:get_child("x", "http://jabber.org/protocol/muc") then
+		unlock(event.room);
+	end
+end, 10);
+
+-- Don't let users into room while it is locked
+module:hook("muc-occupant-pre-join", function(event)
+	if is_locked(event.room) then -- Deny entry
+		event.origin.send(st.error_reply(event.stanza, "cancel", "item-not-found"));
+		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;
+};
--- a/plugins/muc/mod_muc.lua	Wed Apr 02 15:36:08 2014 -0400
+++ b/plugins/muc/mod_muc.lua	Wed Apr 02 15:48:25 2014 -0400
@@ -23,8 +23,6 @@
 		restrict_room_creation = nil;
 	end
 end
-local lock_rooms = module:get_option_boolean("muc_room_locking", false);
-local lock_room_timeout = module:get_option_number("muc_room_lock_timeout", 300);
 
 local muclib = module:require "muc";
 local muc_new_room = muclib.new_room;
@@ -47,6 +45,7 @@
 module:add_identity("conference", "text", muc_name);
 module:add_feature("http://jabber.org/protocol/muc");
 module:depends "muc_unique"
+module:require "muc/lock";
 
 local function is_admin(jid)
 	return um_is_admin(jid, module.host);
@@ -94,20 +93,6 @@
 	return room;
 end
 
-if lock_rooms then
-	module:hook("muc-room-created", function(event)
-		local room = event.room;
-		room:lock();
-		if lock_room_timeout and lock_room_timeout > 0 then
-			module:add_timer(lock_room_timeout, function ()
-				if room:is_locked() then
-					room:destroy(); -- Not unlocked in time
-				end
-			end);
-		end
-	end);
-end
-
 function forget_room(jid)
 	rooms[jid] = nil;
 end
--- a/plugins/muc/muc.lib.lua	Wed Apr 02 15:36:08 2014 -0400
+++ b/plugins/muc/muc.lib.lua	Wed Apr 02 15:48:25 2014 -0400
@@ -87,18 +87,6 @@
 	end
 end
 
-function room_mt:lock()
-	module:fire_event("muc-room-locked", { room = self });
-	self.locked = true
-end
-function room_mt:unlock()
-	module:fire_event("muc-room-unlocked", { room = self });
-	self.locked = nil
-end
-function room_mt:is_locked()
-	return not not self.locked
-end
-
 --- Occupant functions
 function room_mt:new_occupant(bare_real_jid, nick)
 	local occupant = occupant_lib.new(bare_real_jid, nick);
@@ -583,13 +571,6 @@
 	return self._data.whois;
 end
 
-module:hook("muc-room-pre-create", function(event)
-	local room = event.room;
-	if room:is_locked() and not event.stanza:get_child("x", "http://jabber.org/protocol/muc") then
-		room:unlock(); -- Older groupchat protocol doesn't lock
-	end
-end, 10);
-
 -- Give the room creator owner affiliation
 module:hook("muc-room-pre-create", function(event)
 	event.room:set_affiliation(true, jid_bare(event.stanza.attr.from), "owner");
@@ -610,13 +591,6 @@
 	end
 end, -20);
 
-module:hook("muc-occupant-pre-join", function(event)
-	if event.room:is_locked() then -- Deny entry
-		event.origin.send(st.error_reply(event.stanza, "cancel", "item-not-found"));
-		return true;
-	end
-end, -30);
-
 -- registration required for entering members-only room
 module:hook("muc-occupant-pre-join", function(event)
 	local room, stanza = event.room, event.stanza;
@@ -1006,9 +980,6 @@
 		module:fire_event("muc-config-submitted", event);
 
 		if self.save then self:save(true); end
-		if self:is_locked() then
-			self:unlock();
-		end
 		origin.send(st.reply(stanza));
 
 		if next(event.status_codes) then
@@ -1543,7 +1514,6 @@
 function _M.new_room(jid, config)
 	return setmetatable({
 		jid = jid;
-		locked = nil;
 		_jid_nick = {};
 		_occupants = {};
 		_data = {