Mercurial > prosody-hg
comparison plugins/muc/muc.lib.lua @ 10449:2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 25 Nov 2019 23:52:45 +0100 |
| parents | 8f709577fe8e |
| children | 347d16d70280 |
comparison
equal
deleted
inserted
replaced
| 10448:cbe524ed1a6a | 10449:2e36a54906e4 |
|---|---|
| 420 -- check if user is banned | 420 -- check if user is banned |
| 421 module:hook("muc-occupant-pre-join", function(event) | 421 module:hook("muc-occupant-pre-join", function(event) |
| 422 local room, stanza = event.room, event.stanza; | 422 local room, stanza = event.room, event.stanza; |
| 423 local affiliation = room:get_affiliation(stanza.attr.from); | 423 local affiliation = room:get_affiliation(stanza.attr.from); |
| 424 if affiliation == "outcast" then | 424 if affiliation == "outcast" then |
| 425 local reply = st.error_reply(stanza, "auth", "forbidden"):up(); | 425 local reply = st.error_reply(stanza, "auth", "forbidden", nil, room.jid):up(); |
| 426 reply.tags[1].attr.code = "403"; | 426 reply.tags[1].attr.code = "403"; |
| 427 event.origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); | 427 event.origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); |
| 428 return true; | 428 return true; |
| 429 end | 429 end |
| 430 end, -10); | 430 end, -10); |
| 431 | 431 |
| 432 module:hook("muc-occupant-pre-join", function(event) | 432 module:hook("muc-occupant-pre-join", function(event) |
| 433 local room = event.room; | |
| 433 local nick = jid_resource(event.occupant.nick); | 434 local nick = jid_resource(event.occupant.nick); |
| 434 if not nick:find("%S") then | 435 if not nick:find("%S") then |
| 435 event.origin.send(st.error_reply(event.stanza, "modify", "not-allowed", "Invisible Nicknames are forbidden")); | 436 event.origin.send(st.error_reply(event.stanza, "modify", "not-allowed", "Invisible Nicknames are forbidden", room.jid)); |
| 436 return true; | 437 return true; |
| 437 end | 438 end |
| 438 end, 1); | 439 end, 1); |
| 439 | 440 |
| 440 module:hook("muc-occupant-pre-change", function(event) | 441 module:hook("muc-occupant-pre-change", function(event) |
| 442 local room = event.room; | |
| 441 if not jid_resource(event.dest_occupant.nick):find("%S") then | 443 if not jid_resource(event.dest_occupant.nick):find("%S") then |
| 442 event.origin.send(st.error_reply(event.stanza, "modify", "not-allowed", "Invisible Nicknames are forbidden")); | 444 event.origin.send(st.error_reply(event.stanza, "modify", "not-allowed", "Invisible Nicknames are forbidden", room.jid)); |
| 443 return true; | 445 return true; |
| 444 end | 446 end |
| 445 end, 1); | 447 end, 1); |
| 446 | 448 |
| 447 module:hook("muc-occupant-pre-join", function(event) | 449 module:hook("muc-occupant-pre-join", function(event) |
| 450 local room = event.room; | |
| 448 local nick = jid_resource(event.occupant.nick); | 451 local nick = jid_resource(event.occupant.nick); |
| 449 if not resourceprep(nick, true) then -- strict | 452 if not resourceprep(nick, true) then -- strict |
| 450 event.origin.send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation")); | 453 event.origin.send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid)); |
| 451 return true; | 454 return true; |
| 452 end | 455 end |
| 453 end, 2); | 456 end, 2); |
| 454 | 457 |
| 455 module:hook("muc-occupant-pre-change", function(event) | 458 module:hook("muc-occupant-pre-change", function(event) |
| 456 local nick = jid_resource(event.dest_occupant.nick); | 459 local nick = jid_resource(event.dest_occupant.nick); |
| 457 if not resourceprep(nick, true) then -- strict | 460 if not resourceprep(nick, true) then -- strict |
| 458 event.origin.send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation")); | 461 event.origin.send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid)); |
| 459 return true; | 462 return true; |
| 460 end | 463 end |
| 461 end, 2); | 464 end, 2); |
| 462 | 465 |
| 463 function room_mt:handle_first_presence(origin, stanza) | 466 function room_mt:handle_first_presence(origin, stanza) |
| 528 local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc"); | 531 local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc"); |
| 529 | 532 |
| 530 if orig_occupant == nil and not muc_x and stanza.attr.type == nil then | 533 if orig_occupant == nil and not muc_x and stanza.attr.type == nil then |
| 531 module:log("debug", "Attempted join without <x>, possibly desynced"); | 534 module:log("debug", "Attempted join without <x>, possibly desynced"); |
| 532 origin.send(st.error_reply(stanza, "cancel", "item-not-found", | 535 origin.send(st.error_reply(stanza, "cancel", "item-not-found", |
| 533 "You are not currently connected to this chat")); | 536 "You are not currently connected to this chat", self.jid)); |
| 534 return true; | 537 return true; |
| 535 end | 538 end |
| 536 | 539 |
| 537 local is_first_dest_session; | 540 local is_first_dest_session; |
| 538 local dest_occupant; | 541 local dest_occupant; |
| 590 -- Check for nick conflicts | 593 -- Check for nick conflicts |
| 591 if dest_occupant ~= nil and not is_first_dest_session | 594 if dest_occupant ~= nil and not is_first_dest_session |
| 592 and bare_jid ~= jid_bare(dest_occupant.bare_jid) then | 595 and bare_jid ~= jid_bare(dest_occupant.bare_jid) then |
| 593 -- new nick or has different bare real jid | 596 -- new nick or has different bare real jid |
| 594 log("debug", "%s couldn't join due to nick conflict: %s", real_jid, dest_occupant.nick); | 597 log("debug", "%s couldn't join due to nick conflict: %s", real_jid, dest_occupant.nick); |
| 595 local reply = st.error_reply(stanza, "cancel", "conflict"):up(); | 598 local reply = st.error_reply(stanza, "cancel", "conflict", nil, self.jid):up(); |
| 596 reply.tags[1].attr.code = "409"; | 599 reply.tags[1].attr.code = "409"; |
| 597 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); | 600 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); |
| 598 return true; | 601 return true; |
| 599 end | 602 end |
| 600 | 603 |
| 719 return self:handle_kickable(origin, stanza) | 722 return self:handle_kickable(origin, stanza) |
| 720 elseif type == nil or type == "unavailable" then | 723 elseif type == nil or type == "unavailable" then |
| 721 return self:handle_normal_presence(origin, stanza); | 724 return self:handle_normal_presence(origin, stanza); |
| 722 elseif type ~= 'result' then -- bad type | 725 elseif type ~= 'result' then -- bad type |
| 723 if type ~= 'visible' and type ~= 'invisible' then -- COMPAT ejabberd can broadcast or forward XEP-0018 presences | 726 if type ~= 'visible' and type ~= 'invisible' then -- COMPAT ejabberd can broadcast or forward XEP-0018 presences |
| 724 origin.send(st.error_reply(stanza, "modify", "bad-request")); -- FIXME correct error? | 727 origin.send(st.error_reply(stanza, "modify", "bad-request", nil, self.jid)); -- FIXME correct error? |
| 725 end | 728 end |
| 726 end | 729 end |
| 727 return true; | 730 return true; |
| 728 end | 731 end |
| 729 | 732 |
| 754 stanza.attr.from, stanza.attr.to, stanza.attr.id = from, to, id; | 757 stanza.attr.from, stanza.attr.to, stanza.attr.id = from, to, id; |
| 755 return true; | 758 return true; |
| 756 else -- Type is "get" or "set" | 759 else -- Type is "get" or "set" |
| 757 local current_nick = self:get_occupant_jid(from); | 760 local current_nick = self:get_occupant_jid(from); |
| 758 if not current_nick then | 761 if not current_nick then |
| 759 origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat")); | 762 origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat", self.jid)); |
| 760 return true; | 763 return true; |
| 761 end | 764 end |
| 762 if not occupant then -- recipient not in room | 765 if not occupant then -- recipient not in room |
| 763 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room")); | 766 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room", self.jid)); |
| 764 return true; | 767 return true; |
| 765 end | 768 end |
| 766 -- XEP-0410 MUC Self-Ping #1220 | 769 -- XEP-0410 MUC Self-Ping #1220 |
| 767 if to == current_nick and stanza.attr.type == "get" and stanza:get_child("ping", "urn:xmpp:ping") then | 770 if to == current_nick and stanza.attr.type == "get" and stanza:get_child("ping", "urn:xmpp:ping") then |
| 768 self:route_stanza(st.reply(stanza)); | 771 self:route_stanza(st.reply(stanza)); |
| 787 local from, to = stanza.attr.from, stanza.attr.to; | 790 local from, to = stanza.attr.from, stanza.attr.to; |
| 788 local current_nick = self:get_occupant_jid(from); | 791 local current_nick = self:get_occupant_jid(from); |
| 789 local type = stanza.attr.type; | 792 local type = stanza.attr.type; |
| 790 if not current_nick then -- not in room | 793 if not current_nick then -- not in room |
| 791 if type ~= "error" then | 794 if type ~= "error" then |
| 792 origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat")); | 795 origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat", self.jid)); |
| 793 end | 796 end |
| 794 return true; | 797 return true; |
| 795 end | 798 end |
| 796 if type == "groupchat" then -- groupchat messages not allowed in PM | 799 if type == "groupchat" then -- groupchat messages not allowed in PM |
| 797 origin.send(st.error_reply(stanza, "modify", "bad-request")); | 800 origin.send(st.error_reply(stanza, "modify", "bad-request", nil, self.jid)); |
| 798 return true; | 801 return true; |
| 799 elseif type == "error" and is_kickable_error(stanza) then | 802 elseif type == "error" and is_kickable_error(stanza) then |
| 800 log("debug", "%s kicked from %s for sending an error message", current_nick, self.jid); | 803 log("debug", "%s kicked from %s for sending an error message", current_nick, self.jid); |
| 801 return self:handle_kickable(origin, stanza); -- send unavailable | 804 return self:handle_kickable(origin, stanza); -- send unavailable |
| 802 end | 805 end |
| 803 | 806 |
| 804 local o_data = self:get_occupant_by_nick(to); | 807 local o_data = self:get_occupant_by_nick(to); |
| 805 if not o_data then | 808 if not o_data then |
| 806 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room")); | 809 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room", self.jid)); |
| 807 return true; | 810 return true; |
| 808 end | 811 end |
| 809 log("debug", "%s sent private message stanza to %s (%s)", from, to, o_data.jid); | 812 log("debug", "%s sent private message stanza to %s (%s)", from, to, o_data.jid); |
| 810 stanza = muc_util.filter_muc_x(st.clone(stanza)); | 813 stanza = muc_util.filter_muc_x(st.clone(stanza)); |
| 811 stanza:tag("x", { xmlns = "http://jabber.org/protocol/muc#user" }):up(); | 814 stanza:tag("x", { xmlns = "http://jabber.org/protocol/muc#user" }):up(); |
