plugins/muc/muc.lib.lua
changeset 6481 413923bbd1a0
parent 6479 fb8a9873728b
child 6515 ad159be9e9d7
equal deleted inserted replaced
6480:29f979f554d3 6481:413923bbd1a0
   744 		-- You need to be at least an admin, and be requesting info about your affifiliation or lower
   744 		-- You need to be at least an admin, and be requesting info about your affifiliation or lower
   745 		-- e.g. an admin can't ask for a list of owners
   745 		-- e.g. an admin can't ask for a list of owners
   746 		local affiliation_rank = valid_affiliations[affiliation];
   746 		local affiliation_rank = valid_affiliations[affiliation];
   747 		if affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank then
   747 		if affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank then
   748 			local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin");
   748 			local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin");
   749 			for jid, affiliation in pairs(self._affiliations) do
   749 			for jid in self:each_affiliation(_aff or "none") do
   750 				if affiliation == _aff then
   750 				reply:tag("item", {affiliation = _aff, jid = jid}):up();
   751 					reply:tag("item", {affiliation = _aff, jid = jid}):up();
       
   752 				end
       
   753 			end
   751 			end
   754 			origin.send(reply:up());
   752 			origin.send(reply:up());
   755 			return true;
   753 			return true;
   756 		else
   754 		else
   757 			origin.send(st.error_reply(stanza, "auth", "forbidden"));
   755 			origin.send(st.error_reply(stanza, "auth", "forbidden"));
   986 	local result = self._affiliations[bare]; -- Affiliations are granted, revoked, and maintained based on the user's bare JID.
   984 	local result = self._affiliations[bare]; -- Affiliations are granted, revoked, and maintained based on the user's bare JID.
   987 	if not result and self._affiliations[host] == "outcast" then result = "outcast"; end -- host banned
   985 	if not result and self._affiliations[host] == "outcast" then result = "outcast"; end -- host banned
   988 	return result;
   986 	return result;
   989 end
   987 end
   990 
   988 
       
   989 -- Iterates over jid, affiliation pairs
       
   990 function room_mt:each_affiliation(with_affiliation)
       
   991 	if not with_affiliation then
       
   992 		return pairs(self._affiliations);
       
   993 	else
       
   994 		return function(_affiliations, jid)
       
   995 			local affiliation;
       
   996 			repeat -- Iterate until we get a match
       
   997 				jid, affiliation = next(_affiliations, jid);
       
   998 			until jid == nil or affiliation == with_affiliation
       
   999 			return jid, affiliation;
       
  1000 		end, self._affiliations, nil
       
  1001 	end
       
  1002 end
       
  1003 
   991 function room_mt:set_affiliation(actor, jid, affiliation, reason)
  1004 function room_mt:set_affiliation(actor, jid, affiliation, reason)
   992 	if not actor then return nil, "modify", "not-acceptable"; end;
  1005 	if not actor then return nil, "modify", "not-acceptable"; end;
   993 
  1006 
   994 	local node, host, resource = jid_split(jid);
  1007 	local node, host, resource = jid_split(jid);
   995 	if not host then return nil, "modify", "not-acceptable"; end
  1008 	if not host then return nil, "modify", "not-acceptable"; end
  1010 		local actor_affiliation = self:get_affiliation(actor);
  1023 		local actor_affiliation = self:get_affiliation(actor);
  1011 		if actor_affiliation == "owner" then
  1024 		if actor_affiliation == "owner" then
  1012 			if jid_bare(actor) == jid then -- self change
  1025 			if jid_bare(actor) == jid then -- self change
  1013 				-- need at least one owner
  1026 				-- need at least one owner
  1014 				local is_last = true;
  1027 				local is_last = true;
  1015 				for j, aff in pairs(self._affiliations) do if j ~= jid and aff == "owner" then is_last = false; break; end end
  1028 				for j in self:each_affiliation("owner") do
       
  1029 					if j ~= jid then is_last = false; break; end
       
  1030 				end
  1016 				if is_last then
  1031 				if is_last then
  1017 					return nil, "cancel", "conflict";
  1032 					return nil, "cancel", "conflict";
  1018 				end
  1033 				end
  1019 			end
  1034 			end
  1020 			-- owners can do anything else
  1035 			-- owners can do anything else