~singpolyma/biboumi

25243f53c2479e2fda0f1a05d1589c8214b70b4b — louiz’ 5 years ago 2c717d3
In fixed mode, server messages come from biboumi’s hostname directly

Instead of irc.example.com@biboumi, because that’s actually user named
“irc.example.com”, in that case.
And that fixes the raw messages in fixed mode.

fix #3286
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +5 -2
@@ 932,7 932,10 @@ void Bridge::send_xmpp_message(const std::string& from, const std::string& autho
  const auto encoding = in_encoding_for(*this, {from, this});
  for (const auto& resource: this->resources_in_server[from])
    {
      this->xmpp.send_message(from, this->make_xmpp_body(body, encoding), this->user_jid + "/" + resource, "chat", false, false);
      if (Config::get("fixed_irc_server", "").empty())
        this->xmpp.send_message(from, this->make_xmpp_body(body, encoding), this->user_jid + "/" + resource, "chat", false, false);
      else
        this->xmpp.send_message("", this->make_xmpp_body(body, encoding), this->user_jid + "/" + resource, "chat", false, false);
    }
}



@@ 947,7 950,7 @@ void Bridge::send_user_join(const std::string& hostname, const std::string& chan
      const Iid iid(chan_name, hostname, Iid::Type::Channel);
      this->send_xmpp_invitation(iid, "");
    }
    else
  else
    {
      for (const auto& resource: resources)
        this->send_user_join(hostname, chan_name, user, user_mode, self, resource);

M src/xmpp/biboumi_component.cpp => src/xmpp/biboumi_component.cpp +4 -1
@@ 281,6 281,7 @@ void BiboumiComponent::handle_message(const Stanza& stanza)
    {
      if (body && !body->get_inner().empty())
        {
          const auto fixed_irc_server = Config::get("fixed_irc_server", "");
          // a message for nick!server
          if (iid.type == Iid::Type::User && !iid.get_local().empty())
            {


@@ 296,9 297,11 @@ void BiboumiComponent::handle_message(const Stanza& stanza)
              bridge->set_preferred_from_jid(user_iid.get_local(), to_str);
            }
          else if (iid.type == Iid::Type::Server)
            bridge->send_raw_message(iid.get_server(), body->get_inner());
          else if (iid.type == Iid::Type::None && !fixed_irc_server.empty())
            { // Message sent to the server JID
              // Convert the message body into a raw IRC message
              bridge->send_raw_message(iid.get_server(), body->get_inner());
              bridge->send_raw_message(fixed_irc_server, body->get_inner());
            }
        }
    }

M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +6 -1
@@ 277,7 277,12 @@ void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, con
    if (fulljid)
      message["from"] = from;
    else
      message["from"] = from + "@" + this->served_hostname;
      {
        if (!from.empty())
          message["from"] = from + "@" + this->served_hostname;
        else
          message["from"] = this->served_hostname;
      }
    if (!type.empty())
      message["type"] = type;
    XmlSubNode body_node(message, "body");

M tests/end_to_end/__main__.py => tests/end_to_end/__main__.py +52 -25
@@ 403,10 403,14 @@ def handshake_sequence():
            partial(send_stanza, "<handshake xmlns='jabber:component:accept'/>"))


