From 14fe971183e5a281525827c8135965f57e15f73b Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 12 Nov 2019 12:17:42 +0100 Subject: =?UTF-8?q?Don=E2=80=99t=20treat=20presence=20updates=20as=20MUC?= =?UTF-8?q?=20joins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the user sends a directed presence to an unjoined MUC without a element, send a presence error back instead of attempting to join it again, as this is almost never what the user wants. Fixes #3415. --- src/xmpp/biboumi_component.cpp | 64 ++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 27 deletions(-) (limited to 'src/xmpp/biboumi_component.cpp') diff --git a/src/xmpp/biboumi_component.cpp b/src/xmpp/biboumi_component.cpp index 6fe6972..514b270 100644 --- a/src/xmpp/biboumi_component.cpp +++ b/src/xmpp/biboumi_component.cpp @@ -158,39 +158,49 @@ void BiboumiComponent::handle_presence(const Stanza& stanza) { const std::string own_nick = bridge->get_own_nick(iid); 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; - HistoryLimit history_limit; - if (history) - { - const auto seconds = history->get_tag("seconds"); - if (!seconds.empty()) - { - const auto now = std::chrono::system_clock::now(); - std::time_t timestamp = std::chrono::system_clock::to_time_t(now); - int int_seconds = std::atoi(seconds.data()); - timestamp -= int_seconds; - history_limit.since = utils::to_string(timestamp); - } - const auto since = history->get_tag("since"); - if (!since.empty()) - history_limit.since = since; - const auto maxstanzas = history->get_tag("maxstanzas"); - if (!maxstanzas.empty()) - history_limit.stanzas = std::atoi(maxstanzas.data()); - // Ignore any other value, because this is too complex to implement, - // so I won’t do it. - if (history->get_tag("maxchars") == "0") - history_limit.stanzas = 0; - } - bridge->join_irc_channel(iid, to.resource, password ? password->get_inner(): "", - from.resource, history_limit, x != nullptr); const IrcClient* irc = bridge->find_irc_client(iid.get_server()); if (irc) { const auto chan = irc->find_channel(iid.get_local()); if (chan->joined) bridge->send_irc_nick_change(iid, to.resource, from.resource); + else if (!x) + { // send an error if we are not joined yet, instead of treating it as a join + this->send_stanza_error("presence", from_str, to_str, id, + "modify", "not-acceptable", + "You are not joined to this MUC."); + } + } + // if there is no , this is a presence status update, we don’t care about those + if (x) + { + const XmlNode* password = x->get_child("password", MUC_NS); + const XmlNode* history = x->get_child("history", MUC_NS); + HistoryLimit history_limit; + if (history) + { + const auto seconds = history->get_tag("seconds"); + if (!seconds.empty()) + { + const auto now = std::chrono::system_clock::now(); + std::time_t timestamp = std::chrono::system_clock::to_time_t(now); + int int_seconds = std::atoi(seconds.data()); + timestamp -= int_seconds; + history_limit.since = utils::to_string(timestamp); + } + const auto since = history->get_tag("since"); + if (!since.empty()) + history_limit.since = since; + const auto maxstanzas = history->get_tag("maxstanzas"); + if (!maxstanzas.empty()) + history_limit.stanzas = std::atoi(maxstanzas.data()); + // Ignore any other value, because this is too complex to implement, + // so I won’t do it. + if (history->get_tag("maxchars") == "0") + history_limit.stanzas = 0; + } + bridge->join_irc_channel(iid, to.resource, password ? password->get_inner(): "", + from.resource, history_limit); } } else if (type == "unavailable") -- cgit v1.2.3 From 2c4ffbf25ae2647c586c9069c182444152c28622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Wed, 11 Mar 2020 15:25:38 +0100 Subject: Consider the nick change only if it is NOT a join --- src/xmpp/biboumi_component.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'src/xmpp/biboumi_component.cpp') diff --git a/src/xmpp/biboumi_component.cpp b/src/xmpp/biboumi_component.cpp index 514b270..91be091 100644 --- a/src/xmpp/biboumi_component.cpp +++ b/src/xmpp/biboumi_component.cpp @@ -159,18 +159,6 @@ void BiboumiComponent::handle_presence(const Stanza& stanza) const std::string own_nick = bridge->get_own_nick(iid); const XmlNode* x = stanza.get_child("x", MUC_NS); const IrcClient* irc = bridge->find_irc_client(iid.get_server()); - if (irc) - { - const auto chan = irc->find_channel(iid.get_local()); - if (chan->joined) - bridge->send_irc_nick_change(iid, to.resource, from.resource); - else if (!x) - { // send an error if we are not joined yet, instead of treating it as a join - this->send_stanza_error("presence", from_str, to_str, id, - "modify", "not-acceptable", - "You are not joined to this MUC."); - } - } // if there is no , this is a presence status update, we don’t care about those if (x) { @@ -202,6 +190,19 @@ void BiboumiComponent::handle_presence(const Stanza& stanza) bridge->join_irc_channel(iid, to.resource, password ? password->get_inner(): "", from.resource, history_limit); } + else + { + if (irc) + { + const auto chan = irc->find_channel(iid.get_local()); + if (chan && chan->joined) + bridge->send_irc_nick_change(iid, to.resource, from.resource); + else + { // send an error if we are not joined yet, instead of treating it as a join + this->send_stanza_error("presence", from_str, to_str, id, "modify", "not-acceptable", "You are not joined to this MUC."); + } + } + } } else if (type == "unavailable") { -- cgit v1.2.3