~singpolyma/biboumi

1d197ff26ce5a88ba851969edb3ea915759c3477 — louiz’ 8 years ago 28f1dd7
Respond to muc#traffic requests

fix #3069
M louloulibs/xmpp/xmpp_component.hpp => louloulibs/xmpp/xmpp_component.hpp +1 -0
@@ 32,6 32,7 @@
#define CLIENT_NS        "jabber:client"
#define DATAFORM_NS      "jabber:x:data"
#define RSM_NS           "http://jabber.org/protocol/rsm"
#define MUC_TRAFFIC_NS   "http://jabber.org/protocol/muc#traffic"

/**
 * An XMPP component, communicating with an XMPP server using the protocole

M src/xmpp/biboumi_component.cpp => src/xmpp/biboumi_component.cpp +26 -0
@@ 408,6 408,13 @@ void BiboumiComponent::handle_iq(const Stanza& stanza)
                    stanza_error.disable();
                }
            }
          else if (iid.type == Iid::Type::Channel)
            {
              if (node == MUC_TRAFFIC_NS)
                {
                  this->send_irc_channel_muc_traffic_info(id, from, to_str);
                }
            }
        }
      else if ((query = stanza.get_child("query", VERSION_NS)))
        {


@@ 724,6 731,25 @@ void BiboumiComponent::send_irc_server_disco_info(const std::string& id, const s
  this->send_stanza(iq);
}

void BiboumiComponent::send_irc_channel_muc_traffic_info(const std::string id, const std::string& jid_from, const std::string& jid_to)
{
  Stanza iq("iq");
  iq["type"] = "result";
  iq["id"] = id;
  iq["from"] = jid_from;
  iq["to"] = jid_to;

  XmlNode query("query");
  query["xmlns"] = DISCO_INFO_NS;
  query["node"] = MUC_TRAFFIC_NS;
  // We drop all “special” traffic (like xhtml-im, chatstates, etc), so
  // don’t include any <feature/>
  iq.add_child(std::move(iq));

  this->send_stanza(iq);

}

void BiboumiComponent::send_iq_version_request(const std::string& from,
                                            const std::string& jid_to)
{

M src/xmpp/biboumi_component.hpp => src/xmpp/biboumi_component.hpp +5 -0
@@ 66,6 66,11 @@ public:
   */
  void send_irc_server_disco_info(const std::string& id, const std::string& jid_to, const std::string& jid_from);
  /**
   * Sends the allowed namespaces in MUC message, according to
   * http://xmpp.org/extensions/xep-0045.html#impl-service-traffic
   */
   void send_irc_channel_muc_traffic_info(const std::string id, const std::string& jid_from, const std::string& jid_to);
  /**
   * Send an iq version request
   */
  void send_iq_version_request(const std::string& from,

M tests/end_to_end/__main__.py => tests/end_to_end/__main__.py +34 -1
@@ 110,6 110,8 @@ def match(stanza, xpath):
    tree = lxml.etree.parse(io.StringIO(str(stanza)))
    matched = tree.xpath(xpath, namespaces={'re': 'http://exslt.org/regular-expressions',
                                            'muc_user': 'http://jabber.org/protocol/muc#user',
                                            'disco_info': 'http://jabber.org/protocol/disco#info',
                                            'muc_traffic': 'http://jabber.org/protocol/muc#traffic',
                                            'disco_items': 'http://jabber.org/protocol/disco#items',
                                            'commands': 'http://jabber.org/protocol/commands',
                                            'dataform': 'jabber:x:data',


@@ 1463,7 1465,38 @@ if __name__ == '__main__':
                         "/iq/disco_items:query/rsm:set/rsm:last[text()='#jjj%{irc_server_one}']",
                         "/iq/disco_items:query/rsm:set/rsm:count[text()='10']"
                     )),
                ])

                     partial(log_message, "Leaving the 10 channels"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#aaa%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#bbb%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#ccc%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#ddd%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#eee%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#fff%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#ggg%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#hhh%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#iii%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(send_stanza, "<presence from='{jid_one}/{resource_one}' to='#jjj%{irc_server_one}/{nick_one}' type='unavailable' />"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']"),
                     partial(expect_stanza, "/presence[@type='unavailable']")
                ]),
                Scenario("muc_traffic_info",
                [
                     handshake_sequence(),

                     partial(send_stanza,
                             "<iq from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}' />"),
                     partial(expect_stanza, "/iq[@type='result']/disco_info:query[@node='{muc_traffic}']"),
                ]),

    )

    failures = 0