plugins/muc/muc.lib.lua
changeset 13419 f34b33cb1383
parent 12981 74b9e05af71e
equal deleted inserted replaced
13418:d54364746a7c 13419:f34b33cb1383
  1077 	end
  1077 	end
  1078 	local actor = stanza.attr.from;
  1078 	local actor = stanza.attr.from;
  1079 	local reason = item:get_child_text("reason");
  1079 	local reason = item:get_child_text("reason");
  1080 	local success, errtype, err
  1080 	local success, errtype, err
  1081 	if item.attr.affiliation and item.attr.jid and not item.attr.role then
  1081 	if item.attr.affiliation and item.attr.jid and not item.attr.role then
  1082 		local registration_data;
  1082 		local registration_data = self:get_affiliation_data(item.attr.jid) or {};
       
  1083 		if reason then
       
  1084 			registration_data.reason = reason;
       
  1085 		end
  1083 		if item.attr.nick then
  1086 		if item.attr.nick then
  1084 			local room_nick = self.jid.."/"..item.attr.nick;
  1087 			local room_nick = self.jid.."/"..item.attr.nick;
  1085 			local existing_occupant = self:get_occupant_by_nick(room_nick);
  1088 			local existing_occupant = self:get_occupant_by_nick(room_nick);
  1086 			if existing_occupant and existing_occupant.bare_jid ~= item.attr.jid then
  1089 			if existing_occupant and existing_occupant.bare_jid ~= item.attr.jid then
  1087 				module:log("debug", "Existing occupant for %s: %s does not match %s", room_nick, existing_occupant.bare_jid, item.attr.jid);
  1090 				module:log("debug", "Existing occupant for %s: %s does not match %s", room_nick, existing_occupant.bare_jid, item.attr.jid);
  1088 				self:set_role(true, room_nick, nil, "This nickname is reserved");
  1091 				self:set_role(true, room_nick, nil, "This nickname is reserved");
  1089 			end
  1092 			end
  1090 			module:log("debug", "Reserving %s for %s (%s)", item.attr.nick, item.attr.jid, item.attr.affiliation);
  1093 			module:log("debug", "Reserving %s for %s (%s)", item.attr.nick, item.attr.jid, item.attr.affiliation);
  1091 			registration_data = { reserved_nickname = item.attr.nick };
  1094 			registration_data.reserved_nickname = item.attr.nick;
  1092 		end
  1095 		end
  1093 		success, errtype, err = self:set_affiliation(actor, item.attr.jid, item.attr.affiliation, reason, registration_data);
  1096 		success, errtype, err = self:set_affiliation(actor, item.attr.jid, item.attr.affiliation, reason, registration_data);
  1094 	elseif item.attr.role and item.attr.nick and not item.attr.affiliation then
  1097 	elseif item.attr.role and item.attr.nick and not item.attr.affiliation then
  1095 		success, errtype, err = self:set_role(actor, self.jid.."/"..item.attr.nick, item.attr.role, reason);
  1098 		success, errtype, err = self:set_role(actor, self.jid.."/"..item.attr.nick, item.attr.role, reason);
  1096 	else
  1099 	else
  1117 		-- e.g. an admin can't ask for a list of owners
  1120 		-- e.g. an admin can't ask for a list of owners
  1118 		local affiliation_rank = valid_affiliations[affiliation or "none"];
  1121 		local affiliation_rank = valid_affiliations[affiliation or "none"];
  1119 		if (affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank)
  1122 		if (affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank)
  1120 		or (self:get_members_only() and self:get_whois() == "anyone" and affiliation_rank >= valid_affiliations.member) then
  1123 		or (self:get_members_only() and self:get_whois() == "anyone" and affiliation_rank >= valid_affiliations.member) then
  1121 			local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin");
  1124 			local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin");
  1122 			for jid in self:each_affiliation(_aff or "none") do
  1125 			for jid, _, data in self:each_affiliation(_aff or "none") do
  1123 				local nick = self:get_registered_nick(jid);
  1126 				local nick = self:get_registered_nick(jid);
  1124 				reply:tag("item", {affiliation = _aff, jid = jid, nick = nick }):up();
  1127 				reply:tag("item", {affiliation = _aff, jid = jid, nick = nick });
       
  1128 				if data and data.reason then
       
  1129 					reply:text_tag("reason", data.reason);
       
  1130 				end
       
  1131 				reply:up();
  1125 			end
  1132 			end
  1126 			origin.send(reply:up());
  1133 			origin.send(reply:up());
  1127 			return true;
  1134 			return true;
  1128 		else
  1135 		else
  1129 			origin.send(st.error_reply(stanza, "auth", "forbidden"));
  1136 			origin.send(st.error_reply(stanza, "auth", "forbidden"));