plugins/muc: Move locking to seperate module
authordaurnimator <quae@daurnimator.com>
Wed, 2 Apr 2014 19:48:25 +0000 (15:48 -0400)
committerdaurnimator <quae@daurnimator.com>
Wed, 2 Apr 2014 19:48:25 +0000 (15:48 -0400)
plugins/muc/lock.lib.lua [new file with mode: 0644]
plugins/muc/mod_muc.lua
plugins/muc/muc.lib.lua

diff --git a/plugins/muc/lock.lib.lua b/plugins/muc/lock.lib.lua
new file mode 100644 (file)
index 0000000..73dfa15
--- /dev/null
@@ -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;
+};
index 8b40d6adc1a7d3896604b32393391aa34ba8423a..6f6094b45bcb5a6d3cedbbf33e8d01c216423e24 100644 (file)
@@ -23,8 +23,6 @@ if restrict_room_creation then
                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:depends("disco");
 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 @@ function create_room(jid)
        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
index ef572cfdbef49eae8a309b2644f219bca0877636..6906b9ce15c73db2961372a6b35934b63f442c2b 100644 (file)
@@ -87,18 +87,6 @@ function room_mt:get_default_role(affiliation)
        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 @@ function room_mt:get_whois()
        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 @@ module:hook("muc-occupant-pre-join", function(event)
        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 @@ function room_mt:process_form(origin, stanza)
                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 @@ local _M = {}; -- module "muc"
 function _M.new_room(jid, config)
        return setmetatable({
                jid = jid;
-               locked = nil;
                _jid_nick = {};
                _occupants = {};
                _data = {