def connection_begin_sequence(irc_host, jid, expected_irc_presence=False):
def connection_begin_sequence(irc_host, jid, expected_irc_presence=False, fixed_irc_server=False):
    jid = jid.format_map(common_replacements)
    xpath    = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[text()='%s']"
    xpath_re = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[re:test(text(), '%s')]"
    if fixed_irc_server:
        xpath    = "/message[@to='" + jid + "'][@from='biboumi.localhost']/body[text()='%s']"
        xpath_re = "/message[@to='" + jid + "'][@from='biboumi.localhost']/body[re:test(text(), '%s')]"
    else:
        xpath    = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[text()='%s']"
        xpath_re = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[re:test(text(), '%s')]"
    result = (
    partial(expect_stanza,
            xpath % ('Connecting to %s:6697 (encrypted)' % irc_host)),


@@ 440,10 444,14 @@ def connection_begin_sequence(irc_host, jid, expected_irc_presence=False):

    return result

def connection_tls_begin_sequence(irc_host, jid):
def connection_tls_begin_sequence(irc_host, jid, fixed_irc_server):
    jid = jid.format_map(common_replacements)
    xpath    = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[text()='%s']"
    xpath_re = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[re:test(text(), '%s')]"
    if fixed_irc_server:
        xpath    = "/message[@to='" + jid + "'][@from='biboumi.localhost']/body[text()='%s']"
        xpath_re = "/message[@to='" + jid + "'][@from='biboumi.localhost']/body[re:test(text(), '%s')]"
    else:
        xpath    = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[text()='%s']"
        xpath_re = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[re:test(text(), '%s')]"
    irc_host = 'irc.localhost'
    return (
        partial(expect_stanza,


@@ 463,10 471,14 @@ def connection_tls_begin_sequence(irc_host, jid):
                xpath_re % (r'^%s: (\*\*\* Checking Ident|\*\*\* Looking up your hostname\.\.\.|\*\*\* Found your hostname: .*|ACK multi-prefix|\*\*\* Got Ident response)$' % irc_host)),
    )

def connection_end_sequence(irc_host, jid):
def connection_end_sequence(irc_host, jid, fixed_irc_server=False):
    jid = jid.format_map(common_replacements)
    xpath    = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[text()='%s']"
    xpath_re = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[re:test(text(), '%s')]"
    if fixed_irc_server:
        xpath    = "/message[@to='" + jid + "'][@from='biboumi.localhost']/body[text()='%s']"
        xpath_re = "/message[@to='" + jid + "'][@from='biboumi.localhost']/body[re:test(text(), '%s')]"
    else:
        xpath    = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[text()='%s']"
        xpath_re = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[re:test(text(), '%s')]"
    irc_host = 'irc.localhost'
    return (
    partial(expect_stanza,


@@ 493,23 505,26 @@ def connection_end_sequence(irc_host, jid):
            xpath_re % r'^User mode for \w+ is \[\+Z?i\]$'),
    )

def connection_middle_sequence(irc_host, jid):
    xpath_re = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[re:test(text(), '%s')]"
def connection_middle_sequence(irc_host, jid, fixed_irc_server=False):
    if fixed_irc_server:
        xpath_re = "/message[@to='" + jid + "'][@from='biboumi.localhost']/body[re:test(text(), '%s')]"
    else:
        xpath_re = "/message[@to='" + jid + "'][@from='" + irc_host + "@biboumi.localhost']/body[re:test(text(), '%s')]"
    irc_host = 'irc.localhost'
    return (
        partial(expect_stanza, xpath_re % (r'^%s: \*\*\* You are exempt from flood limits$' % irc_host)),
    )


def connection_sequence(irc_host, jid, expected_irc_presence=False):
    return connection_begin_sequence(irc_host, jid, expected_irc_presence) +\
           connection_middle_sequence(irc_host, jid) +\
           connection_end_sequence(irc_host, jid)
def connection_sequence(irc_host, jid, expected_irc_presence=False, fixed_irc_server=False):
    return connection_begin_sequence(irc_host, jid, expected_irc_presence, fixed_irc_server=fixed_irc_server) +\
           connection_middle_sequence(irc_host, jid, fixed_irc_server=fixed_irc_server) +\
           connection_end_sequence(irc_host, jid, fixed_irc_server=fixed_irc_server)

def connection_tls_sequence(irc_host, jid):
    return connection_tls_begin_sequence(irc_host, jid) + \
           connection_middle_sequence(irc_host, jid) +\
           connection_end_sequence(irc_host, jid)
def connection_tls_sequence(irc_host, jid, fixed_irc_server=False):
    return connection_tls_begin_sequence(irc_host, jid, fixed_irc_server) + \
           connection_middle_sequence(irc_host, jid, fixed_irc_server) +\
           connection_end_sequence(irc_host, jid, fixed_irc_server)


def extract_attribute(xpath, name, stanza):


@@ 824,7 839,7 @@ if __name__ == '__main__':
                     handshake_sequence(),
                     partial(send_stanza,
                     "<presence from='{jid_one}/{resource_one}' to='#zgeg@{biboumi_host}/{nick_one}' />"),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}'),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}', fixed_irc_server=True),
                     partial(expect_stanza,
                     "/message/body[text()='Mode #zgeg [+nt] by {irc_host_one}']"),
                     partial(expect_stanza,


@@ 1437,7 1452,7 @@ if __name__ == '__main__':
                     handshake_sequence(),
                     partial(send_stanza,
                             "<presence from='{jid_one}/{resource_one}' to='#foo@{biboumi_host}/{nick_one}' />"),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}'),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}', fixed_irc_server=True),
                     partial(expect_stanza,
                             "/message/body[text()='Mode #foo [+nt] by {irc_host_one}']"),
                     partial(expect_stanza,


@@ 1933,7 1948,7 @@ if __name__ == '__main__':

                     partial(send_stanza,
                             "<presence from='{jid_one}/{resource_one}' to='#foo@{biboumi_host}/{nick_one}' />"),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}'),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}', fixed_irc_server=True),
                     partial(expect_stanza,
                             "/message/body[text()='Mode #foo [+nt] by {irc_host_one}']"),
                     partial(expect_stanza,


@@ 2011,7 2026,7 @@ if __name__ == '__main__':
                     # First user join
                     partial(send_stanza,
                             "<presence from='{jid_one}/{resource_one}' to='#foo@{biboumi_host}/{nick_one}' />"),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}'),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}', fixed_irc_server=True),
                     partial(expect_stanza,
                             "/message/body[text()='Mode #foo [+nt] by {irc_host_one}']"),
                     partial(expect_stanza,


@@ 2402,6 2417,18 @@ if __name__ == '__main__':
                     partial(send_stanza, "<message from='{jid_one}/{resource_one}' to='{irc_server_one}' type='chat'><body>WHOIS {nick_one}</body></message>"),
                     partial(expect_stanza, "/message[@from='{irc_server_one}'][@type='chat']/body[text()='irc.localhost: {nick_one} ~{nick_one} localhost * {nick_one}']"),
                ]),
                Scenario("raw_message_fixed_irc_server",
                [
                     handshake_sequence(),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}/{nick_one}' />"),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}', fixed_irc_server=True),
                     partial(expect_stanza, "/message"),
                     partial(expect_stanza, "/presence"),
                     partial(expect_stanza, "/message"),

                     partial(send_stanza, "<message from='{jid_one}/{resource_one}' to='{biboumi_host}' type='chat'><body>WHOIS {nick_one}</body></message>"),
                     partial(expect_stanza, "/message[@from='{biboumi_host}'][@type='chat']/body[text()='irc.localhost: {nick_one} ~{nick_one} localhost * {nick_one}']"),
                ], conf='fixed_server'),
                Scenario("self_disco_info",
                [
                     handshake_sequence(),


@@ 2752,7 2779,7 @@ if __name__ == '__main__':

                     partial(send_stanza,
                             "<presence from='{jid_one}/{resource_one}' to='#foo@{biboumi_host}/{nick_one}' />"),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}'),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}', fixed_irc_server=True),
                     partial(expect_stanza, "/message"),
                     partial(expect_stanza, "/presence"),
                     partial(expect_stanza, "/message"),


@@ 2827,7 2854,7 @@ if __name__ == '__main__':
                             "<presence from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}/{nick_one}' />"),

                     # We must receive the IRC server presence, in the connection sequence
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}', True),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}', expected_irc_presence=True),
                     partial(expect_stanza,
                             "/message/body[text()='Mode #foo [+nt] by {irc_host_one}']"),
                     partial(expect_stanza,