Mercurial > prosody-hg
comparison plugins/muc/muc.lib.lua @ 11246:ab189e707705
MUC: Reject probes from non-occupants
Also test for self-probes
| author | JC Brand <jc@opkode.com> |
|---|---|
| date | Fri, 02 Oct 2020 16:12:47 +0200 |
| parents | 43b43e7156b8 |
| children | d61ec5e6ee16 |
comparison
equal
deleted
inserted
replaced
| 11245:43b43e7156b8 | 11246:ab189e707705 |
|---|---|
| 593 } | 593 } |
| 594 module:fire_event("muc-build-occupant-presence", event); | 594 module:fire_event("muc-build-occupant-presence", event); |
| 595 return event.stanza; | 595 return event.stanza; |
| 596 end | 596 end |
| 597 | 597 |
| 598 function room_mt:respond_to_probe(origin, stanza, probing_occupant) | |
| 599 if probing_occupant == nil then | |
| 600 origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat", self.jid)); | |
| 601 return; | |
| 602 end | |
| 603 | |
| 604 local from_muc_jid = stanza.attr.to; | |
| 605 local probed_occupant = self:get_occupant_by_nick(from_muc_jid); | |
| 606 if probed_occupant == nil then | |
| 607 local to_jid = stanza.attr.from; | |
| 608 local pr = self:build_unavailable_presence(from_muc_jid, to_jid); | |
| 609 if pr then | |
| 610 self:route_stanza(pr); | |
| 611 end | |
| 612 return; | |
| 613 end | |
| 614 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}); | |
| 615 self:publicise_occupant_status(probed_occupant, x, nil, nil, nil, nil, false, probing_occupant); | |
| 616 end | |
| 617 | |
| 598 | 618 |
| 599 function room_mt:handle_normal_presence(origin, stanza) | 619 function room_mt:handle_normal_presence(origin, stanza) |
| 600 local type = stanza.attr.type; | 620 local type = stanza.attr.type; |
| 601 local real_jid = stanza.attr.from; | 621 local real_jid = stanza.attr.from; |
| 602 local bare_jid = jid_bare(real_jid); | 622 local bare_jid = jid_bare(real_jid); |
| 614 local dest_occupant; | 634 local dest_occupant; |
| 615 if type == "unavailable" then | 635 if type == "unavailable" then |
| 616 if orig_occupant == nil then return true; end -- Unavailable from someone not in the room | 636 if orig_occupant == nil then return true; end -- Unavailable from someone not in the room |
| 617 -- dest_occupant = nil | 637 -- dest_occupant = nil |
| 618 elseif type == "probe" then | 638 elseif type == "probe" then |
| 619 local occupant = self:get_occupant_by_nick(stanza.attr.to); | 639 self:respond_to_probe(origin, stanza, orig_occupant) |
| 620 if occupant == nil then | |
| 621 local from_muc_jid = stanza.attr.to; | |
| 622 local to_jid = real_jid; | |
| 623 local pr = self:build_unavailable_presence(from_muc_jid, to_jid); | |
| 624 if pr then | |
| 625 self:route_stanza(pr); | |
| 626 end | |
| 627 return true; | |
| 628 end | |
| 629 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}); | |
| 630 self:publicise_occupant_status(occupant, x, nil, nil, nil, nil, false, orig_occupant); | |
| 631 return true; | 640 return true; |
| 632 elseif orig_occupant and orig_occupant.nick == stanza.attr.to then -- Just a presence update | 641 elseif orig_occupant and orig_occupant.nick == stanza.attr.to then -- Just a presence update |
| 633 log("debug", "presence update for %s from session %s", orig_occupant.nick, real_jid); | 642 log("debug", "presence update for %s from session %s", orig_occupant.nick, real_jid); |
| 634 dest_occupant = orig_occupant; | 643 dest_occupant = orig_occupant; |
| 635 else | 644 else |
