aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/muc
diff options
context:
space:
mode:
authorWaqas Hussain <waqas20@gmail.com>2011-02-24 07:11:35 +0500
committerWaqas Hussain <waqas20@gmail.com>2011-02-24 07:11:35 +0500
commit88b861e694d0e03a2dc2b8d69019baaa70caa154 (patch)
tree9c6650c8a967b574853bd7139058783a3691de44 /plugins/muc
parent5f8cd641ca14945a063824f89e0b14d1f7f9bbd1 (diff)
downloadprosody-88b861e694d0e03a2dc2b8d69019baaa70caa154.tar.gz
prosody-88b861e694d0e03a2dc2b8d69019baaa70caa154.zip
MUC: Don't limit affiliation changes to owners, and allow owners to remove themselves if they are not the last owner.
Diffstat (limited to 'plugins/muc')
-rw-r--r--plugins/muc/muc.lib.lua19
1 files changed, 17 insertions, 2 deletions
diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua
index c60d44aa..647bf915 100644
--- a/plugins/muc/muc.lib.lua
+++ b/plugins/muc/muc.lib.lua
@@ -929,8 +929,23 @@ function room_mt:set_affiliation(actor, jid, affiliation, callback, reason)
if affiliation and affiliation ~= "outcast" and affiliation ~= "owner" and affiliation ~= "admin" and affiliation ~= "member" then
return nil, "modify", "not-acceptable";
end
- if self:get_affiliation(actor) ~= "owner" then return nil, "cancel", "not-allowed"; end
- if jid_bare(actor) == jid then return nil, "cancel", "not-allowed"; end
+ local actor_affiliation = self:get_affiliation(actor);
+ local target_affiliation = self:get_affiliation(jid);
+ if target_affiliation == affiliation then -- no change, shortcut
+ if callback then callback(); end
+ return true;
+ end
+ if actor_affiliation ~= "owner" then
+ if actor_affiliation ~= "admin" or target_affiliation == "owner" or target_affiliation == "admin" then
+ return nil, "cancel", "not-allowed";
+ end
+ elseif target_affiliation == "owner" and jid_bare(actor) == jid then -- self change
+ local is_last = true;
+ for j, aff in pairs(self._affiliations) do if j ~= jid and aff == "owner" then is_last = false; break; end end
+ if is_last then
+ return nil, "cancel", "conflict";
+ end
+ end
self._affiliations[jid] = affiliation;
local role = self:get_default_role(affiliation);
local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"})