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 |