Mercurial > prosody-hg
comparison plugins/muc/mod_muc.lua @ 6243:b7c95e9c13de
plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
| author | daurnimator <quae@daurnimator.com> |
|---|---|
| date | Tue, 29 Apr 2014 19:00:45 -0400 |
| parents | 6b4ff34dc8ea |
| children | dfaacf042cfe |
comparison
equal
deleted
inserted
replaced
| 6242:67efeadd9e77 | 6243:b7c95e9c13de |
|---|---|
| 8 | 8 |
| 9 local array = require "util.array"; | 9 local array = require "util.array"; |
| 10 | 10 |
| 11 if module:get_host_type() ~= "component" then | 11 if module:get_host_type() ~= "component" then |
| 12 error("MUC should be loaded as a component, please see http://prosody.im/doc/components", 0); | 12 error("MUC should be loaded as a component, please see http://prosody.im/doc/components", 0); |
| 13 end | |
| 14 | |
| 15 local restrict_room_creation = module:get_option("restrict_room_creation"); | |
| 16 if restrict_room_creation then | |
| 17 if restrict_room_creation == true then | |
| 18 restrict_room_creation = "admin"; | |
| 19 elseif restrict_room_creation ~= "admin" and restrict_room_creation ~= "local" then | |
| 20 restrict_room_creation = nil; | |
| 21 end | |
| 22 end | 13 end |
| 23 | 14 |
| 24 local muclib = module:require "muc"; | 15 local muclib = module:require "muc"; |
| 25 local muc_new_room = muclib.new_room; | 16 local muc_new_room = muclib.new_room; |
| 26 room_mt = muclib.room_mt; -- Yes, global. | 17 room_mt = muclib.room_mt; -- Yes, global. |
| 144 module:hook("muc-room-destroyed",function(event) | 135 module:hook("muc-room-destroyed",function(event) |
| 145 local room = event.room | 136 local room = event.room |
| 146 forget_room(room.jid) | 137 forget_room(room.jid) |
| 147 end) | 138 end) |
| 148 | 139 |
| 140 do | |
| 141 local restrict_room_creation = module:get_option("restrict_room_creation"); | |
| 142 if restrict_room_creation == true then | |
| 143 restrict_room_creation = "admin"; | |
| 144 end | |
| 145 if restrict_room_creation then | |
| 146 local host_suffix = module.host:gsub("^[^%.]+%.", ""); | |
| 147 module:hook("muc-room-pre-create", function(event) | |
| 148 local user_jid = event.stanza.attr.from; | |
| 149 if not is_admin(user_jid) and not ( | |
| 150 restrict_room_creation == "local" and | |
| 151 select(2, jid_split(user_jid)) == host_suffix | |
| 152 ) then | |
| 153 origin.send(st.error_reply(stanza, "cancel", "not-allowed")); | |
| 154 return true; | |
| 155 end | |
| 156 end); | |
| 157 end | |
| 158 end | |
| 159 | |
| 149 -- Watch presence to create rooms | 160 -- Watch presence to create rooms |
| 150 local function attempt_room_creation(event) | 161 local function attempt_room_creation(event) |
| 151 local origin, stanza = event.origin, event.stanza; | 162 local origin, stanza = event.origin, event.stanza; |
| 152 local room_jid = jid_bare(stanza.attr.to); | 163 local room_jid = jid_bare(stanza.attr.to); |
| 153 if stanza.attr.type == nil and | 164 if stanza.attr.type == nil and get_room_from_jid(room_jid) == nil then |
| 154 get_room_from_jid(room_jid) == nil and | |
| 155 ( | |
| 156 not(restrict_room_creation) or | |
| 157 is_admin(stanza.attr.from) or | |
| 158 ( | |
| 159 restrict_room_creation == "local" and | |
| 160 select(2, jid_split(stanza.attr.from)) == module.host:gsub("^[^%.]+%.", "") | |
| 161 ) | |
| 162 ) then | |
| 163 create_room(room_jid); | 165 create_room(room_jid); |
| 164 end | 166 end |
| 165 end | 167 end |
| 166 module:hook("presence/full", attempt_room_creation, -1) | 168 module:hook("presence/full", attempt_room_creation, -1) |
| 167 module:hook("presence/bare", attempt_room_creation, -1) | 169 module:hook("presence/bare", attempt_room_creation, -1) |
