MUC: Don't limit affiliation changes to owners, and allow owners to remove themselves...
authorWaqas Hussain <waqas20@gmail.com>
Thu, 24 Feb 2011 02:11:35 +0000 (07:11 +0500)
committerWaqas Hussain <waqas20@gmail.com>
Thu, 24 Feb 2011 02:11:35 +0000 (07:11 +0500)
plugins/muc/muc.lib.lua

index c60d44aa999488cac335a36cd94323190e38b0c1..647bf9152cd705c986f9594a412a19b06cae7dda 100644 (file)
@@ -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"})