Software /
code /
prosody
Comparison
plugins/muc/muc.lib.lua @ 6119:c13f5d6b9b16
plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Wed, 19 Mar 2014 15:00:53 -0400 |
parent | 6118:aae3d6daa50d |
child | 6120:4520439227fc |
comparison
equal
deleted
inserted
replaced
6118:aae3d6daa50d | 6119:c13f5d6b9b16 |
---|---|
67 | 67 |
68 function room_mt:__tostring() | 68 function room_mt:__tostring() |
69 return "MUC room ("..self.jid..")"; | 69 return "MUC room ("..self.jid..")"; |
70 end | 70 end |
71 | 71 |
72 function room_mt:get_occupant_jid(real_jid) | |
73 return self._jid_nick[real_jid] | |
74 end | |
75 | |
72 function room_mt:get_default_role(affiliation) | 76 function room_mt:get_default_role(affiliation) |
73 if affiliation == "owner" or affiliation == "admin" then | 77 if affiliation == "owner" or affiliation == "admin" then |
74 return "moderator"; | 78 return "moderator"; |
75 elseif affiliation == "member" then | 79 elseif affiliation == "member" then |
76 return "participant"; | 80 return "participant"; |
132 end | 136 end |
133 end | 137 end |
134 end | 138 end |
135 | 139 |
136 function room_mt:send_occupant_list(to) | 140 function room_mt:send_occupant_list(to) |
137 local current_nick = self._jid_nick[to]; | 141 local current_nick = self:get_occupant_jid(to); |
138 for occupant, o_data in pairs(self._occupants) do | 142 for occupant, o_data in pairs(self._occupants) do |
139 if occupant ~= current_nick then | 143 if occupant ~= current_nick then |
140 local pres = get_filtered_presence(o_data.sessions[o_data.jid]); | 144 local pres = get_filtered_presence(o_data.sessions[o_data.jid]); |
141 pres.attr.to, pres.attr.from = to, occupant; | 145 pres.attr.to, pres.attr.from = to, occupant; |
142 pres:tag("x", {xmlns='http://jabber.org/protocol/muc#user'}) | 146 pres:tag("x", {xmlns='http://jabber.org/protocol/muc#user'}) |
381 return self._data.whois; | 385 return self._data.whois; |
382 end | 386 end |
383 | 387 |
384 function room_mt:handle_unavailable_to_occupant(origin, stanza) | 388 function room_mt:handle_unavailable_to_occupant(origin, stanza) |
385 local from = stanza.attr.from; | 389 local from = stanza.attr.from; |
386 local current_nick = self._jid_nick[from]; | 390 local current_nick = self:get_occupant_jid(from); |
387 if not current_nick then | 391 if not current_nick then |
388 return true; -- discard | 392 return true; -- discard |
389 end | 393 end |
390 local pr = get_filtered_presence(stanza); | 394 local pr = get_filtered_presence(stanza); |
391 pr.attr.from = current_nick; | 395 pr.attr.from = current_nick; |
512 end | 516 end |
513 end | 517 end |
514 | 518 |
515 function room_mt:handle_available_to_occupant(origin, stanza) | 519 function room_mt:handle_available_to_occupant(origin, stanza) |
516 local from, to = stanza.attr.from, stanza.attr.to; | 520 local from, to = stanza.attr.from, stanza.attr.to; |
517 local current_nick = self._jid_nick[from]; | 521 local current_nick = self:get_occupant_jid(from); |
518 if current_nick then | 522 if current_nick then |
519 --if #pr == #stanza or current_nick ~= to then -- commented because google keeps resending directed presence | 523 --if #pr == #stanza or current_nick ~= to then -- commented because google keeps resending directed presence |
520 if current_nick == to then -- simple presence | 524 if current_nick == to then -- simple presence |
521 return self:handle_occupant_presence(origin, stanza) | 525 return self:handle_occupant_presence(origin, stanza) |
522 else -- change nick | 526 else -- change nick |
574 | 578 |
575 function room_mt:handle_iq_to_occupant(origin, stanza) | 579 function room_mt:handle_iq_to_occupant(origin, stanza) |
576 local from, to = stanza.attr.from, stanza.attr.to; | 580 local from, to = stanza.attr.from, stanza.attr.to; |
577 local type = stanza.attr.type; | 581 local type = stanza.attr.type; |
578 local id = stanza.attr.id; | 582 local id = stanza.attr.id; |
579 local current_nick = self._jid_nick[from]; | 583 local current_nick = self:get_occupant_jid(from); |
580 local o_data = self._occupants[to]; | 584 local o_data = self._occupants[to]; |
581 if (type == "error" or type == "result") then | 585 if (type == "error" or type == "result") then |
582 do -- deconstruct_stanza_id | 586 do -- deconstruct_stanza_id |
583 if not current_nick or not o_data then return nil; end | 587 if not current_nick or not o_data then return nil; end |
584 local from_jid, id, to_jid_hash = (base64.decode(stanza.attr.id) or ""):match("^(.+)%z(.*)%z(.+)$"); | 588 local from_jid, id, to_jid_hash = (base64.decode(stanza.attr.id) or ""):match("^(.+)%z(.*)%z(.+)$"); |
620 end | 624 end |
621 end | 625 end |
622 | 626 |
623 function room_mt:handle_message_to_occupant(origin, stanza) | 627 function room_mt:handle_message_to_occupant(origin, stanza) |
624 local from, to = stanza.attr.from, stanza.attr.to; | 628 local from, to = stanza.attr.from, stanza.attr.to; |
625 local current_nick = self._jid_nick[from]; | 629 local current_nick = self:get_occupant_jid(from); |
626 local type = stanza.attr.type; | 630 local type = stanza.attr.type; |
627 if not current_nick then -- not in room | 631 if not current_nick then -- not in room |
628 if type ~= "error" then | 632 if type ~= "error" then |
629 origin.send(st.error_reply(stanza, "cancel", "not-acceptable")); | 633 origin.send(st.error_reply(stanza, "cancel", "not-acceptable")); |
630 end | 634 end |
834 end | 838 end |
835 if not item.attr.jid and item.attr.nick then -- COMPAT Workaround for Miranda sending 'nick' instead of 'jid' when changing affiliation | 839 if not item.attr.jid and item.attr.nick then -- COMPAT Workaround for Miranda sending 'nick' instead of 'jid' when changing affiliation |
836 local occupant = self._occupants[self.jid.."/"..item.attr.nick]; | 840 local occupant = self._occupants[self.jid.."/"..item.attr.nick]; |
837 if occupant then item.attr.jid = occupant.jid; end | 841 if occupant then item.attr.jid = occupant.jid; end |
838 elseif not item.attr.nick and item.attr.jid then | 842 elseif not item.attr.nick and item.attr.jid then |
839 local nick = self._jid_nick[item.attr.jid]; | 843 local nick = self:get_occupant_jid(item.attr.jid); |
840 if nick then item.attr.nick = select(3, jid_split(nick)); end | 844 if nick then item.attr.nick = select(3, jid_split(nick)); end |
841 end | 845 end |
842 local actor = stanza.attr.from; | 846 local actor = stanza.attr.from; |
843 local callback = function() origin.send(st.reply(stanza)); end | 847 local callback = function() origin.send(st.reply(stanza)); end |
844 local reason = item:get_child_text("reason"); | 848 local reason = item:get_child_text("reason"); |
857 end | 861 end |
858 | 862 |
859 function room_mt:handle_admin_item_get_command(origin, stanza) | 863 function room_mt:handle_admin_item_get_command(origin, stanza) |
860 local actor = stanza.attr.from; | 864 local actor = stanza.attr.from; |
861 local affiliation = self:get_affiliation(actor); | 865 local affiliation = self:get_affiliation(actor); |
862 local current_nick = self._jid_nick[actor]; | 866 local current_nick = self:get_occupant_jid(actor); |
863 local role = current_nick and self._occupants[current_nick].role or self:get_default_role(affiliation); | 867 local role = current_nick and self._occupants[current_nick].role or self:get_default_role(affiliation); |
864 local item = stanza.tags[1].tags[1]; | 868 local item = stanza.tags[1].tags[1]; |
865 local _aff = item.attr.affiliation; | 869 local _aff = item.attr.affiliation; |
866 local _rol = item.attr.role; | 870 local _rol = item.attr.role; |
867 if _aff and not _rol then | 871 if _aff and not _rol then |
937 end | 941 end |
938 end | 942 end |
939 | 943 |
940 function room_mt:handle_groupchat_to_room(origin, stanza) | 944 function room_mt:handle_groupchat_to_room(origin, stanza) |
941 local from = stanza.attr.from; | 945 local from = stanza.attr.from; |
942 local current_nick = self._jid_nick[from]; | 946 local current_nick = self:get_occupant_jid(from); |
943 local occupant = self._occupants[current_nick]; | 947 local occupant = self._occupants[current_nick]; |
944 if not occupant then -- not in room | 948 if not occupant then -- not in room |
945 origin.send(st.error_reply(stanza, "cancel", "not-acceptable")); | 949 origin.send(st.error_reply(stanza, "cancel", "not-acceptable")); |
946 return true; | 950 return true; |
947 elseif occupant.role == "visitor" then | 951 elseif occupant.role == "visitor" then |
967 end | 971 end |
968 end | 972 end |
969 | 973 |
970 -- hack - some buggy clients send presence updates to the room rather than their nick | 974 -- hack - some buggy clients send presence updates to the room rather than their nick |
971 function room_mt:handle_presence_to_room(origin, stanza) | 975 function room_mt:handle_presence_to_room(origin, stanza) |
972 local current_nick = self._jid_nick[stanza.attr.from]; | 976 local current_nick = self:get_occupant_jid(stanza.attr.from); |
973 local handled | 977 local handled |
974 if current_nick then | 978 if current_nick then |
975 local to = stanza.attr.to; | 979 local to = stanza.attr.to; |
976 stanza.attr.to = current_nick; | 980 stanza.attr.to = current_nick; |
977 handled = self:handle_presence_to_occupant(origin, stanza); | 981 handled = self:handle_presence_to_occupant(origin, stanza); |
980 return handled; | 984 return handled; |
981 end | 985 end |
982 | 986 |
983 function room_mt:handle_mediated_invite(origin, stanza, payload) | 987 function room_mt:handle_mediated_invite(origin, stanza, payload) |
984 local _from, _to = stanza.attr.from, stanza.attr.to; | 988 local _from, _to = stanza.attr.from, stanza.attr.to; |
985 if not self._jid_nick[_from] then -- Should be in room to send invite TODO: allow admins to send at any time | 989 local current_nick = self:get_occupant_jid(_from) |
990 if not current_nick then -- Should be in room to send invite TODO: allow admins to send at any time | |
986 origin.send(st.error_reply(stanza, "auth", "forbidden")); | 991 origin.send(st.error_reply(stanza, "auth", "forbidden")); |
987 return true; | 992 return true; |
988 end | 993 end |
989 local _invitee = jid_prep(payload.attr.to); | 994 local _invitee = jid_prep(payload.attr.to); |
990 if _invitee then | 995 if _invitee then |
1005 :tag('body') -- Add a plain message for clients which don't support invites | 1010 :tag('body') -- Add a plain message for clients which don't support invites |
1006 :text(_from..' invited you to the room '.._to..(_reason and (' ('.._reason..')') or "")) | 1011 :text(_from..' invited you to the room '.._to..(_reason and (' ('.._reason..')') or "")) |
1007 :up(); | 1012 :up(); |
1008 if self:get_members_only() and not self:get_affiliation(_invitee) then | 1013 if self:get_members_only() and not self:get_affiliation(_invitee) then |
1009 log("debug", "%s invited %s into members only room %s, granting membership", _from, _invitee, _to); | 1014 log("debug", "%s invited %s into members only room %s, granting membership", _from, _invitee, _to); |
1010 self:set_affiliation(_from, _invitee, "member", nil, "Invited by " .. self._jid_nick[_from]) | 1015 self:set_affiliation(_from, _invitee, "member", nil, "Invited by " .. current_nick) |
1011 end | 1016 end |
1012 self:_route_stanza(invite); | 1017 self:_route_stanza(invite); |
1013 return true; | 1018 return true; |
1014 else | 1019 else |
1015 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); | 1020 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); |
1155 local occupant = self._occupants[occupant_jid]; | 1160 local occupant = self._occupants[occupant_jid]; |
1156 if not occupant or not actor_jid then return nil, "modify", "not-acceptable"; end | 1161 if not occupant or not actor_jid then return nil, "modify", "not-acceptable"; end |
1157 | 1162 |
1158 if actor_jid == true then return true; end | 1163 if actor_jid == true then return true; end |
1159 | 1164 |
1160 local actor = self._occupants[self._jid_nick[actor_jid]]; | 1165 local actor = self._occupants[self:get_occupant_jid(actor_jid)]; |
1161 if actor.role == "moderator" then | 1166 if actor.role == "moderator" then |
1162 if occupant.affiliation ~= "owner" and occupant.affiliation ~= "admin" then | 1167 if occupant.affiliation ~= "owner" and occupant.affiliation ~= "admin" then |
1163 if actor.affiliation == "owner" or actor.affiliation == "admin" then | 1168 if actor.affiliation == "owner" or actor.affiliation == "admin" then |
1164 return true; | 1169 return true; |
1165 elseif occupant.role ~= "moderator" and role ~= "moderator" then | 1170 elseif occupant.role ~= "moderator" and role ~= "moderator" then |
1210 end | 1215 end |
1211 | 1216 |
1212 function room_mt:_route_stanza(stanza) | 1217 function room_mt:_route_stanza(stanza) |
1213 local muc_child; | 1218 local muc_child; |
1214 if stanza.name == "presence" then | 1219 if stanza.name == "presence" then |
1215 local to_occupant = self._occupants[self._jid_nick[stanza.attr.to]]; | 1220 local to_occupant = self._occupants[self:get_occupant_jid(stanza.attr.to)]; |
1216 local from_occupant = self._occupants[stanza.attr.from]; | 1221 local from_occupant = self._occupants[stanza.attr.from]; |
1217 if to_occupant and from_occupant then | 1222 if to_occupant and from_occupant then |
1218 if self:get_whois() == 'anyone' then | 1223 if self:get_whois() == 'anyone' then |
1219 muc_child = stanza:get_child("x", "http://jabber.org/protocol/muc#user"); | 1224 muc_child = stanza:get_child("x", "http://jabber.org/protocol/muc#user"); |
1220 else | 1225 else |