~singpolyma/biboumi

6ebb586b6ce097d5768e3863411042f4dc6c979e — Florent Le Coz 8 years ago 98ef49e
Respond to a disco query the gateway jid itself
2 files changed, 44 insertions(+), 0 deletions(-)

M src/xmpp/xmpp_component.cpp
M src/xmpp/xmpp_component.hpp
M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +40 -0
@@ 416,6 416,17 @@ void XmppComponent::handle_iq(const Stanza& stanza)
            }
        }
    }
  else if (type == "get")
    {
      XmlNode* query;
      if ((query = stanza.get_child(DISCO_INFO_NS":query")))
        { // Disco info
          if (to_str == this->served_hostname)
            { // On the gateway itself
              this->send_self_disco_info(id, from);
            }
        }
    }
  else
    {
      error_type = "cancel";


@@ 735,3 746,32 @@ void XmppComponent::send_affiliation_role_change(const std::string& muc_name,
  presence.close();
  this->send_stanza(presence);
}

void XmppComponent::send_self_disco_info(const std::string& id, const std::string& jid_to)
{
  Stanza iq("iq");
  iq["type"] = "result";
  iq["id"] = id;
  iq["to"] = jid_to;
  iq["from"] = this->served_hostname;
  XmlNode query("query");
  query["xmlns"] = DISCO_INFO_NS;
  XmlNode identity("identity");
  identity["category"] = "conference";
  identity["type"] = "irc";
  identity["name"] = "Biboumi XMPP-IRC gateway";
  identity.close();
  query.add_child(std::move(identity));
  for (const std::string& ns: {"http://jabber.org/protocol/disco#info",
                                    "http://jabber.org/protocol/muc"})
    {
      XmlNode feature("feature");
      feature["var"] = ns;
      feature.close();
      query.add_child(std::move(feature));
    }
  query.close();
  iq.add_child(std::move(query));
  iq.close();
  this->send_stanza(iq);
}

M src/xmpp/xmpp_component.hpp => src/xmpp/xmpp_component.hpp +4 -0
@@ 145,6 145,10 @@ public:
                                    const std::string& role,
                                    const std::string& jid_to);
  /**
   * Send a result IQ with the gateway disco informations.
   */
  void send_self_disco_info(const std::string& id, const std::string& jid_to);
  /**
   * Handle the various stanza types
   */
  void handle_handshake(const Stanza& stanza);