plugins/muc/muc.lib.lua
changeset 4202 dff7df4a191b
parent 4201 9a8d2baf7a9c
child 4266 513485a11b85
--- a/plugins/muc/muc.lib.lua	Thu Feb 24 07:09:38 2011 +0500
+++ b/plugins/muc/muc.lib.lua	Thu Feb 24 07:11:35 2011 +0500
@@ -929,8 +929,23 @@
 	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"})