Comparison

plugins/muc/muc.lib.lua @ 13415:f34b33cb1383

MUC: Record reason for affiliation changes and return in list (fixes #1227)
author Kim Alvefur <zash@zash.se>
date Sun, 08 Aug 2021 18:07:17 +0200
parent 12977:74b9e05af71e
child 13560:ccf389f54a93
comparison
equal deleted inserted replaced
13414:d54364746a7c 13415: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"));