Software / code / prosody
Annotate
plugins/muc/lock.lib.lua @ 7372:b2d7e04eb922
MUC: Store rooms on disk on shutdown
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 18 Apr 2016 20:32:48 +0200 |
| parent | 6329:6b3eb1611587 |
| child | 7407:e465b584547b |
| 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 |
|
6329
6b3eb1611587
mod_muc: Import util.stanza into the config handler modules that need it. Fixes #432.
Matthew Wild <mwild1@gmail.com>
parents:
6242
diff
changeset
|
10 local st = require "util.stanza"; |
|
6b3eb1611587
mod_muc: Import util.stanza into the config handler modules that need it. Fixes #432.
Matthew Wild <mwild1@gmail.com>
parents:
6242
diff
changeset
|
11 |
|
6206
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
12 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
|
13 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
|
14 |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
15 local function lock(room) |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
16 module:fire_event("muc-room-locked", {room = room;}); |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
17 room.locked = true; |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
18 end |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
19 local function unlock(room) |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
20 module:fire_event("muc-room-unlocked", {room = room;}); |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
21 room.locked = nil; |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
22 end |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
23 local function is_locked(room) |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
24 return not not room.locked; |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
25 end |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
26 |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
27 if lock_rooms then |
|
6242
67efeadd9e77
plugins/muc/lock.lib: lock inside of pre-create instead of 'created'
daurnimator <quae@daurnimator.com>
parents:
6207
diff
changeset
|
28 module:hook("muc-room-pre-create", function(event) |
|
67efeadd9e77
plugins/muc/lock.lib: lock inside of pre-create instead of 'created'
daurnimator <quae@daurnimator.com>
parents:
6207
diff
changeset
|
29 -- Older groupchat protocol doesn't lock |
|
67efeadd9e77
plugins/muc/lock.lib: lock inside of pre-create instead of 'created'
daurnimator <quae@daurnimator.com>
parents:
6207
diff
changeset
|
30 if not event.stanza:get_child("x", "http://jabber.org/protocol/muc") then return end |
|
67efeadd9e77
plugins/muc/lock.lib: lock inside of pre-create instead of 'created'
daurnimator <quae@daurnimator.com>
parents:
6207
diff
changeset
|
31 -- Lock room at creation |
|
6206
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
32 local room = event.room; |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
33 lock(room); |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
34 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
|
35 module:add_timer(lock_room_timeout, function () |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
36 if is_locked(room) then |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
37 room:destroy(); -- Not unlocked in time |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
38 end |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
39 end); |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
40 end |
|
6242
67efeadd9e77
plugins/muc/lock.lib: lock inside of pre-create instead of 'created'
daurnimator <quae@daurnimator.com>
parents:
6207
diff
changeset
|
41 end, 10); |
|
6206
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
42 end |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
43 |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
44 -- 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
|
45 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
|
46 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
|
47 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
|
48 return true; |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
49 end |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
50 end, -30); |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
51 |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
52 -- When config is submitted; unlock the room |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
53 module:hook("muc-config-submitted", function(event) |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
54 if is_locked(event.room) then |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
55 unlock(event.room); |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
56 end |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
57 end, -1); |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
58 |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
59 return { |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
60 lock = lock; |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
61 unlock = unlock; |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
62 is_locked = is_locked; |
|
f937bb5c83c3
plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
63 }; |