~singpolyma/biboumi

407f95a108c275db5e9b07398f553ab573cd46bc — louiz’ 7 years ago 24f2511
Do not reply with an error when receiving a presence for a user JID

fix #3224
M src/xmpp/biboumi_component.cpp => src/xmpp/biboumi_component.cpp +2 -5
@@ 210,11 210,8 @@ void BiboumiComponent::handle_presence(const Stanza& stanza)
            this->send_presence_to_contact(to_str, from.bare(), "");
        }
    }
  else
    {
      // A user wants to join an invalid IRC channel, return a presence error to him/her
      if (type.empty())
        this->send_invalid_room_error(to.local, to.resource, from_str);
  else if (iid.type == Iid::Type::User)
    { // Do nothing yet
    }
  }
  catch (const IRCNotConnected& ex)

M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +0 -30
@@ 261,7 261,6 @@ void XmppComponent::handle_error(const Stanza& stanza)
  if (!this->ever_auth)
    sd_notifyf(0, "STATUS=Failed to authenticate to the XMPP server: %s", error_message.data());
#endif

}

void* XmppComponent::get_receive_buffer(const size_t size) const


@@ 338,35 337,6 @@ void XmppComponent::send_user_join(const std::string& from,
  this->send_stanza(presence);
}

void XmppComponent::send_invalid_room_error(const std::string& muc_name,
                                            const std::string& nick,
                                            const std::string& to)
{
  Stanza presence("presence");
  {
    if (!muc_name.empty ())
      presence["from"] = muc_name + "@" + this->served_hostname + "/" + nick;
    else
      presence["from"] = this->served_hostname;
    presence["to"] = to;
    presence["type"] = "error";
    XmlSubNode x(presence, "x");
    x["xmlns"] = MUC_NS;
    XmlSubNode error(presence, "error");
    error["by"] = muc_name + "@" + this->served_hostname;
    error["type"] = "cancel";
    XmlSubNode item_not_found(error, "item-not-found");
    item_not_found["xmlns"] = STANZA_NS;
    XmlSubNode text(error, "text");
    text["xmlns"] = STANZA_NS;
    text["xml:lang"] = "en";
    text.set_inner(muc_name +
                   " is not a valid IRC channel name. A correct room jid is of the form: #<chan>%<server>@" +
                   this->served_hostname);
  }
  this->send_stanza(presence);
}

void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, const std::string& to, const std::string& who)
{
  Stanza message("message");

M src/xmpp/xmpp_component.hpp => src/xmpp/xmpp_component.hpp +0 -6
@@ 124,12 124,6 @@ public:
                      const std::string& to,
                      const bool self);
  /**
   * Send an error to indicate that the user tried to join an invalid room
   */
  void send_invalid_room_error(const std::string& muc_jid,
                               const std::string& nick,
                               const std::string& to);
  /**
   * Send the MUC topic to the user
   */
  void send_topic(const std::string& from, Xmpp::body&& xmpp_topic, const std::string& to, const std::string& who);

M tests/end_to_end/__main__.py => tests/end_to_end/__main__.py +0 -16
@@ 2696,22 2696,6 @@ if __name__ == '__main__':
                     partial(send_stanza, "<iq type='set' id='command2' from='{jid_one}/{resource_one}' to='{biboumi_host}'><command xmlns='http://jabber.org/protocol/commands' node='get-irc-connection-info' action='execute' /></iq>"),
                     partial(expect_stanza, r"/iq/commands:command/commands:note[re:test(text(), 'Connected to IRC server irc.localhost on port 6667 since \d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d \(\d+ seconds ago\)\.\n#foo from 1 resource: {resource_one}.*')]"),
                 ], conf='fixed_server'),
        Scenario("invalid_room_jid",
                 [
                     handshake_sequence(),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='invalid%{irc_server_one}/{nick_one}' />"),
                     partial(expect_stanza, ("/presence[@type='error'][@to='{jid_one}/{resource_one}'][@from='invalid%{irc_server_one}/{nick_one}']/error[@type='cancel']/stanza:item-not-found",
                                             "/presence/muc:x",
                                             "/presence/error/stanza:text")),
                 ]),
        Scenario("invalid_room_jid_fixed",
                 [
                     handshake_sequence(),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='invalid@{biboumi_host}/{nick_one}' />"),
                     partial(expect_stanza, ("/presence[@type='error'][@to='{jid_one}/{resource_one}'][@from='invalid@{biboumi_host}/{nick_one}']/error[@type='cancel']/stanza:item-not-found",
                                             "/presence/muc:x",
                                             "/presence/error/stanza:text")),
                 ], conf='fixed_server'),
        Scenario("irc_server_presence_subscription",
                  [
                      handshake_sequence(),