Software /
code /
prosody
Annotate
plugins/muc/lock.lib.lua @ 6213:95bddf0142f4
plugins/muc/muc.lib: Remember to coerce nil role to "none"
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Thu, 03 Apr 2014 14:23:06 -0400 |
parent | 6207:a5928fdeaf97 |
child | 6242:67efeadd9e77 |
rev | line source |
---|---|
6206
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
1 -- Prosody IM |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
4 -- Copyright (C) 2014 Daurnimator |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
5 -- |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
6 -- This project is MIT/X11 licensed. Please see the |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
7 -- COPYING file in the source package for more information. |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
8 -- |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
9 |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
10 local lock_rooms = module:get_option_boolean("muc_room_locking", false); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
11 local lock_room_timeout = module:get_option_number("muc_room_lock_timeout", 300); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
12 |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
13 local function lock(room) |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
14 module:fire_event("muc-room-locked", {room = room;}); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
15 room.locked = true; |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
16 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
17 local function unlock(room) |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
18 module:fire_event("muc-room-unlocked", {room = room;}); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
19 room.locked = nil; |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
20 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
21 local function is_locked(room) |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
22 return not not room.locked; |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
23 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
24 |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
25 if lock_rooms then |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
26 module:hook("muc-room-created", function(event) |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
27 local room = event.room; |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
28 lock(room); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
29 if lock_room_timeout and lock_room_timeout > 0 then |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
30 module:add_timer(lock_room_timeout, function () |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
31 if is_locked(room) then |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
32 room:destroy(); -- Not unlocked in time |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
33 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
34 end); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
35 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
36 end); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
37 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
38 |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
39 -- Older groupchat protocol doesn't lock |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
40 module:hook("muc-room-pre-create", function(event) |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
41 if is_locked(event.room) and not event.stanza:get_child("x", "http://jabber.org/protocol/muc") then |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
42 unlock(event.room); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
43 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
44 end, 10); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
45 |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
46 -- Don't let users into room while it is locked |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
47 module:hook("muc-occupant-pre-join", function(event) |
6207
a5928fdeaf97
plugins/muc/lock.lib: Need to let creator into the locked room :)
daurnimator <quae@daurnimator.com>
parents:
6206
diff
changeset
|
48 if not event.is_new_room and is_locked(event.room) then -- Deny entry |
6206
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
49 event.origin.send(st.error_reply(event.stanza, "cancel", "item-not-found")); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
50 return true; |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
51 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
52 end, -30); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
53 |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
54 -- When config is submitted; unlock the room |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
55 module:hook("muc-config-submitted", function(event) |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
56 if is_locked(event.room) then |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
57 unlock(event.room); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
58 end |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
59 end, -1); |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
60 |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
61 return { |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
62 lock = lock; |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
63 unlock = unlock; |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
64 is_locked = is_locked; |
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
65 }; |