Merge 0.10->trunk
[prosody.git] / plugins / muc / lock.lib.lua
1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
4 -- Copyright (C) 2014 Daurnimator
5 --
6 -- This project is MIT/X11 licensed. Please see the
7 -- COPYING file in the source package for more information.
8 --
9
10 local lock_rooms = module:get_option_boolean("muc_room_locking", false);
11 local lock_room_timeout = module:get_option_number("muc_room_lock_timeout", 300);
12
13 local function lock(room)
14         module:fire_event("muc-room-locked", {room = room;});
15         room.locked = true;
16 end
17 local function unlock(room)
18         module:fire_event("muc-room-unlocked", {room = room;});
19         room.locked = nil;
20 end
21 local function is_locked(room)
22         return not not room.locked;
23 end
24
25 if lock_rooms then
26         module:hook("muc-room-pre-create", function(event)
27                 -- Older groupchat protocol doesn't lock
28                 if not event.stanza:get_child("x", "http://jabber.org/protocol/muc") then return end
29                 -- Lock room at creation
30                 local room = event.room;
31                 lock(room);
32                 if lock_room_timeout and lock_room_timeout > 0 then
33                         module:add_timer(lock_room_timeout, function ()
34                                 if is_locked(room) then
35                                         room:destroy(); -- Not unlocked in time
36                                 end
37                         end);
38                 end
39         end, 10);
40 end
41
42 -- Don't let users into room while it is locked
43 module:hook("muc-occupant-pre-join", function(event)
44         if not event.is_new_room and is_locked(event.room) then -- Deny entry
45                 event.origin.send(st.error_reply(event.stanza, "cancel", "item-not-found"));
46                 return true;
47         end
48 end, -30);
49
50 -- When config is submitted; unlock the room
51 module:hook("muc-config-submitted", function(event)
52         if is_locked(event.room) then
53                 unlock(event.room);
54         end
55 end, -1);
56
57 return {
58         lock = lock;
59         unlock = unlock;
60         is_locked = is_locked;
61 };