Software /
code /
prosody
Comparison
plugins/muc/muc.lib.lua @ 2845:f76139aa7cd5
MUC: muc.lib.lua: Fix the sending of the occupant JID instead of the nick in role lists and presence broadcasts after role changes (thanks teo)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Sat, 30 Jan 2010 18:51:07 +0000 |
parent | 2819:49e9a8d57981 |
child | 2864:1ce0e2ceb419 |
comparison
equal
deleted
inserted
replaced
2844:0e4f6df8b2a3 | 2845:f76139aa7cd5 |
---|---|
492 elseif _rol and not _aff then | 492 elseif _rol and not _aff then |
493 if role == "moderator" then | 493 if role == "moderator" then |
494 -- TODO allow admins and owners not in room? Provide read-only access to everyone who can see the participants anyway? | 494 -- TODO allow admins and owners not in room? Provide read-only access to everyone who can see the participants anyway? |
495 if _rol == "none" then _rol = nil; end | 495 if _rol == "none" then _rol = nil; end |
496 local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin"); | 496 local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin"); |
497 for nick, occupant in pairs(self._occupants) do | 497 for occupant_jid, occupant in pairs(self._occupants) do |
498 if occupant.role == _rol then | 498 if occupant.role == _rol then |
499 reply:tag("item", {nick = nick, role = _rol or "none", affiliation = occupant.affiliation or "none", jid = occupant.jid}):up(); | 499 reply:tag("item", { |
500 nick = select(3, jid_split(occupant_jid)), | |
501 role = _rol or "none", | |
502 affiliation = occupant.affiliation or "none", | |
503 jid = occupant.jid | |
504 }):up(); | |
500 end | 505 end |
501 end | 506 end |
502 origin.send(reply); | 507 origin.send(reply); |
503 else | 508 else |
504 origin.send(st.error_reply(stanza, "auth", "forbidden")); | 509 origin.send(st.error_reply(stanza, "auth", "forbidden")); |
660 | 665 |
661 function room_mt:get_role(nick) | 666 function room_mt:get_role(nick) |
662 local session = self._occupants[nick]; | 667 local session = self._occupants[nick]; |
663 return session and session.role or nil; | 668 return session and session.role or nil; |
664 end | 669 end |
665 function room_mt:set_role(actor, nick, role, callback, reason) | 670 function room_mt:set_role(actor, occupant_jid, role, callback, reason) |
666 if role == "none" then role = nil; end | 671 if role == "none" then role = nil; end |
667 if role and role ~= "moderator" and role ~= "participant" and role ~= "visitor" then return nil, "modify", "not-acceptable"; end | 672 if role and role ~= "moderator" and role ~= "participant" and role ~= "visitor" then return nil, "modify", "not-acceptable"; end |
668 if self:get_affiliation(actor) ~= "owner" then return nil, "cancel", "not-allowed"; end | 673 if self:get_affiliation(actor) ~= "owner" then return nil, "cancel", "not-allowed"; end |
669 local occupant = self._occupants[nick]; | 674 local occupant = self._occupants[occupant_jid]; |
670 if not occupant then return nil, "modify", "not-acceptable"; end | 675 if not occupant then return nil, "modify", "not-acceptable"; end |
671 if occupant.affiliation == "owner" or occupant.affiliation == "admin" then return nil, "cancel", "not-allowed"; end | 676 if occupant.affiliation == "owner" or occupant.affiliation == "admin" then return nil, "cancel", "not-allowed"; end |
672 local p = st.presence({from = nick}) | 677 local p = st.presence({from = occupant_jid}) |
673 :tag("x", {xmlns = "http://jabber.org/protocol/muc#user"}) | 678 :tag("x", {xmlns = "http://jabber.org/protocol/muc#user"}) |
674 :tag("item", {affiliation=occupant.affiliation or "none", nick=nick, role=role or "none"}) | 679 :tag("item", {affiliation=occupant.affiliation or "none", nick=select(3, jid_split(occupant_jid)), role=role or "none"}) |
675 :tag("reason"):text(reason or ""):up() | 680 :tag("reason"):text(reason or ""):up() |
676 :up(); | 681 :up(); |
677 if not role then -- kick | 682 if not role then -- kick |
678 p.attr.type = "unavailable"; | 683 p.attr.type = "unavailable"; |
679 self._occupants[nick] = nil; | 684 self._occupants[occupant_jid] = nil; |
680 for jid in pairs(occupant.sessions) do -- remove for all sessions of the nick | 685 for jid in pairs(occupant.sessions) do -- remove for all sessions of the nick |
681 self._jid_nick[jid] = nil; | 686 self._jid_nick[jid] = nil; |
682 end | 687 end |
683 p:tag("status", {code = "307"}):up(); | 688 p:tag("status", {code = "307"}):up(); |
684 else | 689 else |
687 for jid in pairs(occupant.sessions) do -- send to all sessions of the nick | 692 for jid in pairs(occupant.sessions) do -- send to all sessions of the nick |
688 p.attr.to = jid; | 693 p.attr.to = jid; |
689 self:_route_stanza(p); | 694 self:_route_stanza(p); |
690 end | 695 end |
691 if callback then callback(); end | 696 if callback then callback(); end |
692 self:broadcast_except_nick(p, nick); | 697 self:broadcast_except_nick(p, occupant_jid); |
693 return true; | 698 return true; |
694 end | 699 end |
695 | 700 |
696 function room_mt:_route_stanza(stanza) | 701 function room_mt:_route_stanza(stanza) |
697 local muc_child; | 702 local muc_child; |