aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/muc/lock.lib.lua
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2014-09-11 01:17:56 +0200
committerKim Alvefur <zash@zash.se>2014-09-11 01:17:56 +0200
commitfb0e709aa2d5fb52da6fb643a3cdfd921e8cde33 (patch)
tree147e215854eea3b4657112876b5c45863c73acc8 /plugins/muc/lock.lib.lua
parenta685dfb89e5c8895a767011961d2289810b72a1e (diff)
parent15303b0d3a84572090e81dc7c737b575184135b6 (diff)
downloadprosody-fb0e709aa2d5fb52da6fb643a3cdfd921e8cde33.tar.gz
prosody-fb0e709aa2d5fb52da6fb643a3cdfd921e8cde33.zip
Merge 0.10->trunk
Diffstat (limited to 'plugins/muc/lock.lib.lua')
-rw-r--r--plugins/muc/lock.lib.lua63
1 files changed, 63 insertions, 0 deletions
diff --git a/plugins/muc/lock.lib.lua b/plugins/muc/lock.lib.lua
new file mode 100644
index 00000000..82f0dc3f
--- /dev/null
+++ b/plugins/muc/lock.lib.lua
@@ -0,0 +1,63 @@
+-- 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", 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-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);
+ 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, 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
+ 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;
+};