diff options
author | louiz’ <louiz@louiz.org> | 2018-03-23 21:17:44 +0100 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2018-03-23 21:18:52 +0100 |
commit | d81a9456ac33d7be8e494a6e7af01b45b8fa2478 (patch) | |
tree | 0a72eed2af858e91b91bab2ad9921b083e3d9724 | |
parent | e2fc3cf68e1dc145e75fe67f2543765ff00ba839 (diff) | |
download | biboumi-d81a9456ac33d7be8e494a6e7af01b45b8fa2478.tar.gz biboumi-d81a9456ac33d7be8e494a6e7af01b45b8fa2478.tar.bz2 biboumi-d81a9456ac33d7be8e494a6e7af01b45b8fa2478.tar.xz biboumi-d81a9456ac33d7be8e494a6e7af01b45b8fa2478.zip |
Change the nick of the joining user AFTER sending all the join stuff
fix #3305
-rw-r--r-- | src/xmpp/biboumi_component.cpp | 4 | ||||
-rw-r--r-- | tests/end_to_end/__main__.py | 15 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/xmpp/biboumi_component.cpp b/src/xmpp/biboumi_component.cpp index 02383f6..26e8035 100644 --- a/src/xmpp/biboumi_component.cpp +++ b/src/xmpp/biboumi_component.cpp @@ -152,8 +152,6 @@ void BiboumiComponent::handle_presence(const Stanza& stanza) if (type.empty()) { const std::string own_nick = bridge->get_own_nick(iid); - if (!own_nick.empty() && own_nick != to.resource) - bridge->send_irc_nick_change(iid, to.resource, from.resource); const XmlNode* x = stanza.get_child("x", MUC_NS); const XmlNode* password = x ? x->get_child("password", MUC_NS): nullptr; const XmlNode* history = x ? x->get_child("history", MUC_NS): nullptr; @@ -182,6 +180,8 @@ void BiboumiComponent::handle_presence(const Stanza& stanza) } bridge->join_irc_channel(iid, to.resource, password ? password->get_inner(): "", from.resource, history_limit, x != nullptr); + if (!own_nick.empty() && own_nick != to.resource) + bridge->send_irc_nick_change(iid, to.resource, from.resource); } else if (type == "unavailable") { diff --git a/tests/end_to_end/__main__.py b/tests/end_to_end/__main__.py index 60a9db6..620a2bd 100644 --- a/tests/end_to_end/__main__.py +++ b/tests/end_to_end/__main__.py @@ -736,9 +736,9 @@ if __name__ == '__main__': # Here we simulate a desynchronization of a client: The client thinks it’s # disconnected from the room, but biboumi still thinks it’s in the room. The # client thus sends a join presence, and biboumi should send everything - # (user list, history, etc) in response + # (user list, history, etc) in response. partial(send_stanza, - "<presence from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}/{nick_one}'><x xmlns='http://jabber.org/protocol/muc'/></presence>"), + "<presence from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}/{nick_three}'><x xmlns='http://jabber.org/protocol/muc'/></presence>"), partial(expect_unordered, [ ("/presence[@to='{jid_one}/{resource_one}'][@from='#foo%{irc_server_one}/{nick_two}']/muc_user:x/muc_user:item[@affiliation='none'][@role='participant'][@jid='~bobby@localhost']",), @@ -746,6 +746,17 @@ if __name__ == '__main__': "/presence/muc_user:x/muc_user:status[@code='110']",), ("/message[@from='#foo%{irc_server_one}'][@type='groupchat']/subject[not(text())]",), ]), + # And also, that was not the same nickname + partial(expect_unordered, [ + ("/presence[@from='#foo%{irc_server_one}/{nick_one}'][@to='{jid_two}/{resource_one}'][@type='unavailable']/muc_user:x/muc_user:item[@nick='Bernard']", + "/presence/muc_user:x/muc_user:status[@code='303']"), + ("/presence[@from='#foo%{irc_server_one}/{nick_three}'][@to='{jid_two}/{resource_one}']",), + ("/presence[@from='#foo%{irc_server_one}/{nick_one}'][@to='{jid_one}/{resource_one}'][@type='unavailable']/muc_user:x/muc_user:item[@nick='Bernard']", + "/presence/muc_user:x/muc_user:status[@code='303']", + "/presence/muc_user:x/muc_user:status[@code='110']"), + ("/presence[@from='#foo%{irc_server_one}/{nick_three}'][@to='{jid_one}/{resource_one}']", + "/presence/muc_user:x/muc_user:status[@code='110']"), + ]), ]), Scenario("channel_join_with_password", [ |