aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/muc/lock.lib.lua65
-rw-r--r--plugins/muc/mod_muc.lua17
-rw-r--r--plugins/muc/muc.lib.lua30
3 files changed, 66 insertions, 46 deletions
diff --git a/plugins/muc/lock.lib.lua b/plugins/muc/lock.lib.lua
new file mode 100644
index 00000000..73dfa151
--- /dev/null
+++ b/plugins/muc/lock.lib.lua
@@ -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;
+};
diff --git a/plugins/muc/mod_muc.lua b/plugins/muc/mod_muc.lua
index 8b40d6ad..6f6094b4 100644
--- a/plugins/muc/mod_muc.lua
+++ b/plugins/muc/mod_muc.lua
@@ -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
diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua
index ef572cfd..6906b9ce 100644
--- a/plugins/muc/muc.lib.lua
+++ b/plugins/muc/muc.lib.lua
@@ -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 = {